1. 程式人生 > >Unity中的熱更新

Unity中的熱更新

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;
        }
	}
}