在 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

以下是 GameObjectSendMessage 方法的源码片段:

     [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);