提问者:小点点

Unity脚本属性-每个实例唯一?


我正在为我的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);
      }
    }

}

共2个答案

匿名用户

我认为问题在于您正在设置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=falseOnTriggerEnter(),它可以工作。

我假设在初始化变量时它已经是false(boolshowmessage=false;),但显然不是。。。?