gpt4 book ai didi

c# - MessagingSystem 导致 NullReferenceException

转载 作者:太空狗 更新时间:2023-10-30 01:09:05 26 4
gpt4 key购买 nike

我决定在我的项目中实现一个简单的消息传递系统。我正在使用这个:CSharpMessenger Extended (它是用静态方法实现的)。

很奇怪,当我直接调用一个方法时,一切都正常工作。但是当我使用消息系统广播消息时,我在某些游戏对象上收到 NullReferenceException。令我惊讶的是,添加行 if (_gameObject == null) return; 解决了问题。但是,在我遇到此异常的每个地方添加对象是否为 null 的检查不是一个选项。

可能是什么问题?

这是我用于广播消息的代码:

public class Head : MonoBehaviour {

public Snake snake;

void OnControllerColliderHit (ControllerColliderHit hit)
{
if ( hit.gameObject.GetComponent<Terrain>() )
return;

//This way everything was working without any surprises.
//snake.PropCollected( hit.gameObject.GetComponent<Prop>() );
//Using messaging system instead
if ( hit.gameObject.GetComponent<Prop>() )
Messenger<Prop>.Broadcast( "prop collected", hit.gameObject.GetComponent<Prop>() );
Destroy(hit.gameObject);

}
}

以下是我订阅事件和响应事件的方式:

public class Snake : MonoBehaviour {

public GameObject headBlock;

public GameObject snakeBlocks;

int lastSnakeBlockId;

private GameObject FindBlockWithId( int _id )
{
if (!snakeBlocks) return null; //This line somehow solves the problem; However the object is 100% assigned in the editor.

foreach (Transform child in snakeBlocks.transform) {
if (child.gameObject.GetComponent<SnakeBlockScript>().blockId == _id)
{
return child.gameObject;
}
}

return headBlock;
}

void Awake()
{
//Set up message listeners
Messenger<Prop>.AddListener("prop collected", AddBlock);
}

public void AddBlock(Prop _prop)
{
GameObject lastBlock = FindBlockWithId(lastSnakeBlockId - 1);
if (!lastBlock) return;

//Some more code
//...
}
}

谢谢!

最佳答案

听起来您遇到了这样一种情况,即“snakeBlocks”在应用程序的其他地方重新初始化,并且在该引用被设置为其他内容的过程中,该线程偶尔会命中。

类似的东西:

snakeBlocks = null;

//Do some stuff.

snakeBlocks = someNewInstanceOfGameObject;

只是一个想法。

关于c# - MessagingSystem 导致 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7755463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com