简单的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[object] then
            return lookup_table[object]
        end
        local new_table = {}
        lookup_table[object] = new_table
        for key, value in pairs(object) do
            new_table[_copy(key)] = _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[className] ~= nil then
        if _G[className].className == nil or _G[className].isLuaClass == nil then
            Debugger.LogError("Class name has been in the global,Please change the class name")
        end
        return
    end
    _G[className] = {}
    _G[className].className = className
    _G[className].isLuaClass = true
    _G[className].InitLuaClass = function(luaTable, valueTable)
        for key, value in pairs(valueTable) do
            luaTable[key] = value
        end
    end
        
        
    if _G[superName] ~= nil then      
        setmetatable(_G[className], _G[superName])
        _G[superName].__index = _G[superName]    
    end  
    
    _G[className].New = function()
        local o = o or {}
        setmetatable(o, _G[className])
        _G[className].__index = _G[className]
        return o
    end
    return _G[className]
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

achonor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值