1卖丸、幾個(gè)概念的理解:
Unity3D主要包括兩個(gè)部分:Unity Engine和Unity Editor。提供了UnityEngine.dll和UnityEditor.dll兩個(gè)動(dòng)態(tài)庫(kù)盏道。
Unity Engine:C/C++編寫稍浆,由平臺(tái)相關(guān)代碼,圖形API摇天、物理引擎粹湃、燈光、網(wǎng)絡(luò)層接口等組成泉坐,編譯為UnityEngine.dll为鳄,各平臺(tái)不同,用戶Shader代碼也屬于這一層的內(nèi)容腕让;
Unity Editor:IDE工具孤钦,大部分是由C#編寫,插件也是用C#編寫(調(diào)用UnityEditor.dll開(kāi)發(fā))纯丸,用戶腳本可用C#/JS/Boo編寫偏形,項(xiàng)目代碼最后由Mono編譯;
Mono運(yùn)行環(huán)境:Novell公司開(kāi)發(fā)的跨平臺(tái)·NET運(yùn)行環(huán)境觉鼻。功能是編譯工程以及提供不同平臺(tái)的CLR運(yùn)行時(shí)俊扭。對(duì)于Android平臺(tái),首先編譯輸出為dll(即IL)坠陈,游戲啟動(dòng)時(shí)Mono運(yùn)行時(shí)再將用戶dll和UnityEngine.dll等編譯為JIT格式運(yùn)行萨惑;對(duì)于iOS平臺(tái),由于不允許運(yùn)行時(shí)生成Native Code仇矾,只能一次性將UnityEngine.dll和用戶腳本等編譯為Full AOT格式存儲(chǔ)庸蔼。
JIT(Just-in-Time compilation,即時(shí)編譯)
AOT(Ahead-of-Time,提前編譯或靜態(tài)編譯)
上面說(shuō)了,在IOS平臺(tái)贮匕,不能再運(yùn)行時(shí)生成Native code姐仅,為了繞過(guò)蘋果公司的這個(gè)機(jī)制,可以使用Lua語(yǔ)言來(lái)實(shí)現(xiàn)熱更新刻盐。
2掏膏、Unity3D程序以及內(nèi)部腳本工作原理:
由上面介紹可知,Unity程序調(diào)用的層次關(guān)系是:
腳本(C#/JS/Boo)/UnityEditor/Unity Plugin -->
UnityEngine(C/C++) -->
圖形API(OpenGL/DirectX/CG/Shader等)/物理引擎(Nvidia的PhysX)/燈光(Autodesk的Beast/Enlighten)/網(wǎng)絡(luò)層(UNET) -->
底層代碼(如操作系統(tǒng)內(nèi)核敦锌、匯編等) -->
硬件
3壤追、Unity3D跨平臺(tái)特性:
這里的上帝是Mono,它為Unity游戲提供了.Net框架供屉。針對(duì)不同平臺(tái)的編譯打包行冰,都會(huì)把Mono運(yùn)行時(shí)打包進(jìn)去溺蕉,當(dāng)執(zhí)行用戶腳本的時(shí)候,就是由它來(lái)解析悼做,從而達(dá)到跨平臺(tái)的效果疯特。