unity c# SendMessage
SendMessage
GameObject.SendMessage(“函数名”, 参数,SendMessageOptions);
参数
函数名:你所调用函数的名字(不能打错)
参数:在发送信息的时候可以添加参数发送过去,因为调用的函数有参数,所以你也要传参。当人,若调用函数无参,可直接省略。
SendMessageOptions:只要有两两点。
- SendMessageOptions.RequireReceiver该模式是默认的,所以用SendMessage函数时可以只有一个函数名参数也可以。这个SendMessageOptions.RequireReceiver作用是当你调用的函数找不到的时候会报错,提醒你没有东西可以接收发的信息。
- SendMessageOptions.DontRequireReceiver,该模式作用是允许没有接收信息的存在,不让代码报错。
作用
SendMessage是一个游戏物体的一个api,作用是发送信息从而调用你想调用的函数。主要是在别的脚本中调用另一个脚本中的方法。但是首先获得带有该方法脚本的物体。
例子:
我创建的场景有些问题,在2d项目中创建两个3dCube。但是没什么问题,大家理解就好。
接下来分别为cube1和cube2添加脚本。
Cube1Send添加到Cube1,Cube2Get添加到Cube2;
Cube1Send代码如下:
public class cube1Send : MonoBehaviour
{
private GameObject receiveCube;
void Start()
{
receiveCube = GameObject.Find("Cube2");
}
void OnMouseDown()
{
if (this.gameObject)
{
string str = "Cube1被点击了";
receiveCube.SendMessage("GetMessage",str);
}
}
}
Cube2Get代码如下:
public class Cube2Get : MonoBehaviour
{
void GetMessage(string n)
{
Debug.Log("接收信息:" +n);
}
}
运行Unity,当点击Cube1会发生:
上述代码中只有获取到调用函数的Cube2才可以调用,这是首要条件。
若是不获取,直接用自身Cube1能不能发送信息调用GetMessage发放呢?
这是用自身调用来调用别的物体的脚方法:
这样就会进行报错,不可这样来调试。
没有参数会怎么样?
发送信息传参,但是调用的函数无参会怎样?
这样也会报错,没有相应接收者,所以调用函数传不传参,传什么样的参数应该和调用函数参数一致。
SendMessageOptions
SendMessageOptions.DontRequireReceiver
SendMessage默认是SendMessageOptions.RequireReceiver,上述例子都是那个样子,所以就不用再阐述一二,因为当有问题的时候会直接给你报错。
当用SendMessageOptions.DontRequireReceiver时:
Cube2Get的GetMessage依旧无参。
当点击Cube1时会发现依旧可以运行不报错,并且可以调用GetMessage函数。
当GetMessage函数参数是int类型时运行:
参数不一致但是会进行报错,说参数不匹配。
当GetMessage函数时重载:
这样的话就会自动匹配相应的函数方法,不会调用int的GetMessage。
调用的访问级别
不知道大家有没有仔细发掘我调用的GetMessage函数访问权限。
我写的GetMessage都是 private权限的,而不是public,所以,SendMessage调用函数方法可以调用任意权限的函数方法!!