在 Unity 中,C# 与 JS(UnityScript)之间有两种常见的通信方式。
方式一:挂载在同一游戏对象上
如果两个脚本绑定在同一个游戏对象上,可以使用 GameObject.SendMessage 进行通信。效率更高的做法是通过 GetComponent 直接获取组件引用。
C#:
public void OnRecv()
{
print("C# Recv");
}
JS:
function Start () {
gameObject.SendMessage("OnRecv");
}
function OnRecv()
{
Debug.Log("js recv");
}
方式二:C# 不继承 MonoBehaviour 时
如果 C# 类没有继承自 MonoBehaviour,则需要将 C# 代码放置到 Plugins 文件夹下。Plugins 是类似于 Resources 的特殊文件夹,其中的脚本会优先编译执行。一些需要优先编译的功能可以放置在这里,例如原生 Android 接口生成的 jar 包等。
JS:
var x:Out;
function Start () {
x=new Out();
x.OnRecv();
}
C#:
using UnityEngine;
using System.Collections;
public class Out
{
public void OnRecv()
{
Debug.Log("C# Recv");
}
}
GameObject Wapper SRC Code
以下是 GameObject 中 SendMessage 方法的源码片段:
[ExcludeFromDocs]
public void SendMessage(string methodName)
{
SendMessageOptions options;
object obj2;
options = 0;
obj2 = null;
this.SendMessage(methodName, obj2, options);
return;
}
[ExcludeFromDocs]
public void SendMessage(string methodName, object value)
{
SendMessageOptions options;
options = 0;
this.SendMessage(methodName, value, options);
return;
}
public void SendMessage(string methodName, SendMessageOptions options)
{
this.SendMessage(methodName, null, options);
return;
}
[MethodImpl(MethodImplOptions.InternalCall), WrapperlessIcall]
public extern void SendMessage(string methodName, [DefaultValue("null")] object value, [DefaultValue("SendMessageOptions.RequireReceiver")] SendMessageOptions options);