大廠面試難,進不去?你要找的Unity的答案都在這兒了!
1 委托是什么? event 關(guān)鍵字有什么用?
委托是一個容器,可以放函數(shù)對象,并且可以觸發(fā)委托面的每個函數(shù)調(diào)用。委托主要用戶回調(diào)函數(shù)。
public delegate void GreetingDelegate(int lhs, int rhs); // 定義一個委托類型public GreetingDelegateMakeGreet; // 定義一個委托變量。MakeGreet(3, 4); // 觸發(fā)容器里面所有函數(shù)調(diào)用
我們?nèi)绻谕獠拷o委托變量加函數(shù)進來,那么委托要定義成public,這樣做又有一個問題,public外部的人也可以觸發(fā)這個委托,如果我希望設(shè)計成外部可以加回調(diào),但是只能是模塊內(nèi)部觸發(fā)委托,那么我可以加一個event來修飾,這樣雖然是public,但是外部無法觸發(fā)委托,只能類的內(nèi)部觸發(fā)。
public event GreetingDelegateMakeGreet;
2 Unity 攝像機有幾種模式,成像原理是什么?
Unity 攝像機有兩種模式一種是透視攝像機?,一種是正交攝像機,透視攝像機成像的原理是利用相似三角形來成像,如下圖

image
正交攝像機直接投影到屏幕成像

3 UGUI如何打包成圖集?
UGUI打包圖集分成幾個步驟,如下
Step1:開啟UGUI的圖集模式,Editor->Project Settings 下面有sprite packer的模式。Disabled表示不啟用它,Enabled For Builds 表示只有打包的時候才會啟用它,Always Enabled 表示永遠啟用它。這里的啟用它就表示是否將小圖自動打成圖集

Step2:為每個UI圖片制定要打入的圖集的tag名字。

Step3:打包生成圖集Window ------>Sprite Packer,點擊Pack即可打包生成圖集。
4 UGUI 如何實現(xiàn)UI物體淡入淡出?
UGUI里面比如Image這些組件,都繼承自Graphic類,這個里面提供了一個方法:
Alpha: 目標的alpha值
Duration: 漸變的時間
ignoreTimeScale:是否忽略Time.scale
void CrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale);
5 Unity [MenuItem()], 其中[]是什么意思?
C#里面[]表示的裝飾器,和Java里面的注解是類似的,我們可以通過Api函數(shù)讀取到裝飾器。
比如,Unity Editor模式下的[MenuItem(“菜單”)]來裝飾一個函數(shù)為菜單響應(yīng)函數(shù),那么為什么加了[MenuItem(菜單)] Unity就會生成這個菜單呢?Unity 讀取MenuItem這個裝飾器,知道這個裝飾器的路徑,這樣根據(jù)這個路徑在菜單創(chuàng)建一個路徑出來,利用C#的反射保存這個裝飾器所裝飾的方法,這樣點擊菜單就調(diào)用這個方法。
6 AssetsBundle包打出后.manifest有什么用?
.mainfest是一個文本文件里面有ab包的校驗碼,依賴以及資源內(nèi)容等相關(guān)信息,這個信息是給開發(fā)讀的,同時這個信息也作為二進制打入了ab包里面,所以使用ab包資源的時候,可以不用帶.manifest文件。
7 Image與RawImage的區(qū)別?
Image是UGUI里面顯示一個圖片的常用的組件,他支持圖集、單獨的圖片。一般我們顯示圖片都用Image組件來顯示,因為圖集能夠把同一個圖集里面的圖片合并drawcall,這樣提升性能。Image支持九宮格等模式。
RawImage組件是UGUI顯示單個單個的圖片而用的,它不支持圖集,所以不同圖片的RawImage單獨占一個drawcall,RawImage可以直接修改貼圖的uv參數(shù),這樣可以調(diào)整圖片的顯示。類似與打飛機的滾動的背景就可以用RawImage來不斷修改uv坐標來實現(xiàn)背景圖片的滾動。
8 Unity有哪些特定的文件夾名字,有什么作用?
Unity項目中有常用的一些文件夾的名字,這些文件夾的名字是Unity規(guī)定的,他們分別的作用如下:
Editor: 這個目錄下的代碼和資源是編輯器的Editor模式下的代碼和資源,不會打入包體中,也不會在運行的時候執(zhí)行。
Resrouces: 使用Resources.load加載的資源都要放到這個路徑下,不管這個資源有沒有用都會在打包的時候把這個路徑下的所有資源都打入包體。
StreammingAssets: 可以使用UnityWebRequest來加載本地的文件,這個文件夾下的所有文件都會被打入包體中,加載的時候可以使用web 的方式來加載。
Plugins: 用來存放插件的各個平臺的目錄,比如x86, android, iOS等。
9 如果項目需求要打空包,你如何處理?
項目需要打空包,我們在開發(fā)的時候,場景不要放任何內(nèi)容,不然隨著場景打包資源也被打入進去就不是空包了。同時Resources與StreammingAssets也不能放資源包,這樣才能打出空包,我們?nèi)绾问褂觅Y源呢?只有一條道路,就是從服務(wù)器上下載資源Ab包,再用代碼把資源運行的時候添加到場景中。
10 如果你是架構(gòu)師,資源管理你會如何做?
資源管理是Unity框架設(shè)計里面很重要的一個模塊,我們先來分析需求,資源管理的需求有
1.代碼加載資源與資源的釋放接口
2.完整的資源更新機制與管理
3.支持打空包的同時,也支持打普通的游戲包。
4.做好版本管理與渠道管理。
做到第一點需求,如果我們用Resource.load來加載,那么打空包資源更新就非常不方便,所以放棄Resources。同時又要代碼加載,我們采用純AssetsBundle機制來進行設(shè)計。所有的資源都基于AssetsBundle來進行管理,加載,釋放。
AssetsBundle本身有完整成熟的更新與解決方案。打空包也方便,把ab包部署到服務(wù)器,第一次運行先下載到本地,后續(xù)從本地加載ab包。在打包Ab包的時候,分渠道,分平臺,生成不同的ab包資源。如果不打空包,只要把這些ab包放入StreammingAssets目錄下這樣用StreammingAssets的方法來加載ab包。先從ab包下載目錄加載,如果沒有,就到StreammingAssets目錄下加載,這樣永遠加載的是最新下載的,其次才是在包體所帶的。

Unity面試問題第一批10個問題就是這樣,后期陸續(xù)還會有l(wèi)aya和服務(wù)器的問題解疑一一呈上,需要資料的小伙伴歡迎在下方評論區(qū)留言,或私信“面試”獲取哦!