Unity3d面試(2)

Unity問答第4期

1,FixedUpdate(),Update(),LateUpdate()的用法與區別。

1,當程序啓用時,Update()是在每一幀被調用。
2,當程序啓用時,FixedUpdate()是在每一固定幀被調用。
3,當程序啓用時,LateUpdate()也是在每一幀被調用,但不同的是它是在所有Update()調用後纔會被調用。
4,區別總結:

Update跟當前平臺的幀數有關係每一幀的時間不是固定的,而FixedUpdate是真實的時間固定值,所以一般物理邏輯都會放在FixedUpdate中。

而LateUpdate是在所有Update調用後纔會被調用,在同一幀中有多個Update,一個LateUpdate也是Update會先執行。例如相機跟隨等。
PS:FixedUpdate的時間間隔可以在項目設置中更改,Edit->ProjectSetting->time  找到Fixedtimestep。就可以修改了。

2,Unity中的1單位是FBX文件中的1單位的幾倍?

Unity中的1單位是fbx文件中的1單位的100倍,所以我們想Unity中使用1單位=1米的話,那在Max和Maya中製作的時候,單位就設置成1釐米,

3,爲了減少性能開銷,移動端實現實時陰影的方法是什麼?

由於移動端性能的限制,所以不能用自帶的DirectionalLight來設置實時陰影,SO如下:
1,貼圖的方式,如果不需要很真實的陰影可以腳下綁定個半透貼圖腳本控制來模擬陰影效果,對於材質寫一個簡單的Shader就行了。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Shader "iPhone/SimpleShadow"  
  2. {  
  3.         Properties  
  4.         {  
  5.                 _MainTex ("MainTex", 2D) = "" {}  
  6.         }  
  7.   
  8.         SubShader  
  9.         {  
  10.                 Tags { "Queue" = "Transparent" }  
  11.   
  12.                 Pass  
  13.                 {  
  14.                         Blend SrcAlpha OneMinusSrcAlpha  
  15.                           
  16.                         Color [_clrBase]  
  17.                           
  18.                         Cull Off  
  19.                         Lighting Off  
  20.                         SetTexture [_MainTex] { combine texture, one - texture }  
  21.                 }  
  22.         }  
  23. }  
2,利用相機投射,在遊戲主角身上綁定個專門投射的正交相機每幀實時繪製,用Render Texture來接收,也是腳下綁定個面片Plane Quad之類的,這個方式可以有更真實的實時陰影,因爲身上會有一個特效之類的透明材質所以要在Shader中來進行處理,使用這個方法的一些注意事項,多人重疊時陰影會多次渲染,所以簡單的方法就是給陰影分層處理,單獨的投影。還有一點就是跳躍問題因爲是腳下綁的面片所以用代碼的方式控制跳躍就會出現陰影跟人一起跳躍的狀態,所以要注意這一點人物的跳躍可以用動畫的方式來實現。這一點在上一種方式也是一樣的,還有就是這兩種方式都不適合與複雜凹凸的地形陰影會出現奇葩效果。
由於這裏代碼太多就不貼出來了,大概就是繪製陰影的Shader,相機投射的腳本,跟相機跟隨的腳本。詳情也可以去泰課的格鬥之王60,61,62課去看看。
3,投影生成的方法,在Unity中爲我們提供了Projector組件。具體實現方式可參考鏈接 http://jxwgame.blog.51cto.com/943299/1596781
4,一張圖片的像素格式爲512*512,若每個像素佔4位,存儲這張圖片的大小爲多少KB/MB?
512*512*4=262144*4=1048576(byte)=1024(Kb)=1(M),屬於常用紋理A8R8G8B8像素格式。

5,Unity5.X版本中,如何添加GUI Text組件?是否有其他更好的方法代替它?(新手常見問題)


在Unity5.X以後UI系統已經更新成了UGUI,添加UI-Text代替老版本的GUI Text。

6,項目導入一張圖集後,如何在Unity中使用?(變成一張一張的小圖)

答:

1.點中這個圖集在 Inspector面板中設定其參數  TextureType = Sprite; SpriteMode = Multiple; 並Apply.

2.然後在選中此紋理,打開SpriteEditor面板,點擊左上角Slice按鈕。

3.選擇Automatic 或Grid模式進行對此圖元素進行切割。 如果是規則的i*j 並且是同尺寸的集合可以選用Grid.否則請選擇 Automatic,

4.此時就可以對單個精靈進行編輯了。


7,當一個物體在視野內被其它物體遮擋,不希望對該物體進行渲染,可以通過哪一個模塊實現?
Occlusion Culling遮擋剔除,這個板塊在專業版中,選擇Window->Occlusion Culling。
Occlusion Culling 也是一個特性,讓不可見的物體不被渲染,但這個不是自動發生,這個和攝像頭的平截頭體的剔除是不一樣的,攝像頭的平截頭體只是不渲染不在可視範圍內的物體,但是它不會禁止一些不可見物體的重畫。
遮擋剔除和平截頭體剔除不相互矛盾。遮擋剔除會在場景中使用一個虛擬攝像頭去組織可見物體的層次,這樣unity可以根據這個信息確定哪些物體需要被渲染,大大減少draw call的次數,提高性能。具體參數百度一堆就不畫蛇添足了。

8,值類型和引用類型的區別?
1,C#的值類型包括:結構體(數值類型,bool型,用戶定義的結構體),枚舉,可空類型
 
  C#的引用類型包括:數組,用戶定義的類、接口、委託,object,字符串。
2,值類型在內存管理方面具有更好的效率,並且不支持多態,適合用作存儲數據的載體;引用類型支持多態,適合用於定義應用程序的行爲。
3,值類型的數據存儲在內存的棧中;引用類型的數據存儲在內存的堆中,而內存單元中只存放堆中對象的地址。
4,棧的內存分配是自動釋放;而堆在.NET中會有GC來釋放 
5,值類型存取速度快,引用類型存取速度慢。
6,值類型的變量直接存放實際的數據,而引用類型的變量存放的則是數據的地址,即對象的引用。
7,值類型繼承自System.ValueType,引用類型繼承自System.Object

9,什麼是泛型?請舉一個通俗易懂的例子
答:通俗來說泛型就是類的一個參數,但是這個參數必要要求是1個類,而不是一個對象。即通過參數化類型來實現在同一份代碼上操作多種數據類型

通過參數化類型來實現在同一份兒代碼上操作多種數據類型。

[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public class GenercList<T>  
  2. {  
  3.     void Add(T input)  
  4.     {  
  5.     }  
  6. };  
  7.   
  8. class Test  
  9. {  
  10.     static void Main()  
  11.     {  
  12.         GenercList<int> listInt = new GenercList<int>();  
  13.         GenercList<string> listString = new GenercList<string>();  
  14.     }  
  15. };  

優點是:

1,算法的重用性;

2,數據的類型安全;

3,減少裝箱拆箱的操作。

10.下列代碼在運行中會發生什麼問題?如何避免?

[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });  
  2. foreach (int item in ls)  
  3. {  
  4.         Console.WriteLine(item * item);  
  5.         ls.Remove(item);  
  6. }  

foreach只會只讀,並不能一邊遍歷列表一邊修改值。

可以臨時構建在foreach外在進行刪除。
還可以用for來遍歷如下,List每remove掉一個元素以後,後面的元素都會向前移動,此時如果執行i=i+1,則剛剛移過來的元素沒有被讀取,每移除一個元素以後再把i移回來就可以了。還可以倒過來遍歷代碼簡單就不都貼了。

[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });  
  2. for(i=0;i<Is.Count;i++)  
  3. {  
  4.         Console.WriteLine(item * item);  
  5.         ls.Remove(item);  
  6.         i=i-1;  
  7. }  



發佈了7 篇原創文章 · 獲贊 24 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章