內(nèi)容摘要:
在Lua中使用Unity這邊的UGUI控件
須在框架的CustomSettings.cs文件導(dǎo)入相應(yīng)文件以便執(zhí)行wrap操作,生成wrap文件,才能在Lua調(diào)用。
幾個(gè)特殊的控件:Toggle/Dropdown/InputField調(diào)用OnValueChanged監(jiān)聽方法需額外wrap的文件,如下:
_GT(typeof(UnityEngine.Events.UnityEvent)),
_GT(typeof(Toggle.ToggleEvent)),
_GT(typeof(Dropdown.DropdownEvent)),
_GT(typeof(InputField.OnChangeEvent)),
其他的控件直接加就可以直接用。
被UGUI的控件拖了一周的進(jìn)度,哈哈,真的是,自己想死的緊。

對(duì)于C#還是Lua我都是一直懵逼的,但生活還是要繼續(xù),所以,繼續(xù)死磕,雖然真的每天進(jìn)度幾乎沒(méi)有。像是在水里掙扎。廢話少說(shuō),直接進(jìn)入主題。
在Lua這邊直接來(lái)獲取到UGUI的UI控件
我們是需要在Lua這邊直接來(lái)獲取到UGUI的UI控件來(lái)進(jìn)行操作賦值包括監(jiān)聽其狀態(tài)之類的東西。但是對(duì)于一些控件絕非易事。
一般的控件只需要用點(diǎn)語(yǔ)法調(diào)用其wrap過(guò)來(lái)的屬性或是用冒號(hào)來(lái)調(diào)用它的方法就好,舉個(gè)栗子:
--啟動(dòng)事件--
function PromptCtrl.OnCreate(obj)
gameObject = obj;
transform = obj.transform;
panel = transform:GetComponent('UIPanel');
prompt = transform:GetComponent('LuaBehaviour');
logWarn("Start lua--->>"..gameObject.name);
prompt:AddClick(PromptPanel.btnOpen, this.OnClick);
resMgr:LoadPrefab('prompt', { 'PromptItem' }, this.InitPanel);
end
看到GetComponent了吧,就是拿到了一個(gè)GameObject了要獲取它本身帶的Component,就用這方法來(lái)獲取到.
那么下面這個(gè)要得到Text的組件,就可以這樣:

一個(gè)UI的Inspector截圖
這個(gè)CoinText就可以通過(guò)
local coinText = transform:Find("CenterPanel/CoinImg/CoinText").gameObject:GetComponent('Text').text;
print(coinText);--等于9999999
Toggle和Dropdown引入監(jiān)聽方法OnValueChanged
本來(lái)一切都是很好的,但是遇到了Toggle和Dropdown;
它們都有一個(gè)監(jiān)聽方法叫OnValueChanged。就是怎么搞都是無(wú)效。
后來(lái)查了下,發(fā)現(xiàn)它們?cè)贑#這邊是這樣寫的。
toggle.onValueChanged.AddListener(OnValueChanged);
寫在Lua這邊就是
toggle.onValueChanged:AddListener(OnValueChanged);
要保證這行代碼在Lua能正常的執(zhí)行需要在CustomSettings里面wrap一些東東。
(應(yīng)該沒(méi)人會(huì)跟我一樣卡在這里的,卡了幾天調(diào)這個(gè)方法一直是nil value。)
需要加的幾行代碼:
_GT(typeof(Toggle.ToggleEvent)),
_GT(typeof(Dropdown.DropdownEvent)),
還有個(gè)_GT(typeof(Event)),之類的,可惜我又忘記了,哎喲喂。
明天看看公司的代碼補(bǔ)上好了。
補(bǔ)上:
_GT(typeof(UnityEngine.Events.UnityEvent)),
就這樣?;ハ鄬W(xué)習(xí)。
增加內(nèi)容:
控件InputField引入監(jiān)聽方法OnValueChanged
查詢文檔給出的內(nèi)容是:

因此在CustomSetting中需導(dǎo)入的兩個(gè)文件為
_GT(typeof(InputField)),
_GT(typeof(InputField.OnChangeEvent)),
用Dropdown遇到一個(gè)問(wèn)題
打包到iOS運(yùn)行出現(xiàn)的問(wèn)題,Dropdown選項(xiàng)擠在一起了,點(diǎn)它也彈出來(lái)也會(huì)收不回去。有圖為證:

揉成一團(tuán)的Dropdown
有人說(shuō)是在BuildSetting→Player Settings→Other Settings使用IL2CPP來(lái)編譯就好了,但我設(shè)置導(dǎo)致項(xiàng)目都運(yùn)行不起來(lái)了。
哈哈,后面我能把他解決的吧,希望吧,有大神指導(dǎo)么,我還是別用這個(gè)Dropdown控件好了,/(ㄒoㄒ)/~~。
用了還是不行啊,大叔們!!!
(PS:解決了,是需要這樣設(shè)置,寫在末尾好了)

距離寫這篇文章好久了,但Dropdown的問(wèn)題還是解決了。首先我們要明白設(shè)置IL2CPP的意義是什么,查了下,Scripting Backend是在Unity3d 自動(dòng)打包過(guò)程中,需要支持64位,就需要設(shè)置為IL2CPP。這也完美解決了Dropdown選項(xiàng)擠在一起的問(wèn)題,特此記錄下來(lái),我會(huì)在后面去收集下Player Settings的各個(gè)選項(xiàng)的意義,盡量去收齊。然后作為一篇文章發(fā)出來(lái)好了,就醬。