Unity中的熱更新
阿新 • • 發佈:2019-01-23
1、HelloWorld
using LuaInterface;
public class HelloWorld : MonoBehaviour {
void Start () {
LuaState l = new LuaState();
// 在C#下使用Lua
l.DoString("print('hello world 世界')");
}
}
2、CreateGameObject
using LuaInterface; public class CreateGameObject : MonoBehaviour { //Lua指令碼 Lua下使用c# private string script = @" luanet.load_assembly('UnityEngine') //首先需要載入一個assembly包含指定型別 GameObject = luanet.import_type('UnityEngine.GameObject')//來獲得指定型別引用 //使用引用 local newGameObj = GameObject('NewObj') newGameObj:AddComponent('ParticleSystem') "; // 在C#下使用Lua void Start () { LuaState l = new LuaState(); l.DoString(script); //執行Lua指令碼 } }
3、AccessingLuaVariables
using LuaInterface; public class AccessingLuaVariables : MonoBehaviour { private string script = @" //Lua指令碼 Lua下使用c# luanet.load_assembly('UnityEngine') //首先需要載入一個assembly包含指定型別 GameObject = luanet.import_type('UnityEngine.GameObject') //來獲得指定型別引用 particles = {} for i = 1, Objs2Spawn, 1 do local newGameObj = GameObject('NewObj' .. tostring(i)) local ps = newGameObj:AddComponent('ParticleSystem') ps:Stop() table.insert(particles, ps) end var2read = 42 "; // 在C#下使用Lua void Start () { LuaState l = new LuaState(); // Assign to global scope variables as if they're keys in a dictionary (they are really) l["Objs2Spawn"] = 5; l.DoString(script); // 從全域性範圍讀取 print("Read from lua: " + l["var2read"].ToString()); // 得到lua table作為LuaTable物件 LuaTable particles = (LuaTable)l["particles"]; // 典型遍歷 table中的值 foreach( ParticleSystem ps in particles.Values ) { ps.Play(); } } }
4、ScriptsFromFile
Lua的指令碼檔案04_ScriptsFromFile.lua:
--Lua指令碼 Lua下使用c#
print("This is a script from a file 世界")
C#檔案:
using LuaInterface; public class ScriptsFromFile : MonoBehaviour { public TextAsset scriptFile; void Start () { LuaState l = new LuaState(); //C# 執行Lua指令碼 l.DoString(scriptFile.text); } }
5、CallLuaFunction
using LuaInterface;
public class CallLuaFunction : MonoBehaviour {
//Lua指令碼 Lua下使用c#
private string script = @"
function luaFunc(message)
print(message)
return 42
end
";
void Start () {
LuaState l = new LuaState();
//C# 執行Lua指令碼
l.DoString(script);
// 得到函式物件
LuaFunction f = l.GetFunction("luaFunc");
// 呼叫它
object[] r = f.Call("I called a lua function!");
// Lua 函式能夠有 variable 變數返回值,因此我們將他們儲存那些作為 C# 物件陣列,和在這個案例的列印第一個元素 42
print(r[0]);
}
}
6、LuaCoroutines
using LuaInterface;
public class LuaCoroutines : MonoBehaviour {
// 這個例子將列印 斐波那契 數列(當前數=前兩個數的和) 1~10位,每次迭代是1秒間隔
//Lua指令碼 Lua下使用c#
private string script = @"
luanet.load_assembly('UnityEngine') --首先需要載入一個assembly包含指定型別
local Time = luanet.import_type('UnityEngine.Time') --來獲得指定型別引用
-- 這yields在每一幀中,全域性的遊戲時間是仍然低於所需的戳的timestamp
function waitSeconds(t)
local timeStamp = Time.time + t
while Time.time < timeStamp do
coroutine.yield()
end
end
function fib(n)
local a, b = 0, 1
while n > 0 do
a, b = b, a + b
n = n - 1
end
return a
end
function myFunc()
print('Coroutine started')
local i = 0
for i = 0, 10, 1 do
print(fib(i))
waitSeconds(1)
end
print('Coroutine ended')
end
";
private LuaThread co = null; //Lua執行緒
void Start () {
LuaState l = new LuaState();
// //C# 執行Lua指令碼
l.DoString(script);
// 獲得 函式物件
LuaFunction f = l.GetFunction("myFunc");
// 建立一個暫停的 lua coroutine協同物件從父狀態和函式
co = new LuaThread(l, f);
//協程需要在每個幀恢復,因為它在每個幀yield,或者您可以只恢復它在 C# 中的條件相反
co.Start();
}
void Update () {
if( !co.IsDead() )
{
co.Resume(); //恢復
}
else
{
print("Coroutine has exited.");
//為了摧毀協同 (但不是在 lua 的函式中,只是協同 stack 例項) 只允許 C# 來清理被包裝的物件
co = null;
}
}
}