量子计算9 发表于 2023-4-9 11:17

简单的Unity toLua框架

设计思路:
全局只创建一个LuaState, 所有lua类都用Table实现
主要文件:
LuaScriptManager.cs        //lua脚本管理,创建LuaState
LuaBehaviour.cs                //让lua控制游戏对象的中间Component
class.lua                        //所有lua脚本的基类LuaScriptManager.cs
public class LuaScriptManager {
    private static LuaState _luaState;
    public static LuaState luaState {
      get
      {
            if (null == _luaState)
            {
                Init();
            }
            return _luaState;
      }
    }

    public static void Init()
    {
      new LuaResLoader();
      _luaState = new LuaState();
      _luaState.LogGC = true;
      _luaState.Start();
      LuaBinder.Bind(_luaState);
                DelegateFactory.Init();
      //添加搜索路径
      _luaState.AddSearchPath(Application.dataPath + "\\Resources/Lua");
      _luaState.AddSearchPath(Application.dataPath + "\\Resources/LuaScripts");
      _luaState.AddSearchPath(Application.dataPath + "\\Resources/LuaScripts/UIModule");
    }

    public static object RunLuaFile(string filePath)
    {
      return luaState.DoFile<object>(filePath);
    }

    public static object RunLuaString(string luaStr)
    {
      return luaState.DoString<object>(luaStr);
    }
}
LuaBehaviour.cs
public class LuaBehaviour : UIBase
{
    //模块文件的路径
    public string luaFile;
    //对应的Lua实例的Table
    public LuaTable luaInstance;
    //lua实例名
    private string luaClassName;
    //lua中的函数
    private LuaFunction m_Awake = null;
    private LuaFunction m_Start = null;
    private LuaFunction m_OnEnable = null;
    private LuaFunction m_OnOpen = null;
    private LuaFunction m_Update = null;
    private LuaFunction m_OnClose = null;
    private LuaFunction m_OnDisable = null;
    private LuaFunction m_OnDestory = null;

    private void Awake()
    {
      luaInstance = LuaScriptManager.RunLuaFile(luaFile) as LuaTable;
      luaClassName = (string)luaInstance["className"];

      //初始化lua类
      Dictionary<string, object> param = new Dictionary<string, object>();
      luaInstance["transform"] = transform;
      luaInstance["gameObject"] = gameObject;

      //获取lua中的函数
      m_Awake = (LuaFunction)luaInstance["Awake"];
      m_Start = (LuaFunction)luaInstance["Start"];
      m_OnEnable = (LuaFunction)luaInstance["OnEnable"];
      m_OnOpen = (LuaFunction)luaInstance["OnOpen"];
      m_Update = (LuaFunction)luaInstance["Update"];
      m_OnClose = (LuaFunction)luaInstance["OnClose"];
      m_OnDisable = (LuaFunction)luaInstance["OnDisable"];
      m_OnDestory = (LuaFunction)luaInstance["OnDestory"];

      if (null != m_Awake)
      {
            m_Awake.Call<LuaTable>(luaInstance);
      }
    }
      
    private void Start()
    {
      if (null != m_Start)
      {
            m_Start.Call<LuaTable>(luaInstance);
      }
    }

    private void OnEnable()
    {
      if (null != m_OnEnable)
      {
            m_OnEnable.Call<LuaTable>(luaInstance);
      }
    }
    public override void OnOpen()
    {
      base.OnOpen();
      if (null != m_OnOpen)
      {
            m_OnOpen.Call<LuaTable>(luaInstance);
      }
    }
    private void Update()
    {
      if (null != m_Update)
      {
            m_Update.Call<LuaTable>(luaInstance);
      }
    }

    public override void OnClose()
    {
      base.OnClose();
      if (null != m_OnClose)
      {
            m_OnClose.Call<LuaTable>(luaInstance);
      }
    }

    private void OnDisable()
    {
      if (null != m_OnDisable)
      {
            m_OnDisable.Call<LuaTable>(luaInstance);
      }
    }

    private void OnDestory()
    {
      if (null != m_OnDestory)
      {
            m_OnDestory.Call<LuaTable>(luaInstance);
      }
    }
}class.lua
function clone(object)
    local lookup_table = {}
    local function _copy(object)
      if type(object) ~= "table" then
            return object
      elseif lookup_table then
            return lookup_table
      end
      local new_table = {}
      lookup_table = new_table
      for key, value in pairs(object) do
            new_table = _copy(value)
      end
      return setmetatable(new_table, getmetatable(object))
    end
    return _copy(object)
end

--Create an class.
function class(className, superName, superModulePath)
    if superName ~= nil then
      require(superModulePath)
    end
    if _G ~= nil then
      if _G.className == nil or _G.isLuaClass == nil then
            Debugger.LogError("Class name has been in the global,Please change the class name")
      end
      return
    end
    _G = {}
    _G.className = className
    _G.isLuaClass = true
    _G.InitLuaClass = function(luaTable, valueTable)
      for key, value in pairs(valueTable) do
            luaTable = value
      end
    end
      
      
    if _G ~= nil then      
      setmetatable(_G, _G)
      _G.__index = _G   
    end
   
    _G.New = function()
      local o = o or {}
      setmetatable(o, _G)
      _G.__index = _G
      return o
    end
    return _G
end
页: [1]
查看完整版本: 简单的Unity toLua框架