调用事件
CallCSEvent.lua.txt
    local callEvent = CS.UnityEngine.Object.FindObjectOfType(typeof(CS.shenjun.CallEvent))
    -- 注册静态方法
    callEvent:onClick('+', CS.shenjun.CallEvent.StaticTest)
    callEvent:onValueChanged('+', CS.shenjun.CallEvent.StaticTest)
    -- 取消注册的静态方法
    callEvent:onClick('-', CS.shenjun.CallEvent.StaticTest)
    callEvent:onValueChanged('-', CS.shenjun.CallEvent.StaticTest)
    -- 注册一个实例方法 错误
    -- callEvent:onClick('+', callEvent.Test)
    function test1()
        print('lua no param')
    end
    function test2(n)
        print('lua have param :', n)
    end
    -- 注册lua方法
    callEvent:onClick('+', test1)
    callEvent:onValueChanged('+', test2)
    -- 调用事件执行
    callEvent:Invoke(10)
CallCSEvent.cs
    /*
     *  created by shenjun
     */
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using XLua;
    namespace shenjun
    {
        public class CallEvent : MonoBehaviour {
            public event System.Action onClick;
            [CSharpCallLua]
            public delegate void Del(int n);
            public event Del onValueChanged;
            void Start () {
                LuaEnv luaEnv = new LuaEnv();
                luaEnv.DoString("require 'CallCSEvent'");
                onClick = null;
                onValueChanged = null;
                luaEnv.Dispose();
            }
            void Update () {
            }
            public void Test()
            {
                Debug.Log("CS Func");
            }
            public static void StaticTest(int value = 0)
            {
                Debug.Log("CS Static Func :" + value);
            }
            public void Invoke(int value = 0)
            {
                if(onClick != null)
                {
                    onClick.Invoke();
                }
                if(onValueChanged != null)
                {
                    onValueChanged(value);
                }
            }
        }
    }
🔚