Unity游戲程序員面試題及解答


典型的一些如手寫排序算法、一些基本數學問題,在此就不列舉了。以下整理出一些代表性的、有參考價值的題,真實面試題,附有本人的解答,歡迎討論。

 

題1.指出下列哪些屬於值類型?

int  System.Object  string  UnityEngine.MonoBehaviour  UnityEngine.Object  struct  enum  Vector3

說明:System.Object是所有類型的基類,其本身是引用類型。

 

題2.獲取、增加、刪除組建的命令分別是什么?

獲取:   GetComponent()     增加:   AddComponent()     刪除:   RemoveComponent()  

 

題3.簡述你使用過哪些第三方插件?

Skyshop做IBL和PBR,Shatter Toolkit做模型物理破碎,Final IK插件做反向運動學計算。

說明:IBL是基於圖像的渲染,PBR是基於物理的渲染。

 

題4.簡述一下對象池原理。什么情況下使用?

對象池可以將對象存儲在一塊預先划出的內存區域中,當需要時可以取出使用,而不需要每次都要實例化新的對象。一般在需要循環獲取一個對象但是不關心對象的創造時機時的情況下可以使用。

說明:對象池在很多語言中都有實現。所以回答不必拘泥於某種具體的語言,說出它的思想即可。

 

題5.使用mipmap有什么好處和壞處?什么情況下使用?

答:使用mipmap可以降低現存帶寬占用,提升渲染性能,還能減少遠處因為分辨率較大的紋理因過分縮小而產生的失真。壞處是會使內存占用變大,某些情況下會導致遠處貼圖模糊。

說明:mipmap是一種紋理技術, 在三維世界中,顯示一張圖的大小與攝象機的位置有關,近的地方,圖片實際象素就大一些,遠的地方圖片實際象素就會小一些,就要進行一些壓縮,例如一張64*64的圖,在近處,顯示出來可能是50*50,在遠處可能顯示出來是20*20.如果只限於簡單的去除某些像素,將會使縮小后的圖片損失很多細節,圖片變得很粗糙,因此,圖形學有很多復雜的方法來處理縮小圖片的問題,使得縮小后的圖片依然清晰.

       Mipmap紋理技術是目前解決紋理分辨率與視點距離關系的最有效途徑,它會先將圖片壓縮成很多逐漸縮小的圖片,例如一張64*64的圖片,會產生64*64,32*32,16*16,8*8,4*4,2*2,1*1的7張圖片,當屏幕上需要繪制像素點為20*20 時,程序只是利用 32*32 和 16*16 這兩張圖片來計算出即將顯示為 20*20 大小的一個圖片,這比單獨利用 32*32 的那張原始片計算出來的圖片效果要好得多,速度也更快.

當然你不需要回答這些原理,簡單描述一下即可。

 

題6.敘述一下unity3D中的drawcall合並。

答:Unity中使用兩種方法進行drawcall合並:靜態和動態。勾選static選項的物體系統強制進行靜態合並;對於非static的物體,在材質相同的情況下系統會自動進行動態合並。

說明:就如同D3D的Render()一樣,Unity每次在准備數據並通知GPU渲染的過程稱為一次Draw Call。注意本題不是要你解釋"Drawcall"而是解釋"Drawcall合並"。

 

題7.簡述蘭徹斯特方程在游戲開發中的用途α[M^2- m(t)^2]=β[N^2- n(t)^2]和α[M-m(t)]=β[N-n(t)]

答:式中α、β分別為交戰雙方在單位時間內毀傷對方戰斗單位數,m(t)、n(t)表示在戰斗開始后t時刻雙方在戰斗中尚存的作

戰單位數,假設交戰開始時刻雙方的初始戰斗單位數為m(0)=M,n(0)=N,在交戰過程中雙方戰斗單位數符合下列狀態方程:

α[M^2- m(t)^2]=β[N^2- n(t)^2]

或者

α[M - m(t)]=β[N - n(t)]。

說明:基本上答到意思就行 。

 

題8.

int[] a = new int[128]; foreach (int aa in a) { foreach(int bb in a) { foreach(int cc in a) { cc = 0; } } }

上述C#編寫的代碼片段有什么問題?

答:首先,在foreach中對臨時變量cc賦值本身語法就是錯誤的,編譯器通不過編譯。其次,這種嵌套多次使用foreach循環的方式是不妥的,因為foreach語句會產生少量的內存損耗,在性能上也不佳。

說明:(1)要說出語法錯誤; (2)說出foreach內存和性能損耗,或者不如for語句等缺點。 

 

題9.

public class Dialog{} { public static GameObject m_NPC; public static void ShowDialog() { m_NPC=Object.Instanciate(Resource.Load("npc") as GameObject); SaySomething(m_NPC); } } void static SaySomething(GameObject npc) { ... }

假定以上使用C#編寫的類沒有語法錯誤,且能在Unity3D引擎中正常使用。問該類存在哪些問題或隱患?

答:以上Dialog類在實際中會多次調用,而每次調用都要重新載入同樣的資源和實例化,這是一種損耗性能的做法。

說明:這道題根據題目描述可以推測是取自實際項目中的,那么肯定是存在一定的不妥才拿出來出題的。各位如果還有什么好的建議可以留言。

 

題10.

 1 public struct FallCacheInfo  2 {  3     public Transform parent;  4 }  5 
 6 public class LevelManager  7 {  8  Transform transform;  9     Dictionary<int,FallCacheInfo> m_FallInfo = new Dictionary<int,FallCacheInfo>(); 10     
11     void Fall(int id) 12  { 13  FallCacheInfo fci; 14         fci.parent = null; 15         m_FallInfo[id] = fci; 16 
17         fci.parent = GameObject.findChild("POS"); 18  } 19 } 20 
21 void OnWaitFallActorLoaded(int id) 22 { 23  FallCacheInfo fci; 24     if(m_FallInfo.TryGetValue(id,out fci)) 25  { 26         transform.parent = fci.parent; 27  } 28 }

上述代碼,假定場景中存在名為"POS"的對象,transform也為存在的對象,Fall和OnWaitFallActorLoaded函數依次被執行,請問transform最終被掛到哪個物體(或節點)下?

答:最終被掛在根節點下。

說明:請讀者思考。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM