我在学习Unity项目开发的时候,用到的SendMessage往往会出现以下错误。
就是:SendMessage has no receiver!
**首先我们先明白错误的发生原因:**顾名思义是所发送的消息没有接收者,类比为假设你所定义的某个物体A,但A触发某个事件时,需要调用到物体B中所拥有的方法,你需要先找到B,然后再去SendMessage,如下:
这里是会报错的例子。
if(collision.tag == "Player" || collision.tag == "enemy")
{
collision.SendMessage("hitByCrusher");
}
这里是用GameObject.Find().SendMessage的例子
if(collision.tag == "enemy")
{
GameObject.Find("Enemy").SendMessage("hitByCrusher");
}
if(collision.tag == "Player")
{
GameObject.Find("Player").SendMessage("hitByCrusher");
}
以下是第二种解决方法,就是使用SendMessageOptions.DontRequireReceiver
不要求必须有接收对象。没有对象收到消息也没关系
我们先来了解一下关于SendMessage、SendMessageUpwards、以及BroadcastMessage的使用场景以及用法。
**SendMessage:**会向该游戏对象上的所有Monobehavior脚本发送消息,发送的内容便是:
SendMessage(“函数名”,参数,是否必须有接收方法)。
1.第一个参数(函数名)指的就是所要传递的消息的名称, 游戏对象所有Monobehavior脚本里与该名称同名的方法将被调用。
2.第二个参数指的是方法所需要传递的参数,可以为null
3.第三个参数指的是是否必须有接收方法,SendMessageOptions.RequireReceiver必须有接收方法。
SendMessageOptions.DontRequireReceiver不要求必须有接收方法。
代码如下:
if(collision.tag == "Player" || collision.tag == "enemy")
{
collision.SendMessage("hitByCrusher",null,
SendMessageOptions.DontRequireReceiver);
}
**SendMessageUpwards:**会向该游戏对象以及父游戏对象上的所有Monobehavior脚本发送消息。归纳为向上发送。用法与上面类似。
**BroadcastMessage:**会向该游戏对象以及子游戏对象上的所有Monobehavior脚本发送消息。归纳为向下发送。用法与上上面类似。