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

简单的Unity toLua框架

[复制链接]
发表于 2023-4-9 11:17 | 显示全部楼层 |阅读模式
设计思路:
全局只创建一个LuaState, 所有lua类都用Table实现
主要文件:
  1. LuaScriptManager.cs        //lua脚本管理,创建LuaState
  2. LuaBehaviour.cs                //让lua控制游戏对象的中间Component
  3. class.lua                        //所有lua脚本的基类
复制代码
LuaScriptManager.cs
  1. public class LuaScriptManager {
  2.     private static LuaState _luaState;
  3.     public static LuaState luaState {
  4.         get
  5.         {
  6.             if (null == _luaState)
  7.             {
  8.                 Init();
  9.             }
  10.             return _luaState;
  11.         }
  12.     }
  13.     public static void Init()
  14.     {
  15.         new LuaResLoader();
  16.         _luaState = new LuaState();
  17.         _luaState.LogGC = true;
  18.         _luaState.Start();
  19.         LuaBinder.Bind(_luaState);
  20.                 DelegateFactory.Init();
  21.         //添加搜索路径
  22.         _luaState.AddSearchPath(Application.dataPath + "\\Resources/Lua");
  23.         _luaState.AddSearchPath(Application.dataPath + "\\Resources/LuaScripts");
  24.         _luaState.AddSearchPath(Application.dataPath + "\\Resources/LuaScripts/UIModule");
  25.     }
  26.     public static object RunLuaFile(string filePath)
  27.     {
  28.         return luaState.DoFile<object>(filePath);
  29.     }
  30.     public static object RunLuaString(string luaStr)
  31.     {
  32.         return luaState.DoString<object>(luaStr);
  33.     }
  34. }
复制代码
LuaBehaviour.cs
  1. public class LuaBehaviour : UIBase
  2. {
  3.     //模块文件的路径
  4.     public string luaFile;
  5.     //对应的Lua实例的Table
  6.     public LuaTable luaInstance;
  7.     //lua实例名
  8.     private string luaClassName;
  9.     //lua中的函数
  10.     private LuaFunction m_Awake = null;
  11.     private LuaFunction m_Start = null;
  12.     private LuaFunction m_OnEnable = null;
  13.     private LuaFunction m_OnOpen = null;
  14.     private LuaFunction m_Update = null;
  15.     private LuaFunction m_OnClose = null;
  16.     private LuaFunction m_OnDisable = null;
  17.     private LuaFunction m_OnDestory = null;
  18.     private void Awake()
  19.     {
  20.         luaInstance = LuaScriptManager.RunLuaFile(luaFile) as LuaTable;
  21.         luaClassName = (string)luaInstance["className"];
  22.         //初始化lua类
  23.         Dictionary<string, object> param = new Dictionary<string, object>();
  24.         luaInstance["transform"] = transform;
  25.         luaInstance["gameObject"] = gameObject;
  26.         //获取lua中的函数
  27.         m_Awake = (LuaFunction)luaInstance["Awake"];
  28.         m_Start = (LuaFunction)luaInstance["Start"];
  29.         m_OnEnable = (LuaFunction)luaInstance["OnEnable"];
  30.         m_OnOpen = (LuaFunction)luaInstance["OnOpen"];
  31.         m_Update = (LuaFunction)luaInstance["Update"];
  32.         m_OnClose = (LuaFunction)luaInstance["OnClose"];
  33.         m_OnDisable = (LuaFunction)luaInstance["OnDisable"];
  34.         m_OnDestory = (LuaFunction)luaInstance["OnDestory"];
  35.         if (null != m_Awake)
  36.         {
  37.             m_Awake.Call<LuaTable>(luaInstance);
  38.         }
  39.     }
  40.       
  41.     private void Start()
  42.     {
  43.         if (null != m_Start)
  44.         {
  45.             m_Start.Call<LuaTable>(luaInstance);
  46.         }
  47.     }
  48.     private void OnEnable()
  49.     {
  50.         if (null != m_OnEnable)
  51.         {
  52.             m_OnEnable.Call<LuaTable>(luaInstance);
  53.         }
  54.     }
  55.     public override void OnOpen()
  56.     {
  57.         base.OnOpen();
  58.         if (null != m_OnOpen)
  59.         {
  60.             m_OnOpen.Call<LuaTable>(luaInstance);
  61.         }
  62.     }
  63.     private void Update()
  64.     {
  65.         if (null != m_Update)
  66.         {
  67.             m_Update.Call<LuaTable>(luaInstance);
  68.         }
  69.     }
  70.     public override void OnClose()
  71.     {
  72.         base.OnClose();
  73.         if (null != m_OnClose)
  74.         {
  75.             m_OnClose.Call<LuaTable>(luaInstance);
  76.         }
  77.     }
  78.     private void OnDisable()
  79.     {
  80.         if (null != m_OnDisable)
  81.         {
  82.             m_OnDisable.Call<LuaTable>(luaInstance);
  83.         }
  84.     }
  85.     private void OnDestory()
  86.     {
  87.         if (null != m_OnDestory)
  88.         {
  89.             m_OnDestory.Call<LuaTable>(luaInstance);
  90.         }
  91.     }
  92. }
复制代码
class.lua
  1. function clone(object)
  2.     local lookup_table = {}
  3.     local function _copy(object)
  4.         if type(object) ~= "table" then
  5.             return object
  6.         elseif lookup_table[object] then
  7.             return lookup_table[object]
  8.         end
  9.         local new_table = {}
  10.         lookup_table[object] = new_table
  11.         for key, value in pairs(object) do
  12.             new_table[_copy(key)] = _copy(value)
  13.         end
  14.         return setmetatable(new_table, getmetatable(object))
  15.     end
  16.     return _copy(object)
  17. end
  18. --Create an class.
  19. function class(className, superName, superModulePath)
  20.     if superName ~= nil then
  21.         require(superModulePath)
  22.     end
  23.     if _G[className] ~= nil then
  24.         if _G[className].className == nil or _G[className].isLuaClass == nil then
  25.             Debugger.LogError("Class name has been in the global,Please change the class name")
  26.         end
  27.         return
  28.     end
  29.     _G[className] = {}
  30.     _G[className].className = className
  31.     _G[className].isLuaClass = true
  32.     _G[className].InitLuaClass = function(luaTable, valueTable)
  33.         for key, value in pairs(valueTable) do
  34.             luaTable[key] = value
  35.         end
  36.     end
  37.         
  38.         
  39.     if _G[superName] ~= nil then      
  40.         setmetatable(_G[className], _G[superName])
  41.         _G[superName].__index = _G[superName]   
  42.     end  
  43.    
  44.     _G[className].New = function()
  45.         local o = o or {}
  46.         setmetatable(o, _G[className])
  47.         _G[className].__index = _G[className]
  48.         return o
  49.     end
  50.     return _G[className]
  51. end
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-23 12:10 , Processed in 0.063888 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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