Unity面試

1、請簡述值類型與引用類型的區別?

答:區別:
1.值類型存儲在內存棧中引用類型數據存儲在內存堆中,而內存單元中存放的是堆中存放的地址。
2.值類型存取快,引用類型存取慢。
3.值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針和引用。
4.棧的內存是自動釋放的,堆內存是.NET中會由GC來自動釋放。
5.值類型繼承自System.ValueType,引用類型繼承自System.Object。

可參考http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html

2、C#中所有引用類型的基類是什麼?
答:引用類型的基類是System.Object 值類型的基類是System.ValueType
同時,值類型也隱式繼承自System.Object

3、請簡述ArrayList和List<Int>的主要區別?
答:ArrayList存在不安全類型‘(ArrayList會把所有插入其中的數據都當做Object來處理)
裝箱拆箱的操作(費時)
List是接口,ArrayList是一個實現了該接口的類,可以被實例化。

4、請簡述GC(垃圾回收)產生的原因,並描述如何避免?
答:GC回收堆上的內存
如何避免:

1)減少new產生對象的次數
2)使用公用的對象(靜態成員)
3)將String換爲StringBuilder


5、請描述Interface與抽象類之間的不同?
答:抽象類表示該類中可能已經有一些方法的具體定義,但接口就是公共只能定義各個方法的界面 ,不能具體的實現代碼在成員方法中。
類是子類用來繼承的,當父類已經有實際功能的方法時該方法在子類中可以不必實現,直接引用父類的方法,子類也可以重寫該父類的方法。
實現接口的時候必須要實現接口中所有的方法,不能遺漏任何一個。


//string StringBuilder   string裏面的內容是不可變的,

 //StringBuilder裏面的內容是可變動的

// 當字符串裏面的字符是頻繁變動的時候,我們最好用StringBuilder 


8、請簡述關鍵字Sealed用在類聲明和函數聲明時的作用?
答:類聲明時可防止其他類繼承此類,在方法中聲明則可防止派生類重寫此方法。

9、請簡述private,public,protected,internal的區別
答:
public:對任何類和成員都公開,無限制訪問
private:僅對該類公開
protected:對該類和其派生類公開
internal:只能在包含該類的程序集中訪問該類
protected internal:protected + internal

10、反射的實現原理?
答:審查元數據並收集關於它的類型信息的能力。
參考http://blog.163.com/xuanmingzhiyou@yeah/blog/static/1424776762011612115124188/
反射個人認爲,就是得到程序集中的屬性和方法。
實現步驟:
1.導入using System.Reflection;
2.Assembly.Load("程序集")加載程序集,返回類型是一個Assembly
3.foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
得到程序集中所有類的名稱
4.Type type = assembly.GetType("程序集.類名");獲取當前類的類型
5.Activator.CreateInstance(type); 創建此類型實例
6.MethodInfo mInfo = type.GetMethod("方法名");獲取當前方法
7.mInfo.Invoke(null,方法參數);

11、.Net與Mono的關係?
答:Mono官網主頁
Mono is a software platform designed to allow developers to easily create 
cross platform applications. Sponsored by Xamarin, Mono is an open source 
implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
mono是.net的一個開源跨平臺工具,就類似Java虛擬機,Java本身不是跨平臺語言,但運行在虛擬機上就能夠實現了跨平臺。.net只能在windows下運行,mono可以實現跨平臺跑,
可以運行於Linux,Unix,Mac OS等。

12、簡述Unity3D支持的作爲腳本的語言的名稱?
答:Unity的腳本語言基於Mono的.Net平臺上運行,可以使用.NET庫,這也爲XML、數據庫、正則表達式等問題提供了很好的解決方案。
Unity裏的腳本都會經過編譯,他們的運行速度也很快。這三種語言實際上的功能和運行速度是一樣的,區別主要體現在語言特性上。
JavaScript:和網頁中常用的JavaScript不一樣,它編譯後的運行速度很快,語法方面也會有不少區別。
C#
Boo:可以看做是Python語言的變種,又糅合了Ruby和C#的特性,它是靜態類型語言

13、Unity3D是否支持寫成多線程程序?如果支持的話需要注意什麼?
答:參考http://www.unitymanual.com/3821.html
僅能從主線程中訪問Unity3D的組件,對象和Unity3D系統調用
支持:如果同時你要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。
注意:C#中有lock這個關鍵字,以確保只有一個線程可以在特定時間內訪問特定的對象

14、Unity3D的協程和C#線程之間的區別是什麼?
答:http://blog.csdn.Net/kongbu0622/article/details/8775037
多線程程序同時運行多個線程 ,而在任一指定時刻只有一個協程在運行,並且這個正在運行的協同程序只在必要時才被掛起。除主線程之外的線程無法訪問Unity3D的對象、組件、方法。
Unity3d沒有多線程的概念,不過unity也給我們提供了StartCoroutine(協同程序)和LoadLevelAsync(異步加載關卡)後臺加載場景的方法。 StartCoroutine爲什麼叫協同程序呢,所謂協同,就是當你在StartCoroutine的函數體裏處理一段代碼時,利用yield語句等待執行結果,這期間不影響主程序的繼續執行,可以協同工作。而LoadLevelAsync則允許你在後臺加載新資源和場景,所以再利用協同,你就可以前臺用loading條或動畫提示玩家遊戲未卡死,同時後臺協同處理加載的事宜asynchronous[e ɪˈ s ɪŋ kr ə n ə s] .synchronous同步。

16、簡述四元數的作用,四元數對歐拉角的優點?
答:四元數用於表示旋轉
相對歐拉角的優點:
1)能進行增量旋轉
2)避免萬向鎖
3)給定方位的表達方式有兩種,互爲負(歐拉角有無數種表達方式)

17、向量的點乘、叉乘以及歸一化的意義?
1)點乘描述了兩個向量的相似程度,結果越大兩向量越相似,還可表示投影
2)叉乘得到的向量垂直於原來的兩個向量
3)標準化向量:用在只關係方向,不關心大小的時候。

18、矩陣相乘的意義及注意點?
用於表示線性變換:旋轉、縮放、投影、平移、仿射
注意矩陣的蠕變:誤差的積累


19、爲何大家都在移動設備上尋求U3D原生GUI的替代方案?
不美觀,OnGUI很耗費時間,使用不方便 ,DrawCall


20、請簡述如何在不同分辨率下保持UI的一致性?
NGUI很好的解決了這一點,屏幕分辨率的自適應性,原理就是計算出屏幕的寬高比跟原來的預設的屏幕分辨率求出一個對比值,然後修改攝像機的size。
原生GUI http://unity3d.9ria.com/?p=2587
NGUI http://blog.csdn.net/mfc11/article/details/17681429

21、爲什麼dynamic font在unicode環境下優於static font?

Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。
使用動態字體時,Unity將不會預先生成一個與所有字體的字符紋理。當需要支持亞洲語言或者較大的字體的時候,若使用正常紋理,則字體的紋理將非常大。

22、Render的作用?描述MeshRender和SkinnedMeshRender的關係與不同?
A renderer is what makes an object appear on the screen。
Mesh就是指模型的網格(同名組件是用於調整網格屬性的),MeshFilter一般是用於獲得模型網格的組件,而MeshRender是用於把網格渲染出來的組件

24、在場景中放置多個Camera並同時處於活動狀態會發生什麼?
答:遊戲界面可以看到很多攝像機的混合

25、Prefab的作用?如何在移動環境的設備下恰當地使用它?
答:Prefab在實例化的時候用到,主要用於經常會用到的物體,屬性方便修改
http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html

26、如何銷燬一個UnityEngine.Object及其子類?
答:Destory

27、爲什麼Unity3D中會發生在組件上出現數據丟失的情況?
答:組件上綁定的對象被刪除了

28、如何安全的在不同工程間安全地遷移asset數據?三種方法?

答:
將Assets目錄和Library目錄一起遷移
導出包
用unity自帶的assets Server功能


29、MeshCollider和其他Collider的一個主要不同點?
答:Meshcollider再快也是基於V3頂點~~ 建議還是用boxcollider,boxcollider本身是基於算法,沒有面的概念。

30、當一個細小的高速物體撞向另一個較大的物體時,會出現什麼情況?如何避免?
穿透(碰撞檢測失敗)
http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed
(碰撞體變大,FixedUpdate, 代碼限制)

31、OnEnable、Awake、Start運行時的發生順序?哪些可能在同一個對象週期中反覆的發生?
答:Awake -》OnEnable-》Start
OnEnable在同一週期中可以反覆地發生
http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html

32、請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回調函數的意義?
答:當物體是否可見切換之時。可以用於只需要在物體可見時才進行的計算。

33、Unity3D如何獲知場景中需要加載的數據?
答:題目是獲取的意思?
Resource.Load
AssetBundle

34、MeshRender中material和sharedmaterial的區別?

修改sharedMaterial將改變所有物體使用這個材質的外觀,並且也改變儲存在工程裏的材質設置。
不推薦修改由sharedMaterial返回的材質。如果你想修改渲染器的材質,使用material替代。


1、請描述遊戲動畫有哪幾種,以及其原理?
主要有關節動畫、單一網格模型動畫(關鍵幀動畫)、骨骼動畫。
關節動畫把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連接成一個整體的動畫,角色比較靈活Quake2中使用了這種動畫。
單一網絡模型動畫由一個完整的網格模型構成,在動畫序列的關鍵幀裏記錄各個頂點的原位置及其改變量,然後插值運算實現動畫效果,角色動畫較真實。
骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,由關節相連,可做相對運動,皮膚作爲單一網格蒙在骨骼之外,決定角色的外觀。皮膚網格每一個頂點都會受到骨骼的影響,從而實現完美的動畫。(骨骼動畫是由關節動畫發展而來的,如今基本都使用骨骼動畫來實現角色動畫)

2、alpha blend 工作原理?
實際顯示顏色 = 前景顏色*Alpha/255 + 背景顏色*(255-Alpha)/255
3、寫光照計算中的diffuse的計算公式?
實際光照強度 I= 環境光(Iambient) + 漫反射光(Idiffuse) + 鏡面高光(Ispecular);
環境光:Iambient= Aintensity* Acolor; (Aintensity表示環境光強度,Acolor表示環境光顏色)
漫反射光:Idiffuse = Dintensity*Dcolor*N.L;
(Dintensity表示漫反射強度,Dcolor表示漫反射光顏色,N爲該點的法向量,L爲光源向量)
鏡面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;
(Sintensity表示鏡面光照強度,Scolor表示鏡面光顏色,R爲光的反射向量,V爲觀察者向量,n稱爲鏡面光指數)

4、lod是什麼,優缺點是什麼?
LOD技術即Levels of Detail的簡稱,意爲多細節層次。LOD技術指根據物體模型的節點在顯示環境中所處的位置和重要度,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。
優點:可根據距離動態地選擇渲染不同細節的模型
缺點:加重美工的負擔,要準備不同細節的同一模型,同樣的會稍微增加遊戲的容量。

5、兩種陰影判斷的方法工作原理?
陰影由兩部分組成:本影與半影
本影:景物表面上那些沒有被光源直接照射的區域(全黑的輪廓分明的區域)
半影:景物表面上那些被某些特定光源直接照射但並非被所有特定光源直接照射的區域(半明半暗區域)
求陰影區域的方法:做兩次消隱過程
一次對每個光源進行消隱,求出對於光源而言不可見的區域L;
一次對視點的位置進行消隱,求出對於視點而言可見的面S;
shadow area= L ∩ S
陰影分爲兩種:自身陰影和投射陰影
自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出,即假設視點在點光源的位置。
投射陰影:因不透明物體遮擋光線使得場景中位於該物體後面的物體或區域受不到光照照射而形成的陰影
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,保存這些陰影多邊形信息,然後再按視點位置對場景進行相應處理得到所要求的視圖(利用空間換時間,每次只需依據視點位置進行一次陰影計算即可,省去了一次消隱過程)
若是動態光源此方法就無效了。
發佈了7 篇原創文章 · 獲贊 24 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章