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;
}
感谢大家的评论,这对我调试很有帮助。
我有包含脚本组件的对象。
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;
}
感谢大家的评论,这对我调试很有帮助。