我有问题,当我的场景中有多个门时,只有当我靠近其中一扇门时才会出现文字。我真的不知道问题在哪里,因为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;
}
}
坦克你。
答案 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。
如果这是问题,那么最好的解决方案很可能是将门接近检测代码切换到播放器。这样,不是每个门都不断检查每次更新以查看玩家是否在范围内,玩家本身只会检查是否有任何门在范围内。