找回密码
 立即注册
查看: 223|回复: 0

tolua注册对象到lua,并在lua中调用的实现

[复制链接]
发表于 2021-9-28 09:13 | 显示全部楼层 |阅读模式
本文基于tolua里C#与lua互调,在此基础上添加了对象的注册。具体看代码:
  1. using System;
  2. using UnityEngine;
  3. using UnityEditor;
  4. using LuaInterface;
  5. public class LuaBehaviour : MonoBehaviour
  6. {
  7.     public string LuaFullPath;
  8.     public string LuaName;
  9.     private LuaState m_Lua;
  10.     private int m_ClassRef = -1;//the lua class ref
  11.     private int m_BindLuaRef = -1;//the lua class bind class ref
  12.     private int m_StartRef = -1;//the 'Start' function of lua
  13.     private int m_OnDestroyRef = -1;// the 'OnDestroy' function of lua
  14.     public GameObject tempObj;
  15.     public LuaBehaviour()
  16.     {
  17.     }
  18.     void Awake()
  19.     {
  20.         m_Lua = LuaInstance.Instance.LuaState;
  21.         if (!m_Lua.LuaDoFile(GameConfig.LuaPath + LuaFullPath))
  22.         {
  23.             Debug.LogError("load file failed, file name is " + LuaName);
  24.         }
  25.         m_Lua.LuaNewTable();
  26.         m_Lua.LuaPushValue(-1);
  27.         m_BindLuaRef = m_Lua.ToLuaRef();
  28.         m_Lua.LuaRawSetI(LuaIndexes.LUA_REGISTRYINDEX, m_BindLuaRef);
  29.         m_Lua.LuaGetGlobal(LuaName);
  30.         m_ClassRef = m_Lua.ToLuaRef();
  31.         if (m_ClassRef == LuaDLL.LUA_REFNIL)
  32.         {
  33.             Debug.LogError("not find the ref object");
  34.         }
  35.         m_Lua.LuaGetGlobal(LuaName);
  36.         m_Lua.LuaRawSetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);
  37.         m_Lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);
  38.         m_Lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_BindLuaRef);
  39.         m_Lua.LuaSetMetaTable(-2);
  40.         m_Lua.LuaGetGlobal(LuaName);
  41.         m_Lua.LuaGetField(-1, "Start");
  42.         m_StartRef = m_Lua.ToLuaRef();
  43.         if (m_StartRef == LuaDLL.LUA_REFNIL)
  44.         {
  45.             Debug.LogError("not find the ref object");
  46.         }
  47.         m_Lua.LuaGetField(-1, "Start");
  48.         m_Lua.LuaRawSetI(LuaIndexes.LUA_REGISTRYINDEX, m_StartRef);
  49.         m_Lua.LuaGetField(-1, "OnDestroy");
  50.         m_OnDestroyRef = m_Lua.ToLuaRef();
  51.         if (m_OnDestroyRef == LuaDLL.LUA_REFNIL)
  52.         {
  53.             Debug.LogError("not find the ref object");
  54.         }
  55.         m_Lua.LuaGetField(-1, "OnDestroy");
  56.         m_Lua.LuaRawSetI(LuaIndexes.LUA_REGISTRYINDEX, m_OnDestroyRef);
  57.         RegisterParams();
  58.     }
  59.     void Start()
  60.     {
  61.         m_Lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_StartRef);
  62.         m_Lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);
  63.         m_Lua.PCall(1, 0);
  64.         m_Lua.LuaPop(1);
  65.     }
  66.     void OnDestroy()
  67.     {
  68.         m_Lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_OnDestroyRef);
  69.         m_Lua.PCall(0, 0);
  70.         m_Lua.LuaPop(1);
  71.     }
  72.     private void RegisterParams()
  73.     {
  74.         m_Lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);
  75.         m_Lua.PushObject(tempObj);
  76.         m_Lua.LuaSetField(-2, "tempObj");
  77.     }
  78. }
复制代码
在上一篇的基础上,我添加了一个LuaInstance类用于管理LuaState的使用,使用RegisterParam方法将C#中的对象注册到lua,并在lua中调用。本功能主要是解决NGUI对象的动态添加问题,比方,以后游戏上线后,可能会在预制体中添加个label,但是我们不能更新C#,所以只能通过动态注册到lua中。  lua中的使用
  1. --Created By: xikuo yu
  2. --Time: 2016-12-24
  3. FirstLua = {}
  4. setmetatable(FirstLua,{})
  5. function FirstLua:Start()
  6.         print("FirstLua Start")
  7.         if self.tempObj ~= nil then
  8.                 print("tempObj is not nil")
  9.                 print( self.tempObj.tag )
  10.                 self.tempObj:SetActive(false);
  11.         else
  12.                 print("tempObj is nil")
  13.         end
  14. end
  15. function FirstLua:OnDestroy()
  16.         print("FirstLua OnDestroy")
  17. end
  18. function FirstLua.Function1()
  19.         if self == nil then
  20.                 print("FirstLua Function1 self is nil")
  21.         else
  22.                 print("FirstLua Function1")
  23.         end
  24. end
  25. function Function2()
  26.         print("Function2")
  27. end
复制代码
关于调用:
tolua为我们将类的属性添加了get与set,在lua中使用时,通过点操作符,获取C#注册过来的对象,使用分号操作符,获取C#中Wraper文件中注册的方法。
以后可能打算用反射的方式来添加方法的注册,使热更新做的更彻底,缺点是性能会有损失。
结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 18:38 , Processed in 0.089124 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表