tolua框架Example样例学习笔记(1)

Unity用C#调用lua代码的方法

Posted by Richbabe on July 7, 2018

前言

本系列博客我将通过tolua框架中的Example样例来简单入门tolua。框架下载地址戳我

Example样例的位置在: image

运行第一个样例时报错如下: image 根据报错信息在Assets目录下新建一个Lua文件夹即可,该文件夹后面我们将用来保存我们游戏的lua逻辑代码。

01_HelloWorld

HelloWorld.cs:

using UnityEngine;
using LuaInterface;
using System;

public class HelloWorld : MonoBehaviour
{
    void Awake()
    {
        LuaState lua = new LuaState();//创建lua虚拟机
        lua.Start();//启动lua虚拟机
        //lua脚本
        string hello =
            @"                
                print('hello tolua#')                                  
            ";
        
        lua.DoString(hello, "HelloWorld.cs");//运行lua脚本
        lua.CheckTop();//判断lua虚拟机栈是否为空
        lua.Dispose();//析构掉lua虚拟机
        lua = null;
    }
}


运行效果图为: image

总结:

  • 使用Tolua的相关类和方法都需要调用命名空间LuaInterface
  • 调用lua脚本必须先创建一个lua虚拟机,创建步骤为:
LuaState lua = new LuaState();
  • 在C#中运行一段lua脚本最简单的方法就是lua.DoString,该方法声明如下:
public object[] DoString(string chunk, string chunkName = "LuaState.DoString")
  • 使用完lua虚拟机之后记得要销毁,具体操作如下:
    • 先进行lua虚拟机的判空,具体做法为lua.CheckTop
    • 析构掉lua虚拟机,具体做法为:lua.Dispose

02_ScriptsFromFile

核心代码为:

lua = new LuaState();                
lua.Start();        
//如果移动了ToLua目录,自己手动修复吧,只是例子就不做配置了
string fullPath = Application.dataPath + "\\LuaFramework/ToLua/Examples/02_ScriptsFromFile";
lua.AddSearchPath(fullPath);

if (GUI.Button(new Rect(50, 50, 120, 45), "DoFile"))
        {
            strLog = "";
            lua.DoFile("ScriptsFromFile.lua");                        
        }
        else if (GUI.Button(new Rect(50, 150, 120, 45), "Require"))
        {
            strLog = "";            
            lua.Require("ScriptsFromFile");            
        }

点击DoFile和Require按钮的执行效果一样,都为: image

总结:

  • 调用lua.Start方法完成lua虚拟机的一些基础初始化,里面的内容主要包括一些环境的配置和一些lua的基本库的加载,默认一般工程中创建该虚拟机时都要初始化。
  • 重要方法lua.AddSearchPath ,通过此方法添加lua文件的路径,只有添加了文件路径之后,在该路径上的lua文件才可以被读取
  • lua文件的2个加载方法,lua.DoFile , lua.Require ,参数为lua文件名,推荐使用Require(关于Require可以看我这篇博客),因为Require 读取文件是会检查该文件是否被加载过,如果被加载过,则直接返回一个索引,否则则加载并返回一个索引,而Dofile则是每次调用都会重新加载使用,相对来说对性能等的消耗都会大一些,而且感觉不利于一些后面代码的书写

结语

通过上面的介绍,我们知道在C#中调用lua代码方法有两种,一种是用lua.Dostring直接执行一段保存在string类型里的lua脚本,另一种是通过读取lua文件来执行lua脚本(包括lua.Dofile和lua.Require,后者效率更高)。