Skip to content

Lua Register

woctordho edited this page Apr 25, 2024 · 3 revisions

Lua接口注册

要把C#接口绑定到Lua,以DialogueBoxController为例:

  1. 把代码放在Assets/Nova/Sources/文件夹下,并且把class(或者struct、enum)写在namespace Nova中
    • TODO:支持绑定其他namespace下的代码
  2. 在class上面加上[ExportCustomType] attribute
    • 实现详见CustomSettings.customTypeList
  3. 在Unity Editor的上面的菜单中运行Lua -> Clear Wrap Files,然后按提示重新生成Lua接口
    • 这个class中所有public的constant、field、property和method都会生成对应的Lua接口
    • 如果某个field、property或method的输入或输出的类型不是C#内置的类型,也不是自定义的标了[ExportCustomType]的类型,而是Unity提供的类型等等,则需要在CustomSettings._customTypeList中定义
  4. 在class的Awake中写上LuaRuntime.Instance.BindObject("dialogueBoxController", this);,之后在C#中创建实例时,就会把这个C# object绑定到名字叫dialogueBoxController的Lua object
    • 为了避免太多的全局变量,这个Lua object默认放在__Nova这个table中,所以在Lua中要用__Nova.dialogueBoxController来获取(详见dialogue_box.lua
    • 有些更加常用的class(如SpriteController)为了方便,写了LuaRuntime.Instance.BindObject(luaGlobalName, this, "_G");,就是把Lua object作为全局变量(放在_G table中),在Lua中可以直接写bg来获取这个Lua object,而不用写__Nova.bg
  5. 在Lua中使用这个object
    • __Nova.dialogueBoxController.rect来调用property
    • __Nova.dialogueBoxController:SetTextScroll(value)来调用method
      • 注意:Lua有一个坑人的地方,调用method要用:而不是.,因为这是一种特殊的函数调用,将object本身作为函数的第一个参数
  6. 在Lua中使用其他东西
    • Nova.DialogueState.State.Normal来获取enum的值
      • 注意:这是在创建Lua接口时就生成的静态的东西,而不是在创建实例时生成的动态的东西,放在Nova table中,而不是__Nova
    • Nova.AssetLoader.RenderTargetPrefixNova.AssetLoader.LoadRenderTarget(rt_name)来调用static class的property和method(详见transition.lua
    • typeof(Nova.CameraController)来获取类型
  7. 自定义的函数一般写在animation_presets.lua中,如果很多的话可以新建一个Lua文件
    • 新建的Lua文件需要在requires.lua中引用,才能被Nova加载
Clone this wiki locally