1. 程式人生 > 實用技巧 >大廠面試難,進不去?你要找的Unity的答案都在這兒了!

大廠面試難,進不去?你要找的Unity的答案都在這兒了!

####1 委託是什麼? event 關鍵字有什麼用?

委託是一個容器,可以放函式物件,並且可以觸發委託面的每個函式呼叫。委託主要使用者回撥函式。

public delegate void GreetingDelegate(int lhs, int rhs); // 定義一個委託型別

public GreetingDelegateMakeGreet; // 定義一個委託變數。

MakeGreet(3, 4); // 觸發容器裡面所有函式呼叫

我們如果在外部給委託變數加函式進來,那麼委託要定義成public,這樣做又有一個問題,public外部的人也可以觸發這個委託,如果我希望設計成外部可以加回調,但是隻能是模組內部觸發委託,那麼我可以加一個event來修飾,這樣雖然是public,但是外部無法觸發委託,只能類的內部觸發。

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 如何實現UI物體淡入淡出?

UGUI裡面比如Image這些元件,都繼承自Graphic類,這個裡面提供了一個方法:

Alpha: 目標的alpha值

Duration: 漸變的時間

ignoreTimeScale:是否忽略Time.scale

void CrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale);

####5 Unity [MenuItem()], 其中[]是什麼意思?

C#裡面[]表示的裝飾器,和Java裡面的註解是類似的,我們可以通過Api函式讀取到裝飾器。

比如,Unity Editor模式下的[MenuItem(“選單”)]來裝飾一個函式為選單響應函式,那麼為什麼加了[MenuItem(選單)] Unity就會生成這個選單呢?Unity 讀取MenuItem這個裝飾器,知道這個裝飾器的路徑,這樣根據這個路徑在選單建立一個路徑出來,利用C#的反射儲存這個裝飾器所裝飾的方法,這樣點選選單就呼叫這個方法。

####6 AssetsBundle包打出後.manifest有什麼用?

.mainfest是一個文字檔案裡面有ab包的校驗碼,依賴以及資源內容等相關資訊,這個資訊是給開發讀的,同時這個資訊也作為二進位制打入了ab包裡面,所以使用ab包資源的時候,可以不用帶.manifest檔案。

####7 Image與RawImage的區別?

Image是UGUI裡面顯示一個圖片的常用的元件,他支援圖集、單獨的圖片。一般我們顯示圖片都用Image元件來顯示,因為圖集能夠把同一個圖集裡面的圖片合併drawcall,這樣提升效能。Image支援九宮格等模式。

RawImage元件是UGUI顯示單個單個的圖片而用的,它不支援圖集,所以不同圖片的RawImage單獨佔一個drawcall,RawImage可以直接修改貼圖的uv引數,這樣可以調整圖片的顯示。類似與打飛機的滾動的背景就可以用RawImage來不斷修改uv座標來實現背景圖片的滾動。

####8 Unity有哪些特定的資料夾名字,有什麼作用?

Unity專案中有常用的一些資料夾的名字,這些資料夾的名字是Unity規定的,他們分別的作用如下:

Editor: 這個目錄下的程式碼和資源是編輯器的Editor模式下的程式碼和資源,不會打入包體中,也不會在執行的時候執行。

Resrouces: 使用Resources.load載入的資源都要放到這個路徑下,不管這個資源有沒有用都會在打包的時候把這個路徑下的所有資源都打入包體。

StreammingAssets: 可以使用UnityWebRequest來載入本地的檔案,這個資料夾下的所有檔案都會被打入包體中,載入的時候可以使用web 的方式來載入。

Plugins: 用來存放外掛的各個平臺的目錄,比如x86, android, iOS等。

####9 如果專案需求要打空包,你如何處理?

專案需要打空包,我們在開發的時候,場景不要放任何內容,不然隨著場景打包資源也被打入進去就不是空包了。同時Resources與StreammingAssets也不能放資源包,這樣才能打出空包,我們如何使用資源呢?只有一條道路,就是從伺服器上下載資源Ab包,再用程式碼把資源執行的時候新增到場景中。

####10 如果你是架構師,資源管理你會如何做?

資源管理是Unity框架設計裡面很重要的一個模組,我們先來分析需求,資源管理的需求有

1.程式碼載入資源與資源的釋放介面

2.完整的資源更新機制與管理

3.支援打空包的同時,也支援打普通的遊戲包。

4.做好版本管理與渠道管理。

做到第一點需求,如果我們用Resource.load來載入,那麼打空包資源更新就非常不方便,所以放棄Resources。同時又要程式碼載入,我們採用純AssetsBundle機制來進行設計。所有的資源都基於AssetsBundle來進行管理,載入,釋放。

AssetsBundle本身有完整成熟的更新與解決方案。打空包也方便,把ab包部署到伺服器,第一次執行先下載到本地,後續從本地載入ab包。在打包Ab包的時候,分渠道,分平臺,生成不同的ab包資源。如果不打空包,只要把這些ab包放入StreammingAssets目錄下這樣用StreammingAssets的方法來載入ab包。先從ab包下載目錄載入,如果沒有,就到StreammingAssets目錄下載入,這樣永遠載入的是最新下載的,其次才是在包體所帶的。

Unity面試問題第一批10個問題就是這樣,後期陸續還會有laya和伺服器的問題解疑一一呈現給大家,希望大家繼續關注。