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 的新实例?
在第二种情况下,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;
}
感谢大家的评论,这真的帮助了我调试。