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

Unity3D: Script variables inconsistences using OnTriggerEnter2D

我有包含脚本组件的对象。

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() return 我存储的变量。

但现在如果我在 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() return null(或我在 TeleportReference class 的 Start() 期间使用的其他变量)。 所有其他测试输出保持不变。

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

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

例如,尝试对 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;
    }

感谢大家的评论,这对我调试很有帮助。