xLua Lua访问C#注意事项(七)

  • 调用成员方法
    注意:调用成员方法,第一个参数需要传该对象,建议用冒号语法
Lua 复制代码
loacl camera =  CS.UnityEngine.GameObject.Find("Main Camera")
--冒号语法
camera:GetComponent("Camera")
--点语法
camera.GetComponent(camera,"Camrea")
  • xlua支持子类访问父类的静态属性、静态方法
  • xlua支持子类实例访问父类的成员属性、成员方法
  • lua支持多个返回值,C#只有一个返回值,但是C#支持传递多个out、ref参数,在C#中可以使用ref和out来接受lua的多返回值
Lua 复制代码
--[Lua--]
function luaAction(a,b,c)
	return a,a+b,c
end

--[C#]
[CSharpCallLua]
delegate int CSAction(int a, int b, ref int resa, out int resb);


  var testAction = luaEnv.Global.Get<CSAction>("luaAction");
        int resa = 100;
        int resb;
        int value= testAction (45,67,ref resa, out resb);
        print(value);
        print(resa);
        print(resb);
        testAction = null;
  • xlua支持方法重载,直接通过不同的参数类型访问
Lua 复制代码
test:TestAction()
test:TestAciton(1)
test:TestAction("a")
  • xlua调用C#方法时,如果C#方法的形参中带有默认值,不传值时,会按默认值传递

  • 扩展方法,C#中定义了扩展方法,lua中可以直接使用

  • lua不支持泛型方法,建议在C#中封装后使用

  • xlua调用C#的枚举,需要在C#定义枚举时,加上CSharpCallLua特性

    //C#
    [CSharpCallLua]
    public enum TestEnum
    {
    One,
    Two,
    Three
    }
    --lua
    CS.TestEnum.One

  • xlua调用C#委托与调用C#的方法没有区别

    //C#
    [CSharpCallLua]
    public delegate void TestDelegate();

    public TestDelegate testDelegate;

    luaEnv = new LuaEnv();
    luaEnv.DoString("require 'TestLua'");//使用内置loder加载lua源文件
    testDelegate = luaEnv.Global.Get("luaAction");
    testDelegate?.Invoke();

    --lua
    function luaAction()
    print("委托")
    end

  • xlua调用C#event并添加事件

    //C#
    [CSharpCallLua]
    public delegate void TestEvent();

    public event TestEvent testEvent;

    luaEnv = new LuaEnv();
    luaEnv.DoString("require 'TestLua'");//使用内置loder加载lua源文件
    testEvent?.Invoke();
    luaEnv.Dispose();

    --lua
    function luaAction()
    print("事件")
    end

    local GameObject = CS.UnityEngine.GameObject
    local obj = GameObject.Find("GameObject")
    local manager = obj:GetComponent("Manager")
    manager:testEvent('+',luaAction)

  • xlua获取C#类型

    typeof(CS.UnityEngine.GameObject)

相关推荐
聪慧的水蜜桃4 小时前
【YFIOs】用C#开发硬件之设备上云
开发语言·c#
plainGeekDev7 小时前
依赖管理 → Version Catalog
android·java·kotlin
韩曙亮8 小时前
【Flutter】Flutter 进程保活 ③ ( 屏幕常亮设置 | Flutter 禁止息屏、关闭自动锁屏、屏蔽系统屏保 )
android·flutter·ios·屏幕常亮·禁止息屏
hixiong1239 小时前
TensorRT转换工具分享
人工智能·计算机视觉·ai·c#
爱笑鱼9 小时前
NDK、SDK、APP、Framework、Native 到底怎么区分?
android
私人珍藏库9 小时前
[Android] 发票制作器-内置多行业专业模板
android·人工智能·app·软件·多功能
阿pin10 小时前
Android随笔-PMS
android·pms
莫生灬灬11 小时前
DY联系人聊天Web面板支持获取联系人/聊天记录/发送消息
前端·chrome·websocket·c#
耀耀_很无聊11 小时前
12_Redis Lua 脚本踩坑:为什么 tonumber(ARGV[x]) 会得到 nil?
java·redis·lua
悲凉的紫菜11 小时前
dariy
android·ide·android studio