【问题标题】:Why only from the second door the door close ? The first one stay opened为什么只能从第二道门关上?第一个保持打开
【发布时间】:2023-04-08 09:35:01
【问题描述】:

第一个脚本和第二个脚本都附在门上。 在这种情况下,我有 12 扇门。 无论 12 个玩家控制器或 NPC 中的第一扇门是什么,它都会打开但保持打开状态。玩家控制器或 NPC 将进入的隔壁将打开,然后也将关闭,然后所有的门。

但每次第一扇门都不会关闭。每次运行游戏时,它只能从第二扇门工作。

在这个脚本 HoriDoorManager 上,我使用公共静态标志 exitedDoor 并在 OnTriggerExit 内将其设置为 true:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class HoriDoorManager : MonoBehaviour
{
    public static bool exitedDoor = false;

    private bool doorLockState;
    private List<DoorHori> doors = new List<DoorHori>();

    private void Start()
    {
        if (transform.parent != null)
        {
            Transform parent = transform.parent;
            var children = parent.GetComponentsInChildren<Transform>();

            if(children != null)
            {
                foreach (Transform door in children)
                {
                    if (door.name == "Door_Left" || door.name == "Door_Right")
                        doors.Add(door.GetComponent<DoorHori>());
                }
            }
        }
    }

    void OnTriggerEnter()
    {
        if (doorLockState == false)
        {
            if (doors != null)
            {
               for(int i =0; i < doors.Count; i++)
                {
                    doors[i].OpenDoor();
                }
            }
        }
    }

    private void OnTriggerExit(Collider collide)
    {
        if (doorLockState == false)
        {
            exitedDoor = true;
        }
    }

    public void ChangeLockState(bool lockState)
    {
        doorLockState = lockState;
    }
}

在第二个脚本中,我正在检查标志 exitedDoor 是否为真,然后开始关门:在 WaitToClose 方法内部:

using UnityEngine;
using System.Collections;

public class DoorHori : MonoBehaviour
{

    public float translateValue;
    public float easeTime;
    public OTween.EaseType ease;
    public float waitTime;

    private Vector3 StartlocalPos;
    private Vector3 endlocalPos;

    private void Start()
    {
        StartlocalPos = transform.localPosition;
        gameObject.isStatic = false;
    }

    public void OpenDoor()
    {
        OTween.ValueTo(gameObject, ease, 0.0f, -translateValue, easeTime, 0.0f, "StartOpen", "UpdateOpenDoor", "EndOpen");
        GetComponent<AudioSource>().Play();
    }

    private void UpdateOpenDoor(float f)
    {
        Vector3 pos = transform.TransformDirection(new Vector3(1, 0, 0));
        transform.localPosition = StartlocalPos + pos * f;

    }

    private void UpdateCloseDoor(float f)
    {
        Vector3 pos = transform.TransformDirection(new Vector3(-f, 0, 0));

        transform.localPosition = endlocalPos - pos;

    }

    private void EndOpen()
    {
        endlocalPos = transform.localPosition;
        StartCoroutine(WaitToClose());
    }

    private IEnumerator WaitToClose()
    {
        if (HoriDoorManager.exitedDoor == true)
        {
            yield return new WaitForSeconds(waitTime);
            OTween.ValueTo(gameObject, ease, 0.0f, translateValue, easeTime, 0.0f, "StartClose", "UpdateCloseDoor", "EndClose");
            GetComponent<AudioSource>().Play();
        }
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    尝试在您的第一个脚本中将 OnTriggerEnter 更改为此。

    private void OnTriggerEnter(Collider collide){
        if (doorLockState == false)
        {
            if (doors != null)
            {
               for(int i =0; i < doors.Count; i++)
                {
                    doors[i].OpenDoor();
                }
            }
        }
    }
    

    当你删除方法的参数时,你没有使用unity定义的方法,所以它不再引用同一个OnTriggerEnter。

    它还可以用于检查触发 on enter 标志的原因,因为我假设您不希望任何冲突触发此逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2023-03-12
      相关资源
      最近更新 更多