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