我正在为我的Unity游戏创建一个消息系统。我有一个脚本,TouchPlayer
附加到玩家可以与之交互的对象上。然后,我可以在编辑器中为每个对象实例编辑MyTextArea
字段。
它的表现和我预期的不完全一样。例如:
如果我有两个对象使用此脚本,我可以触发与其中一个对象的碰撞,按X,然后显示消息。我离开碰撞区域,转到另一个对象,另一个对象的消息已经显示(没有提示,按X
)。为什么会这样?
public class TouchPlayer : MonoBehaviour {
[TextArea] public string MyTextArea;
[SerializeField] GameObject Player;
[SerializeField] GameObject UIMessageBoxGroup;
[SerializeField] GameObject MessageBox;
public TMP_Text messageTextBox;
bool showMessage = false;
bool collided = false;
void Start() {
UIMessageBoxGroup.SetActive(false);
}
void Update() {
if (Input.GetKey(KeyCode.X)) {
showMessage = true;
}
if (collided) {
if (showMessage) {
messageTextBox.text = MyTextArea;
} else {
messageTextBox.text = "PRESS X";
}
}
transform.LookAt(Player.transform.position);
transform.Rotate(0, -90, 0);
}
void OnTriggerEnter(Collider other) {
if (other.gameObject.CompareTag("Player")) {
collided = true;
UIMessageBoxGroup.SetActive(true);
}
}
void OnTriggerExit(Collider other) {
if (other.gameObject.CompareTag("Player")) {
collided = false;
showMessage = false;
UIMessageBoxGroup.SetActive(false);
}
}
}
我认为问题在于您正在设置collide=false。
void OnTriggerExit(Collider other) {
if (other.gameObject.CompareTag("Player")) {
collided = false;
showMessage = false;
UIMessageBoxGroup.SetActive(false);
}
}
因此,MessageTextBox.text="PRESS X";
将永远无法到达,因此您无法实现您所追求的默认状态。
if (collided) { //this will be false
if (showMessage) {
messageTextBox.text = MyTextArea;
} else {
messageTextBox.text = "PRESS X";
}
}
因此,您需要重置OntriggerExit
中的状态:
void OnTriggerExit(Collider other) {
if (other.gameObject.CompareTag("Player")) {
collided = false;
showMessage = false;
UIMessageBoxGroup.SetActive(false);
messageTextBox.text = "PRESS X"; //set the default state
}
}
或者将碰撞条件合并到您的更新中,以便碰撞时更新的状态为false:
if (showMessage && collided) {
messageTextBox.text = MyTextArea;
} else {
messageTextBox.text = "PRESS X";
}
如果我添加showMessage=false
到OnTriggerEnter()
,它可以工作。
我假设在初始化变量时它已经是false(boolshowmessage=false;
),但显然不是。。。?