一、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 目錄下,爲下一步熱更新做準備