【发布时间】:2011-10-13 14:12:35
【问题描述】:
我决定在我的项目中实现一个简单的消息传递系统。我正在使用这个: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
//...
}
}
谢谢!
【问题讨论】:
-
Destroy(hit.gameObject);是否设置了对 null 的引用,但不会从某个列表中删除所述引用? (也许是听众名单) -
我不确定您是否发布了足够的代码来说明问题。有什么方法可以让我们看到更多代码?与公共“snakeBlocks”字段一起使用的代码可能会有所帮助。