5.Lua管理器

5.CSharp调用Lua-Lua管理器


5.1 知识点

实现Lua管理器的单例

// 创建 LuaManager 类,继承自 BaseSingletonInMonoBehaviour 类
public class LuaManager : BaseSingletonInMonoBehaviour<LuaManager>
{
}

定义Lua解析器和外部属性

//Lua解析器 声明私有成员变量 LuaState,用于管理 Lua 状态
private LuaState luaState;

// 公共属性,用于获取 LuaState 对象
public LuaState LuaState
{
    get
    {
        return luaState;
    }
}

定义初始化方法,有些知识先写着,后面再学

// 初始化 LuaManager
public void Init()
{
    //最后发布打包时在用自定义解析器 平时学习的时候没必要去找Res或者AB包下的lua脚本 打包时反注释掉下面代码就行
    //new MyCustomLoader();

    // 创建新的 LuaState 对象,用于管理 Lua 状态
    luaState = new LuaState();
    luaState.Start(); // 启动 Lua 状态

    // 初始化 LuaLooper,该组件用于处理 Lua 中的协程
    LuaLooper loop = gameObject.AddComponent<LuaLooper>();
    loop.luaState = luaState;

    // 注册 Lua 协程
    LuaCoroutine.Register(luaState, this);

    // 初始化委托工厂,用于处理 Lua 和 C# 之间的相互访问
    DelegateFactory.Init();

    // 绑定 Lua 中使用的 Unity 类型,以便在 Lua 中使用 Unity 类型而不报错
    LuaBinder.Bind(luaState);
}

封装常用方法

// 执行 Lua 脚本字符串
public void DoString(string str, string chunkName = "LuaManager.cs")
{
    luaState.DoString(str, chunkName);
}

// 加载指定 Lua 文件
public void Require(string fileName)
{
    luaState.Require(fileName);
}

// 释放 Lua 状态
public void Dispose()
{
    if (luaState == null)
        return;

    // 检查 Lua 栈顶状态
    luaState.CheckTop();

    // 释放 Lua 状态
    luaState.Dispose();
    luaState = null;
}

Asset的Lua文件夹下创建lua脚本,使用Lua管理器执行Lua脚本

print('我是Lua脚本  Lesson05_CSharp调用Lua_Lua管理器')
LuaManager.Instance.Init();
LuaManager.Instance.Require("Lesson05_CSharp调用Lua_Lua管理器");

5.2 知识点代码

Lesson05_CSharp调用Lua_Lua管理器.lua

print('我是Lua脚本  Lesson05_CSharp调用Lua_Lua管理器')

LuaManager

using LuaInterface;

// 创建 LuaManager 类,继承自 BaseSingletonInMonoBehaviour 类
public class LuaManager : BaseSingletonInMonoBehaviour<LuaManager>
{
    //Lua解析器 声明私有成员变量 LuaState,用于管理 Lua 状态
    private LuaState luaState;

    // 公共属性,用于获取 LuaState 对象
    public LuaState LuaState
    {
        get
        {
            return luaState;
        }
    }

    // 初始化 LuaManager
    public void Init()
    {
        //最后发布打包时在用自定义解析器 平时学习的时候没必要去找Res或者AB包下的lua脚本 打包时反注释掉下面代码就行
        //new MyCustomLoader();

        // 创建新的 LuaState 对象,用于管理 Lua 状态
        luaState = new LuaState();
        luaState.Start(); // 启动 Lua 状态

        // 初始化 LuaLooper,该组件用于处理 Lua 中的协程
        LuaLooper loop = gameObject.AddComponent<LuaLooper>();
        loop.luaState = luaState;

        // 注册 Lua 协程
        LuaCoroutine.Register(luaState, this);

        // 初始化委托工厂,用于处理 Lua 和 C# 之间的相互访问
        DelegateFactory.Init();

        // 绑定 Lua 中使用的 Unity 类型,以便在 Lua 中使用 Unity 类型而不报错
        LuaBinder.Bind(luaState);
    }

    // 执行 Lua 脚本字符串
    public void DoString(string str, string chunkName = "LuaManager.cs")
    {
        luaState.DoString(str, chunkName);
    }

    // 加载指定 Lua 文件
    public void Require(string fileName)
    {
        luaState.Require(fileName);
    }

    // 释放 Lua 状态
    public void Dispose()
    {
        if (luaState == null)
            return;

        // 检查 Lua 栈顶状态
        luaState.CheckTop();

        // 释放 Lua 状态
        luaState.Dispose();
        luaState = null;
    }
}

Lesson05_CSharp调用Lua_Lua管理器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson05_CSharp调用Lua_Lua管理器 : MonoBehaviour
{
    void Start()
    {
        LuaManager.Instance.Init();
        LuaManager.Instance.Require("Lesson05_CSharp调用Lua_Lua管理器");
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏