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