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