Unity 只作用于一个对象

Unity only working at one object

我有一个问题,当我的场景中有不止一扇门时,只有当我靠近其中一扇门时才会出现文字。我真的不知道问题出在哪里,因为 Unity 不会抛出任何异常。这是我的代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Door : MonoBehaviour {
    public GameObject doorBody;
    Transform player;
    private AudioSource doorSound;
    public float doorOpenAngle = 90.0f;
    public float doorCloseAngle = 0.0f;
    public float doorAnimSpeed = 2.0f;
    private Quaternion doorOpen = Quaternion.identity;
    private Quaternion doorClose = Quaternion.identity;
    private Transform playerTrans = null;
    public bool doorStatus = false; //false = close, true = open
    private bool doorGo = false;
    public Text text;

    void Start()
    {
        doorStatus = false; //door is open
        doorSound = GetComponent<AudioSource>();
        doorOpen = Quaternion.Euler(0, doorOpenAngle, 0);
        doorClose = Quaternion.Euler(0, doorCloseAngle, 0);
        playerTrans = GameObject.FindWithTag("Player").transform;
        text.text = "";
    }
    void Update()
    {
            if (Vector3.Distance(playerTrans.position, this.transform.position) < 2f)
            {
            text.text = "Press 'E' to use";
            if (Input.GetKeyDown(KeyCode.E) && !doorGo)
                {
                    doorBody.GetComponent<BoxCollider>().enabled = false;
                    doorSound.mute = false;
                    if (doorStatus)
                    { //close door
                        StartCoroutine(this.moveDoor(doorClose));
                        doorSound.Play();
                    }
                    else { //open door
                        StartCoroutine(this.moveDoor(doorOpen));
                        doorSound.Play();
                    }
                }
            }
            else
            {
            text.text = "";
        }
    }

    public IEnumerator moveDoor(Quaternion dest)
    {
        doorGo = true;
        while (Quaternion.Angle(transform.localRotation, dest) > 4.0f)
        {
            transform.localRotation = Quaternion.Slerp(transform.localRotation, dest, Time.deltaTime * doorAnimSpeed);
            yield return null;
        }
        //Change door status
        doorBody.GetComponent<BoxCollider>().enabled = true;
        doorStatus = !doorStatus;
        doorGo = false;
        yield return null;
    }
}

坦克你。

我认为问题在于您只将脚本附加到其中一个门对象。检查您是否已将脚本附加到两扇门。

如果问题不在于此,则可能导致问题的其他方面是

            if (Vector3.Distance(playerTrans.position, this.transform.position) < 2f)
            {
            text.text = "Press 'E' to use";
            if (Input.GetKeyDown(KeyCode.E) && !doorGo)
                {
                    doorBody.GetComponent<BoxCollider>().enabled = false;
                    doorSound.mute = false;
                    if (doorStatus)
                    { //close door
                        StartCoroutine(this.moveDoor(doorClose));
                        doorSound.Play();
                    }
                    else { //open door
                        StartCoroutine(this.moveDoor(doorOpen));
                        doorSound.Play();
                    }
                }
            }
            else
            {
            text.text = "";

else 部分可能导致文本在您不希望的情况下被设置为 NULL。例如,如果您走到两扇门中的一扇,那扇门的 if 语句将为真并显示文本,然后当您离开第一扇门时,代码将转到 else 并将文本设置为 NULL。然后,当您走到第二扇门时,新门将尝试将文本设置为正确的字符串,但第一扇门密码将覆盖它并将文本设置为 NULL。

如果这是问题所在,那么最好的解决方案很可能是将门接近检测代码切换到播放器。这样一来,每扇门就不会不断检查每次更新以查看玩家是否在范围内,玩家本身将简单地检查是否有任何门在范围内。