導航:首頁 > 源碼編譯 > ulua游戲源碼

ulua游戲源碼

發布時間:2022-07-21 12:23:20

A. 怎麼使ulua調用unity cube

Lua代碼都是運行時才編譯的,不運行的時候就如同一張圖片、一段音頻一樣,都是文件;所以更新邏輯只需要更新腳本,不需要再編譯,因而Lua能輕松實現「熱更新」。Ulua是一款非常實用的unity插件,它能讓unity支持Lua語言,而且運行效率還不錯。下面就跟大家談談我用ulua的一些心得。

Ulua的使用流程一般為:
實例化LuaState對象(new LuaState())è載入Lua代碼(LuaState. DoString(string))è調用Lua代碼中的方法(GetFunction(string),LuaFunction.callFunction(string))。其中,載入Lua代碼這一塊,可以直接賦一段Lua代碼字元串,也可以指定一個Lua腳本文件。為了熱更新,應當採用第二種載入方法,即創建一個Lua腳本文件。由於Unity不支持擴展名為lua的文件,所以可將Lua腳本擴展名定為txt(純文本文件),並用unity的TextAsset列表負責記錄所有腳本文件。建議列表中給每個腳本搭配一個string類型的ID,這樣憑此ID即可載入正確的lua腳本;另外在LuaState類中新增一個String類型的public成員,賦值為該ID。這樣一旦某個Lua腳本在運行時報錯,可根據輸出的ID值判斷是哪個Lua腳本有錯誤。

關於Lua里的預處理:
luanet.load_assembly("Assembly-CSharp")
luanet.load_assembly('UnityEngine')
Vector2 = luanet.import_type('UnityEngine.Vector2')
Vector3 = luanet.import_type('UnityEngine.Vector3')
GameObject = luanet.import_type('UnityEngine.GameObject')
luanet.import_type('System.Collections.Generic.List')
Debug = luanet.import_type('UnityEngine.Debug')
這些都是常用的Lua預處理,建議單獨寫個Lua腳本記錄這些,以後載入其他Lua腳本前都先載入一下這個腳本。自定義C#類也是可以import的,import操作是Lua調用C#的前提。當然在C#中實例化的LuaState也可以預定義一些Lua全局變數,這都是在C#里完成的
關於Lua里的全局變數:
Lua里所有的字元串,如果不是關鍵字或者運算符,就都是變數;這些變數中,凡是沒用local關鍵字修飾的,就是全局變數,反之,則是局部變數。每個LuaState對象,當它載入過Lua代碼以後,它裡面定義的全局變數,在這個對象生命期內是一直存在的。如果兩次調用這個LuaState的某方法,第一次將某全局變數進行了修改,那麼第二次,這個全局變數會在第一次修改的基礎上繼續修改。

關於Lua在Unity的適用范圍:
雖然Lua可以負責Unity工程的任何模塊,但是出於對游戲性能的考慮,盡量少的低頻率的調用Lua,比如盡量少在Update函數中調用Lua、循環利用已經實例化過的LuaState避免浪費資源。對於那些不需要高效運算的模塊,比如UI部分,就可以放心大膽的使用Lua。

關於Lua與NGUI的適配:
調用Lua的主要方式就是callFunction,而對於NGUI來說,一般都是按鈕觸發某C#腳本的函數,那麼如何用按鈕觸發Lua的函數呢?這就需要有個C#腳本作為「中介」,這個「中介」需要有自己的LuaState實例,當執行「中介」的某個方法時,由該方法調用callFunction。至於具體調用Lua腳本的哪個方法,可以通過傳參的方式告訴這個「中介」——修改NGUI的ButtonMessage類,加入新的public string LuaFunctionName成員,以後由它來制定要調用的Lua方法名就好了。而通過NGUI的UIButton等調用C#的方法,也是同理的(NGUI3.5.6版以後,可以給UIButton等等組件的觸發方法添加參數了)。

關於Lua與SimpleJSON的適配:
SimpleJSON是一個開源的JSON庫,這個詳見之前的博客。由於Lua語言無法理解C#裡面的屬性,所以凡是SimpleJSON里的public A{get,set}這種,要新寫一些介面函數返回它們的取值,以供Lua調用。而且Lua調用C#里經過很多重載的函數,也經常判斷錯誤(這是個bug?),所以乾脆多弄一些函數名,避免調用錯誤。

關於Lua與Lua之間的調用:
在Unity中使用Ulua,想要讓兩個Lua腳本彼此調用是很難的,需要通過C#作為「中介」,而且Lua不支持C#的泛型,所以不能用GetComponnet<類名>()的形式,只能用GetComponnet (「類名」)的形式去獲取組件。兩個Lua腳本相互傳參也很麻煩,因為有了C#腳本作為「中介」,所以不能傳tabel類型的參數,我的做法是將若干參數拼成一個json字元串傳遞過去,另一方再解json包。感覺有點蛋疼。不過這種情況並不多見,都是可以避免的(比如一個模塊只用一個大Lua腳本,各自獨立減少溝通)。

關於Lua編輯器:
個人使用的是notepad++,也有很多人用sublime,代碼折疊這塊notepad++更好一些,而sublime在功能上貌似更強大一些。
希望可以幫助到各位,想要了解更多可以到納金網論壇去看

B. 誰有勇敢者游戲1的百度

鏈接: https://pan..com/s/1m1u72TyNjKnnpKvcdOx2pA

?pwd=ysir 提取碼: ysir

C. Unity+uLua游戲閃退,怎麼上報lua堆棧

之前在網上看到有人在找unity使用ulua開發只需要實例化一個LuaState嗎。看到以後我也很好奇,所以也搜了一下,想要知道這個答案,首先先看一下ulua的一些案例,我們就知道答案了。
1、HelloWorld
using LuaInterface;
public class HelloWorld : MonoBehaviour {
void Start () {
LuaState l = new LuaState();
// 在C#下使用Lua
l.DoString(quot;print(#39;hello world 世界#39;)quot;);
}
}
2、CreateGameObject
using LuaInterface;
public class CreateGameObject : MonoBehaviour {
//Lua腳本 Lua下使用c#
private string script = @quot;
luanet.load_assembly(#39;UnityEngine#39;) //首先需要載入一個assembly包含指定類型
GameObject = luanet.import_type(#39;UnityEngine.GameObject#39;)//來獲得指定類型引用
//使用引用
local newGameObj = GameObject(#39;NewObj#39;)
newGameObj:AddComponent(#39;ParticleSystem#39;)
quot;;
// 在C#下使用Lua
void Start () {
LuaState l = new LuaState();
l.DoString(script); //執行Lua腳本
}
}

D. ulua進行u3d游戲的熱更新簡單嗎

在Java中,要實現熱部署,首先,你得明白,Java中類的載入方式。每一個應用程序的類都會被ClassLoader載入,所以,要實現一個支持熱部署的應用,我們可以對每一個用戶自定義的應用程序使用一個單獨的ClassLoader進行載入。

閱讀全文

與ulua游戲源碼相關的資料

熱點內容
當樂伺服器怎麼樣 瀏覽:713
nc編程軟體下載 瀏覽:382
如何限制手機app的使用 瀏覽:307
安卓華為手機怎麼恢復桌面圖標 瀏覽:956
我的世界電腦版伺服器地址在哪找 瀏覽:533
違抗了命令 瀏覽:256
安卓如何實現拖拽放置 瀏覽:91
凈資產收益率選股指標源碼 瀏覽:599
血壓力感測器計算公式單片機 瀏覽:466
全網介面vip影視解析源碼 瀏覽:916
如何破解伺服器遠程密碼錯誤 瀏覽:377
平安深圳app如何實名認證 瀏覽:500
linux網路監控軟體 瀏覽:889
內網伺服器如何上傳文件 瀏覽:140
程序員在你心中是什麼 瀏覽:1
蘋果手機怎麼找回app賬號 瀏覽:466
房屋中介網站源碼 瀏覽:29
命運格數演算法 瀏覽:852
ets3編程 瀏覽:730
怎麼製作音樂相冊的文件夾 瀏覽:566