Unity仅在一个对象上工作

时间:2016-04-15 17:07:08

标签: unity3d unity5

我有问题,当我的场景中有多个门时,只有当我靠近其中一扇门时才会出现文字。我真的不知道问题在哪里,因为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;
    }
}

坦克你。

1 个答案:

答案 0 :(得分:0)

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

如果问题不是,那么可能导致问题的另一个区域是

            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语句将为true并显示文本,然后当您离开第一扇门时,代码将转到else并将文本设置为NULL。然后当你走到第二扇门时,新门将尝试将文本设置为正确的字符串,但第一个门代码将覆盖它并将文本设置为NULL。

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