Unity3D:使用 OnTriggerEnter2D 编写变量不一致的脚本

本文关键字:变量 不一致 脚本 使用 OnTriggerEnter2D Unity3D | 更新日期: 2023-09-27 18:31:58

我有一个具有脚本组件的对象。

public class TeleportReference : MonoBehaviour {
    private GameObject reference;
    void Start () {
        reference = null;
    }
    public void SetReference(GameObject other){
        reference = other;
    }
    public GameObject GetReference(){
        return reference;
    }

现在,如果我搜索一个对象并测试脚本变量

GameObject test = GameObject.FindGameObjectWithTag("Water");
print(test);
print(test.GetComponent<TeleportReference>());
print(test.GetComponent<TeleportReference>().GetReference());

它工作得很好,GetReference() 返回我存储的变量。

但是现在如果我使用它,OnTriggerEnter2D

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.tag == "Water")
    {
        print(other);
        print(other.gameObject);
        print(other.GetComponent<TeleportReference>());
        print(other.GetComponent<TeleportReference>().GetReference());
    }
}

GetReference() 返回 null(或我在 TeleportReference 类的 Start() 期间使用的其他变量)。所有其他测试输出保持不变。

谁能给出一个提示,为什么会发生这种情况?这是否意味着 GetComponent 在第二种情况下创建了 TeleportReference 的新实例?

Unity3D:使用 OnTriggerEnter2D 编写变量不一致的脚本

在第二种情况下,GetComponent 没有创建 TeleportReference 的新实例。我的一个项目中有类似的代码,我没有遇到任何问题。因此,在这种情况下,我会看看问题是否出在其他地方。你确定它是同一个"水"对象吗?您是否有多个带有"水"标签的对象?在分配引用之前是否发生冲突?可能会有无数的事情发生。只需测试以缩小范围。

例如,尝试对 other.gameObject 对象执行操作以验证它是否正确,例如停用它。也可以尝试使用other.gameObject.GetComponent(不确定这是否有区别)。

发现问题。这是按照分配变量的顺序。也就是说 - 在调用 Start() 函数之前进行了明显的更改。因此,在代码的某个点,存储的值被过度修改回 null。

这工作正常:

public class TeleportReference : MonoBehaviour {
    private GameObject reference;
    void Awake () {
        reference = null;
    }
    public void SetReference(GameObject other){
        reference = other;
    }
    public GameObject GetReference(){
        return reference;
    }

感谢大家的评论,这真的帮助了我调试。