我正在為我的 Unity 游戲創建一個訊息系統。我有這個腳本,TouchPlayer附加到玩家可以與之互動的物件。然后我可以MyTextArea在編輯器中為每個物件實體編輯欄位。
它的表現并不完全符合我的預期。例如:
如果我有 2 個帶有此腳本的物件,我可以觸發其中一個的碰撞,按 X,然后顯示訊息。我離開碰撞區,轉到另一個物件,并且另一個物件的訊息已經顯示(沒有提示,PRESS 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);
}
}
}
uj5u.com熱心網友回復:
那么在Update你做的每一個實體上
if (Input.GetKey(KeyCode.X))
{
showMessage = true;
}
這是同時為所有實體完成的!;)
=> 即使對于您從未與永遠showMessage保持碰撞的所有情況true。因此,一旦您與其中一個發生碰撞,您就會立即處理if(showMessage)此案。
只要您還沒有發生碰撞,您就會希望確保根本沒有處理輸入:
void Update()
{
// If not collided do absolutely nothing
if(!collided) return;
if (Input.GetKey(KeyCode.X))
{
showMessage = true;
}
messageTextBox.text = showMessage? MyTextArea : "PRESS X";
transform.LookAt(Player.transform.position);
transform.Rotate(0, -90, 0);
}
uj5u.com熱心網友回復:
我認為問題在于您正在設定collided = 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
}
}
或者將碰撞條件合并到您的更新中,以便在碰撞為假時更新狀態:
if (showMessage && collided) {
messageTextBox.text = MyTextArea;
} else {
messageTextBox.text = "PRESS X";
}
uj5u.com熱心網友回復:
如果我添加showMessage = false;到OnTriggerEnter(),它會起作用。
我認為當變數初始化時它已經是假的(bool showMessage = false;),但顯然不是......?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386431.html
