一、LuaScriptMgr和DoString方法
LuaScriptMgr:uLua自带的管理器,对 LuaState 进行了封装,而 LuaState 又是对 Lua 解析器对象的进一步封装,LuaState 是运用的反射方式,而 LuaScriptMgr 用的是 Wrap 方式
DoString方法:载入文件并执行代码块,对于相同的文件每次都会执行,适用于简单便捷的任务,和DoFile很像
一个很简单的实例如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TextULua : MonoBehaviour
{
private string luaText = @"
luanet.load_assembly('UnityEngine')
Resources = UnityEngine.Resources
GameObject = UnityEngine.GameObject
Vector3 = UnityEngine.Vector3
BoxCollider = UnityEngine.BoxCollider
Quaternion = UnityEngine.Quaternion
local cube = Resources.Load('Cube')
for i = 1, 5, 1 do
for j = 1, 5, 1 do
local object = GameObject.Instantiate(cube, Vector3(i, j, 0), Quaternion.identity)
object.name = i .. j
object:AddComponent(BoxCollider.GetClassType())
end
end
";
void Start()
{
LuaScriptMgr lua = new LuaScriptMgr();
lua.Start();
lua.DoString(luaText);
}
}
需要在Resources文件夹下有"Cube"预制体
二、生成Warp脚本
我们上面在Lua中需要用到C#中的对象,所以就必须生成Wrap文件,如下
在WrapFile.cs中添加
_GT(typeof(Resources)),
_GT(typeof(GameObject)),
_GT(typeof(Vector3)),
_GT(typeof(Quaternion)),
然后生成Wrap即可,注意
- Lua 操作 C# 中的对象的使用 "." 来调出
- 实例化出来的对象,调用对象自身的方法用 ":",如果是静态方法还是用 ".",例如 "GameObject.Instantiate()"
到这里就可以运行测试了
三、lua脚本独立文件
也可以在Resources文件夹下新建一个txt文件,然后通过 Resources.Load<TextAsset>("文件名") 的方法 执行lua代码,如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TextULua: MonoBehaviour
{
void Start()
{
LuaScriptMgr lua = new LuaScriptMgr();
lua.Start();
TextAsset luaScript = Resources.Load<TextAsset>("LuaText.lua");
lua.DoString(luaScript.text);
}
}
其中 LuaText.lua 中的内容就是上面 "private string luaText" 中的内容
当然,一般在正式开发中,为了实现热更新,Lua代码都是需要存放于独立的 Lua 脚本文件中的,也就是存放在 SimpleFramework 框架项目根目录下的 Lua 文件夹中,上面的只是做测试。在使用菜单命令生成 AB 包的时候,会将该文件夹下所有的 Lua 脚本一起拷贝到 StreamingAssets 目录下,为下一步热更新做准备