3.Lua解析器执行Lua脚本

3.CSharp调用Lua-Lua解析器


3.1 知识点

创建Lua解析器

  • LuaState类代表Lua解析器
  • 往Lua解析器传入Lua代码 能够让我们在Unity中执行Lua
  • 一般情况下 保持Lua解析器的唯一性
// 初始化一个 解析器(虚拟机)
LuaState luaState = new LuaState();

// toLua想要使用Lua解析器必须要 启动解析器(虚拟机)
luaState.Start();

使用Lua解析器执行Lua脚本

LuaState.DoString 执行Lua字符串

// LuaState类的DoString方法 第一个参数用双引号包裹传入要执行的Lua语句 
// 可以传入第二个参数代表传入要执行的Lua语句如果报错找到哪个c#脚本
luaState.DoString("print('你好世界')");//c#脚本挂载到对象后正常打印
// luaState.DoString("print('你好世界)", "Lesson03_CSharp调用Lua_Lua解析器");//故意写的报错代码 会有如下报错
// LuaException: [string "Lesson03_CSharp调用Lua_Lua解析器"]:1: unfinished string near '<eof>'
// LuaInterface.LuaState:LuaLoadBuffer(Byte[], String)(at Assets / ToLua / Core / LuaState.cs:2187)
// LuaInterface.LuaState:DoString(String, String)(at Assets / ToLua / Core / LuaState.cs:599)
// Lesson03_CSharp调用Lua_Lua解析器: Start()(at Assets / toLua教程 / Lesson03_CSharp调用Lua_Lua解析器 / Lesson03_CSharp调用Lua_Lua解析器.cs:33)

创建Lua脚本

  • 在Assets一级子目录下创建Lua文件夹 添加lua脚本 注意后缀要是.lua 不要是.txt
print('我是Lua脚本 Lesson03_CSharp调用Lua_Lua解析器')

LuaState.DoFile 执行Lua文件

// LuaState类的DoFile方法 执行Lua脚本 默认会去Assets一级子目录下找Lua文件夹下的lua脚本 
// 传入lua脚本名参数时.lua后缀可加可不加
luaState.DoFile("Lesson03_CSharp调用Lua_Lua解析器.lua");//我是Lua脚本 Lesson03_CSharp调用Lua_Lua解析器
// 多次执行DoFile 每次都会启动lua脚本
luaState.DoFile("Lesson03_CSharp调用Lua_Lua解析器.lua");//我是Lua脚本 Lesson03_CSharp调用Lua_Lua解析器

LuaState.Require 执行Lua文件

// LuaState类的Require方法 执行Lua脚本 默认会去Assets一级子目录下找Lua文件夹下的lua脚本 
// 不需要加.lua后缀 否则报错
luaState.Require("Lesson03_CSharp调用Lua_Lua解析器");//我是Lua脚本 Lesson03_CSharp调用Lua_Lua解析器
// 多次执行Require 只会在第一次Require时启动
luaState.Require("Lesson03_CSharp调用Lua_Lua解析器");//没有效果

Lua解析器销毁

  • 检查解析器栈顶是否为空 销毁前必须执行
  • 销毁解析器
  • 置空 防止空指针
luaState.CheckTop(); // 检查解析器 栈顶是否为空 销毁前必须执行
luaState.Dispose(); // 销毁解析器
luaState = null; // 置空 防止空指针

3.2 知识点代码

Lesson03_CSharp调用Lua_Lua解析器.lua

print('我是Lua脚本 Lesson03_CSharp调用Lua_Lua解析器')

Lesson03_CSharp调用Lua_Lua解析器

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

public class Lesson03_CSharp调用Lua_Lua解析器 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 创建Lua解析器并启动

        //LuaState类代表Lua解析器
        //往Lua解析器传入Lua代码 能够让我们在Unity中执行Lua
        //一般情况下 保持Lua解析器的唯一性

        //初始化一个 解析器(虚拟机)
        LuaState luaState = new LuaState();

        //toLua想要使用Lua解析器必须要 启动解析器(虚拟机)
        luaState.Start();

        #endregion

        #region 知识点二 使用Lua解析器执行Lua脚本

        //LuaState类的DoString方法 第一个参数用双引号包裹传入要执行的Lua语句 可以传入第二个参数代表传入要执行的Lua语句如果报错找到哪个c#脚本
        luaState.DoString("print('你好世界')");//c#脚本挂载到对象后正常打印
        //luaState.DoString("print('你好世界)", "Lesson03_CSharp调用Lua_Lua解析器");//故意写的报错代码 会有如下报错
        //LuaException: [string "Lesson03_CSharp调用Lua_Lua解析器"]:1: unfinished string near '<eof>'
        //LuaInterface.LuaState:LuaLoadBuffer(Byte[], String)(at Assets / ToLua / Core / LuaState.cs:2187)
        //LuaInterface.LuaState:DoString(String, String)(at Assets / ToLua / Core / LuaState.cs:599)
        //Lesson03_CSharp调用Lua_Lua解析器: Start()(at Assets / toLua教程 / Lesson03_CSharp调用Lua_Lua解析器 / Lesson03_CSharp调用Lua_Lua解析器.cs:33)

        //在Assets一级子目录下创建Lua文件夹 添加lua脚本 注意后缀要是.lua 不要是.txt

        //LuaState类的DoFile方法 执行Lua脚本 默认会去Assets一级子目录下找Lua文件夹下的lua脚本 传入的参数 .lua后缀可加可不加
        luaState.DoFile("Lesson03_CSharp调用Lua_Lua解析器.lua");//我是Lua脚本 Lesson03_CSharp调用Lua_Lua解析器
        //多次执行DoFile 每次都会启动lua脚本
        luaState.DoFile("Lesson03_CSharp调用Lua_Lua解析器.lua");//我是Lua脚本 Lesson03_CSharp调用Lua_Lua解析器

        //LuaState类的Require方法 执行Lua脚本 默认会去Assets一级子目录下找Lua文件夹下的lua脚本 不需要加.lua后缀 否则报错
        luaState.Require("Lesson03_CSharp调用Lua_Lua解析器");//我是Lua脚本 Lesson03_CSharp调用Lua_Lua解析器
        //多次执行Require 只会在第一次Require时启动
        luaState.Require("Lesson03_CSharp调用Lua_Lua解析器");//没有效果

        #endregion

        #region 知识点三 Lua解析器销毁

        //检查解析器 栈顶是否为空 销毁前必须执行
        luaState.CheckTop();

        //销毁解析器
        luaState.Dispose();

        //置空 防止空指针
        luaState = null;

        #endregion
    }
}


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

×

喜欢就点赞,疼爱就打赏