1. 程式人生 > >Unity客戶端常見面試題(收集的)

Unity客戶端常見面試題(收集的)

一、什麼是渲染管道?

是指在顯示器上為了顯示出影象而經過的一系列必要操作。主要步驟有:把物體從本地坐地轉換到世界座標->檢視 座標->剪裁空間->投影->檢視變換->光柵化(alpha測試、模板測試、深度測試)->寫到幀緩衝區(frame buffer)

 二:如何優化記憶體?

1.壓縮自帶類庫;2.將暫時不用的但以後需要用的物體先隱藏起來而不是銷燬掉;3.釋放AssetBundle佔用的資源;4.降低模型的片面數、骨骼數,降低貼圖額大小5.使用光照貼圖,多層次細節(LOD)

 

三、動態載入資源的方式?

1.Resources.Load();

2.AssetBundle: AssetBundles 技術的主要的目的是在需要的時候能夠從遠端的伺服器上按需請求特定的資源,並載入到遊戲中。

AssetBundle分組策略:

1,把經常更新的資源放在一個單獨的包裡面,跟不經常更新的包分離 
2,把需要同時載入的資源放在一個包裡面 
3,可以把其他包共享的資源放在一個單獨的包裡面 
4,把一些需要同時載入的小資源打包成一個包 
5,如果對於一個同一個資源有兩個版本,可以考慮通過後綴來區分 v1 v2 v3 unity3dv1 unity3dv2

四、什麼是協同程式?

協同程式是主執行緒執行的同時開啟另一段邏輯處理,來協助當前程式的執行,協同程式像多執行緒,但不是多執行緒(除主執行緒外的執行緒不能訪問unity的元件、指令碼等),Unity的協程是在每幀結束後去檢測yield的條件是否滿足。

 

五、物體碰撞的必要條件?

兩個物體都必須帶有碰撞體,其中運動的物體必須帶有rigidbody(剛體)才能檢測到碰撞。

 

六、碰撞器和觸發器的區別?

碰撞器是觸發器的載體,觸發器是碰撞器上的一個屬性(is trigger);is trigger=false時,碰撞器根據物理引擎引發碰撞效果,可以呼叫OnCollisionEnter/Stay/Exit函式;當is trigger=true時,碰撞被忽略,沒有碰撞效果,可以呼叫OnTriggerEnter/Stay/Exit函式,觸發器一般用於要檢測一個物體是否經過空間中的某個區域。

 

七、ArrayList 和 List的主要區別?

都繼承IList介面

ArrayList:ArrayList插入不同型別的資料時允許的,因為它會把所有插入的資料都當做Object型別處理(會引發裝箱拆箱操作(引用型別、值型別相互轉換),帶來很大的效能損耗),所以用ArrayList處理資料時,可能會報型別不匹配的錯誤,也就是說ArrayList不是型別安全的。

List:宣告List集合時,需要為其宣告List集合內資料的物件型別(List<string> strList = new List<string>())

 

八、Unity中的生命週期?

Awake->OnEnable->Start->Update->FixedUpdate->LateUpdate->OnGUI->OnDisable->OnDestroy

 

九、如何安全的在不同的工程間安全的遷移asset資料?
1.將Asset目錄和library目錄一起遷移

2.匯出包,用export package

3.用unity自帶的assets server功能

 

十、MeshRender中material和shaderMaterial的區別?

修改shaderMaterial將改變所有使用這個材質的物體的外觀,並且也改變儲存在工程中的材質。而material則為這個物體生成一個新的材質。

 

十一、簡述物件池?

物件池是存放需要被反覆呼叫資源的一個空間,當一個物件會大量生成的時候,如果每次都銷燬、建立會很費時間,通過物件池把暫時不用的物件放到一個池中(也就是一個集合中),當下次要重新生成這個物件的時候,先去物件池中檢視是否有可用的物件,如果有則直接拿出來使用,如果沒用,才需要重新建立,利用空間換時間,在fps遊戲中要經常被大量使用複製的物件,如子彈等可以放入物件池中。

 

十二、CharacterController 和Rigidbody的區別?

Rigidbody具有完全真實物理的特性,Unity中物理系統最基本的一個元件,包含了常用的物理特性,而CharacterController 可以說是受到限制的rigidbody,具有一定的物理特性但不完全真實,是unity為了使開發者方便的開發而封裝的一個元件。

 

十三、Prefab(預製體)的作用?

在遊戲執行時例項化,prefab相當於一個模板,對已有的素材、指令碼、引數做一個預設的配置,以便以後的修改 ,同時prefab打包的內容簡化了匯出的操作,方便團隊的交流。

 

十四、sealed關鍵字用在類宣告和函式宣告時的作用?

sealed修飾的類為密封類,可防止其他類繼承此類;在方法中宣告則可防止派生類重寫此方法。

 

十五、c#抽象類和介面的區別?

抽象類:可以有一些方法的具體定義,子類不一定需要重寫

介面:只定義了方法,子類必須重寫介面中的所有方法

 

十六、Unity提供的一個用於儲存和讀取資料的類(PlayerPrefs),儲存和讀取整形資料的函式?

PlayerPrefs.SetInt("name",value); PlayerPrefs.GetInt("name");

 

十七、簡述FixedUpdate?

FixedUpdate每固定幀繪製時執行一次,和Update不同的是FixedUpdate是渲染幀執行,如果渲染效率低下,FixedUpdate呼叫次數就會減少;FixedUpdate一般用於物理引擎的計算,Update比較適合做控制。

 

十八、LOD是什麼,MipMap是什麼?

LOD(level of detail)多層次細節,是常用的遊戲優化技術。它按照模型的位置和重要程度決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的運算;缺點是增加記憶體。

MipMap:是針對紋理貼圖的,使用了mipmap,貼圖會根據攝像機距離模型的遠近而調整不同質量的貼圖顯示。

 

十九、.Net與Mono的關係?

mono是.net的一個開源跨平臺工具,就類似於java虛擬機器,java本身不是跨平臺語言,但執行在虛擬機器上就能夠實現跨平臺了。.net只能在windows下執行,mono可以實現跨平臺跑,可以允許於linux、mac os等。

 

二十、向量點乘、叉乘的意義?

點乘:描述了兩個向量的相似度,結果越大兩向量越相似,還可以表示投影(其中一個被投影的向量為單位向量)

叉乘:叉乘得到垂直於原來兩個向量的向量

 

二十一、Unity的螢幕適配?

這篇文章很好,參考

http://www.jianshu.com/p/95cb4621206e

 

二十二、什麼是lightMap?

LightMap:就是指在三維軟體裡實現打好光,然後渲染把場景各表面的光照輸出到貼圖上,最後通過引擎貼到場景上,使物體有了光照的感覺。優點是可以通過較少的效能消耗使靜態場景看上去更加真實,豐富,更加具有立體感;缺點是不能用來實時地處理動態光照。

 

二十三、C#中結構體和類的區別?

結構體是一種值型別,用於儲存資料的值;類是屬於引用型別,用於儲存對實際資料的引用。結構體是當成值來使用,類則是通過引用來對實際資料操作。

 

二十四、ref引數和out引數的區別?

對引數使用了ref或out都是通過關鍵字找到定義在主函式裡面變數的記憶體地址;不同點在於ref的引數作為輸入引數,必須初始化,out引數作為輸出引數,必須在函式裡賦值。

 

二十五、C#委託是什麼、用處?和事件的區別?

委託(delegate關鍵字)當作一個類看待,是對一組方法的列表的引用。用處:使用委託可以將方法引用封裝在委託物件內,然後可以將該委託物件作為其他函式的引數傳遞。事件(event關鍵字):在定義的委託物件前加event關關鍵字,如

 public delegate void FunHandleEvent();//宣告一個委託 

 public FunHandleEvent funHandleEvent;//定義一個委託物件

    public event FunHandleEvent FunEvent;//定義一個事件

區別:

1.事件在類外繫結事件只能用“+=”(“-=”解綁),不能使用‘=’繫結;如果在類內部繫結事件可以用‘=’;  

2.委託在類內類外都可以用"+="、"-="、"=";

3.事件的呼叫(執行)只能在類內呼叫;委託(公有)在類內類外都可以呼叫

 

 二十六、射線碰撞檢測原理?

射線是3d世界中一個點向一個方向發射一條無重點的線,在發射軌跡中與其他物體發射碰撞時,它將停止發射。

 

二十七、Unity中,相機的Clipping Plane的作用?Near、Far?

Clipping Plane;用來剪裁平面。Near、Far表示從相機開始渲染到停止渲染之間的距離。

 

二十八、如何讓已經存在的GameObject在LoadLevel後不被解除安裝?

DontDestroyOnLoad(transform.gameObject);

 

二十九、GC(垃圾回收)產生的原因,如何避免?

原因:GC回收堆上的記憶體;觸發GC的幾種情況:1.GC自動執行(頻率和平臺有關)2.在堆上分配記憶體的時候沒有適合的記憶體大小或空間不夠 3.主動執行GC

避免:1.減少產生在堆上分配記憶體的物件的次數 2.使用靜態成員 3.用StringBuilder代替String

 

三十、使用放射呼叫方法?

MethodInfo mi = 類物件.GetType().GetMethod(methodName);//根據方法名得到方法資訊

object[] parameters = new object[] { 引數1,引數2,.... }; //設定方法的引數
object o = mi.Invoke(類物件, parameters); //呼叫方法

 

三十一、四元數對尤拉角的優點?

四元數相對於尤拉角的優點:1.能進行增量旋轉 2.能避免萬向鎖 3.給定方位的表示式有兩種,互為正負,尤拉角有無數種表達方式 

 

三十二、Unity中移動相機動作一般放哪個函式,為什麼?

一般放在LateUpdate,LateUpdate是在所有update結束後才呼叫,比較適合命令指令碼的執行。一般在update操作完後才進行相機的跟進,不然可能出現相機已經推進,視角里還未出現角色的情況出現。

 

三十三、遊戲動畫有哪幾種,及其原理?

關節動畫:把角色分成若干獨立部分,一個部分對應一個網格,各個部分的動畫連線成整體的動畫。

骨骼動畫:骨骼按角色特點組成一定層次結構,有關節相連,可做相對運動。

關鍵幀動畫:在動畫序列的關鍵幀裡記錄各個頂點的原位置以及改變數,然後插值運算實現動畫效果。

 

三十四、各種光照的計算公式?

光照方程=環境光+漫反射+鏡面反射;*

漫反射=Kd * lightColor * max(dot(normal,lightDir),0);//Kd:漫反射係數 lightColor:光照顏色  normal:單位法向量 lightDir:指向光源的方向(單位向量)

鏡面反射(Phong光照模型)=Kd * lightColor * pow(max(dot(viewDir,i-2n(n*i)),0),Mgls); //viewDir是指向人眼的方向(單位向量)i-2n(n*i):是入射光線的反射光線方向 Mgls:材料的光澤度(控制高光的範圍)

鏡面反射(BlinnPhong光照模型)=Kd * lightColor * pow(max(dot(normal,h),0),Mgls); //h:是lightDir和viewDir兩個向量的和(取單位向量)

 

三十五、當一個細小的物體高速撞向兩一個較大的物體,會出現什麼情況,如何避免?

出現穿透(碰撞檢測失敗);

避免:1.增大細小物體的碰撞體 2.使用射線檢測,檢測距離 3.程式碼限制

 

三十六、StringBuilder和String的區別?

String型別是個不可變的uix,每次對String物件進行改變時,都需要生成一個新的String物件,然後將指標指向一個新的物件,增加記憶體垃圾;StringBuilder只在原來的字串上進行修改。

 

三十七、Unity 著色器分類?

表面著色器,頂點片元著色器,固定管線著色器

 

三十八、C#堆和棧的區別?

棧:空間由系統分配,空間有限,使用完畢立即被清除

堆:空間是手動申請的,空間由很大的自由區,使用完畢不會立即被清除,通過GC回收空間

 

三十九、值型別和引用型別的區別?

1.值型別儲存在棧上,引用型別儲存在堆上;2.值型別存取速度快;

3.值型別表示實際數值,引用型別表示指向儲存在記憶體種的資料的引用;

4.值型別繼承System.ValueType,引用型別繼承Sytem.Object;

5.棧的記憶體空間是自動釋放的,堆上分配的空間通過GC來釋放 

6.值型別變數直接存放實際的資料,引用型別的變數存放的是資料的地址,即物件的引用。

 

四十、概述序列化?

序列化簡單理解成把物件轉換成容易傳輸的格式的過程。

 

四十一、Unity在移動裝置上優化資源的方法?

1.使用assetbundle,實現資源分離和共享,同時也可以實現資源的線上更新;

2.減少頂點數 3.減少動態燈光使用的數量 4.使用輕量級的粒子系統 5.控制模型骨骼數量

6.儘量使用animation替代animator

 

四十二、將camera元件的clearFlags選項設定為DepthOnly的用處?

如果勾選了depthOnly,那麼攝像機就只會渲染看得見的物體。

 

四十三、在編輯場景時,將GameObject設定為Static的作用?

設定遊戲物件為Static時,這些部分被靜態物體擋住而不可見時,會剔除(或禁用)網格物件。

 

四十三、Unity shader中,Blend SrcAlpha OneMinusSrcAlpha的作用/

表示alpha混合。公式:最終顏色=源顏色*源透明值+目標顏色*(1-源透明值)