1. 程式人生 > >最全的Unity面試題(含答案)

最全的Unity面試題(含答案)

一.什麼是渲染管道?

是指在顯示器上為了顯示出影象而經過的一系列必要操作。
渲染管道中的很多步驟,都要將幾何物體從一個座標系中變換到另一個座標系中去。
主要步驟有:
本地座標->檢視座標->背面裁剪->光照->裁剪->投影->檢視變換->光柵化。

二.如何優化記憶體?
有很多種方式,例如
1.壓縮自帶類庫;
2.將暫時不用的以後還需要使用的物體隱藏起來而不是直接Destroy掉;
3.釋放AssetBundle佔用的資源;
4.降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小;

5.使用光照貼圖,使用多層次細節(LOD),使用著色器(Shader),使用預設(Prefab)。

三、動態載入資源的方式?(有時候也問區別,具體請百度)
1.Resources.Load();

2.AssetBundle

四:什麼是協同程式?

在主執行緒執行的同時開啟另一段邏輯處理,來協助當前程式的執行,協程很像多執行緒,但是不是多執行緒,Unity的協程實在每幀結束之後去檢測yield的條件是否滿足。

五:Unity3D中的碰撞器和觸發器的區別?

碰撞器是觸發器的載體,而觸發器只是碰撞器身上的一個屬性。當Is Trigger=false時,碰撞器根據物理引擎引發碰撞,產生碰撞的效果,可以呼叫OnCollisionEnter/Stay/Exit函式;當Is Trigger=true時,碰撞器被物理引擎所忽略,沒有碰撞效果,可以呼叫OnTriggerEnter/Stay/Exit函式。如果既要檢測到物體的接觸又不想讓碰撞檢測影響物體移動或要檢測一個物件是否經過空間中的某個區域這時就可以用到觸發器

六:物體發生碰撞的必要條件?

兩個物體都必須帶有碰撞器(Collider),其中一個物體還必須帶有Rigidbody剛體,而且必須是運動的物體帶有Rigidbody指令碼才能檢測到碰撞。

七:請簡述ArrayList和List的主要區別?

####ArrayList存在不安全型別(ArrayList會把所有插入其中的資料都當做Object來處理)
裝箱拆箱的操作(費時)
List是介面,ArrayList是一個實現了該介面的類,可以被例項化

八:如何安全的在不同工程間安全地遷移asset資料?三種方法

1.將Assets目錄和Library目錄一起遷移

2.匯出包,export Package

3.用unity自帶的assets Server功能

九:OnEnable、Awake、Start執行時的發生順序?哪些可能在同一個物件週期中反覆的發生

Awake –>OnEnable->Start,OnEnable在同一週期中可以反覆地發生。

十:MeshRender中material和sharedmaterial的區別?

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

十一:Unity提供了幾種光源,分別是什麼

四種。

平行光:Directional Light

點光源:Point Light

聚光燈:Spot Light

區域光源:Area Light

十二:簡述一下物件池,你覺得在FPS裡哪些東西適合使用物件池

物件池就存放需要被反覆呼叫資源的一個空間,當一個物件回大量生成的時候如果每次都銷燬建立會很費時間,通過物件池把暫時不用的物件放到一個池中(也就是一個集合),當下次要重新生成這個物件的時候先去池中查詢一下是否有可用的物件,如果有的話就直接拿出來使用,不需要再建立,如果池中沒有可用的物件,才需要重新建立,利用空間換時間來達到遊戲的高速執行效果,在FPS遊戲中要常被大量複製的物件包括子彈,敵人,粒子等

十三:CharacterController和Rigidbody的區別

Rigidbody具有完全真實物理的特性,Unity中物理系統最基本的一個元件,包含了常用的物理特性,而CharacterController可以說是受限的的Rigidbody,具有一定的物理效果但不是完全真實的,是Unity為了使開發者能方便的開發第一人稱視角的遊戲而封裝的一個元件

十四:簡述prefab的用處

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

十五:請簡述sealed關鍵字用在類宣告時與函式宣告時的作用

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

十六:請簡述private,public,protected,internal的區別

public:對任何類和成員都公開,無限制訪問

private:僅對該類公開

protected:對該類和其派生類公開

internal:只能在包含該類的程式集中訪問該類

十七:使用Unity3d實現2d遊戲,有幾種方式?

1. 使用本身的GUI,在Unity4.6以後出現的UGUI

2.把攝像機的Projection(投影)值調為Orthographic(正交投影),不考慮z軸;

3.使用2d外掛,如:2DToolKit,和NGUI

十八:在物體發生碰撞的整個過程中,有幾個階段,分別列出對應的函式

三個階段,1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionExit

十九:Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來

rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函式中。大家可以自己去檢視一下rigidbody的API

二十:什麼叫做鏈條關節?

Hinge Joint,可以模擬兩個物體間用一根鏈條連線在一起的情況,能保持兩個物體在一個固定距離內部相互移動而不產生作用力,但是達到固定距離後就會產生拉力。

二十一:物體自身旋轉使用的函式?

Transform.Rotate()

二十二:Unity3d提供了一個用於儲存和讀取資料的類(PlayerPrefs),請列出儲存和讀取整形資料的函式

PlayerPrefs.SetInt() PlayerPrefs.GetInt()

二十三:Unity3d指令碼從喚醒到銷燬有著一套比較完整的生命週期,請列出系統自帶的幾個重要的方法。

Awake——>OnEnable–>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy

二十四:物理更新一般放在哪個系統函式裡?

FixedUpdate,每固定幀繪製時執行一次,和Update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate呼叫次數就會跟著下降。FixedUpdate比較適用於物理引擎的計算,因為是跟每幀渲染有關。Update就比較適合做控制。

二十五:在場景中放置多個Camera並同時處於活動狀態會發生什麼?

遊戲介面可以看到很多攝像機的混合。

二十六:如何銷燬一個UnityEngine.Object及其子類?

使用Destroy()方法;

二十七:請描述為什麼Unity3d中會發生在元件上出現數據丟失的情況

一般是元件上繫結的物體物件被刪除了

二十八:LOD是什麼,優缺點是什麼?

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

二十九:MipMap是什麼,作用?

MipMapping:在三維計算機圖形的貼圖渲染中有常用的技術,為加快渲染進度和減少影象鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的檔案,這樣的貼圖被稱為MipMap。

三十:請描述Interface與抽象類之間的不同

抽象類表示該類中可能已經有一些方法的具體定義,但介面就是公公只能定義各個方法的介面 ,不能具體的實現程式碼在成員方法中。類是子類用來繼承的,當父類已經有實際功能的方法時該方法在子類中可以不必實現,直接引用父類的方法,子類也可以重寫該父類的方法。實現介面的時候必須要實現介面中所有的方法,不能遺漏任何一個。

三十一:.Net與Mono的關係?

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

三十二:簡述Unity3D支援的作為指令碼的語言的名稱

Unity的指令碼語言基於Mono的.Net平臺上執行,可以使用.NET庫,這也為XML、資料庫、正則表示式等問題提供了很好的解決方案。Unity裡的指令碼都會經過編譯,他們的執行速度也很快。這三種語言實際上的功能和執行速度是一樣的,區別主要體現在語言特性上。JavaScript、 C#、Boo

三十三:U3D中用於記錄節點空間幾何資訊的元件名稱,及其父類名稱

Transform 父類是 Component

三十四:向量的點乘、叉乘以及歸一化的意義?

1.點乘描述了兩個向量的相似程度,結果越大兩向量越相似,還可表示投影

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

3.標準化向量:用在只關係方向,不關心大小的時候

三十五:為何大家都在移動裝置上尋求U3D原生GUI的替代方案

不美觀,OnGUI很耗費時間,效率不高,使用不方便

三十六:請簡述如何在不同解析度下保持UI的一致性

NGUI很好的解決了這一點,螢幕解析度的自適應性,原理就是計算出螢幕的寬高比跟原來的預設的螢幕解析度求出一個對比值,然後修改攝像機的size。UGUI通過錨點和中心點和解析度也解決這個問題

三十七:什麼是LightMap?

LightMap:就是指在三維軟體裡實現打好光,然後渲染把場景各表面的光照輸出到貼圖上,最後又通過引擎貼到場景上,這樣就使物體有了光照的感覺。

三十八:Unity和cocos2d的區別

1. Unity3D支援C#、javascript等,cocos2d-x 支援c++、Html5、Lua等。

2. cocos2d 開源 並且免費

3. Unity3D支援iOS、Android、Flash、Windows、Mac、Wii等平臺的遊戲開發,cocos2d-x支援iOS、Android、WP等。

三十九:C#和C++的區別?

簡單的說:C# 與C++ 比較的話,最重要的特性就是C# 是一種完全面向物件的語言,而C++ 不是,另外C# 是基於IL 中間語言和.NET Framework CLR 的,在可移植性,可維護性和強壯性都比C++ 有很大的改進。C# 的設計目標是用來開發快速穩定可擴充套件的應用程式,當然也可以通過Interop 和Pinvoke 完成一些底層操作。更詳細的區別大家可以參考這裡

四十:結構體和類有何區別?

結構體是一種值型別,而類是引用型別。(值型別、引用型別是根據資料儲存的角度來分的)就是值型別用於儲存資料的值,引用型別用於儲存對實際資料的引用。那麼結構體就是當成值來使用的,類則通過引用來對實際資料操作

四十一:ref引數和out引數是什麼?有什麼區別?

ref和out引數的效果一樣,都是通過關鍵字找到定義在主函式裡面的變數的記憶體地址,並通過方法體內的語法改變它的大小。不同點就是輸出引數必須對引數進行初始化。ref必須初始化,out 引數必須在函式裡賦值。ref引數是引用,out引數為輸出引數。

四十二:C#的委託是什麼?有何用處?

委託類似於一種安全的指標引用,在使用它時是當做類來看待而不是一個方法,相當於對一組方法的列表的引用。用處:使用委託使程式設計師可以將方法引用封裝在委託物件內。然後可以將該委託物件傳遞給可呼叫所引用方法的程式碼,而不必在編譯時知道將呼叫哪個方法。與C或C++中的函式指標不同,委託是面向物件,而且是型別安全的。

四十三:C#中的排序方式有哪些?

選擇排序,氣泡排序,快速排序,插入排序,希爾排序,歸併排序

四十四:射線檢測碰撞物的原理是?

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

四十五:Unity中,照相機的Clipping Planes的作用是什麼?調整Near、Fare兩個值時,應該注意什麼?

剪裁平面 。從相機到開始渲染和停止渲染之間的距離。

四十六:如何讓已經存在的GameObject在LoadLevel後不被解除安裝掉?

void Awake()
{
    DontDestroyOnLoad(transform.gameObject);
}

四十七:請簡述GC(垃圾回收)產生的原因,並描述如何避免?

GC回收堆上的記憶體

避免:1.減少new產生物件的次數

2.使用公用的物件(靜態成員)

3.將String換為StringBuilder

四十八:反射的實現原理?

審查元資料並收集關於它的型別資訊的能力。實現原理:在執行時根據程式集及其中的型別得到元資料。下面是實現步驟:

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. m.Info.Invoke(null,方法引數);

四十九:簡述四元數的作用,四元數對尤拉角的優點?

四元數用於表示旋轉

相對尤拉角的優點:

1.能進行增量旋轉

2.避免萬向鎖

3.給定方位的表達方式有兩種,互為負(尤拉角有無數種表達方式)

五十:移動相機動作在哪個函式裡,為什麼在這個函式裡?

LateUpdate,是在所有的update結束後才呼叫,比較適合用於命令指令碼的執行。官網上例子是攝像機的跟隨,都是所有的update操作完才進行攝像機的跟進,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現。

五十一:GPU的工作原理

簡而言之,GPU的圖形(處理)流水線完成如下的工作:(並不一定是按照如下順序) 頂點處理:這階段GPU讀取描述3D圖形外觀的頂點資料並根據頂點資料確定3D圖形的形狀及位置關係,建立起3D圖形的骨架。在支援DX8和DX9規格的GPU中,這些工作由硬體實現的Vertex Shader(定點著色器)完成。 光柵化計算:顯示器實際顯示的影象是由畫素組成的,我們需要將上面生成的圖形上的點和線通過一定的演算法轉換到相應的畫素點。把一個向量圖形轉換為一系列畫素點的過程就稱為光柵化。例如,一條數學表示的斜線段,最終被轉化成階梯狀的連續畫素點。 紋理帖圖:頂點單元生成的多邊形只構成了3D物體的輪廓,而紋理對映(texture mapping)工作完成對多變形表面的帖圖,通俗的說,就是將多邊形的表面貼上相應的圖片,從而生成“真實”的圖形。TMU(Texture mapping unit)即是用來完成此項工作。 畫素處理:這階段(在對每個畫素進行光柵化處理期間)GPU完成對畫素的計算和處理,從而確定每個畫素的最終屬性。在支援DX8和DX9規格的GPU中,這些工作由硬體實現的Pixel Shader(畫素著色器)完成。 最終輸出:由ROP(光柵化引擎)最終完成畫素的輸出,1幀渲染完畢後,被送到視訊記憶體幀緩衝區。

總結:GPU的工作通俗的來說就是完成3D圖形的生成,將圖形對映到相應的畫素點上,對每個畫素進行計算確定最終顏色並完成輸出。

五十二:什麼是渲染管道?

是指在顯示器上為了顯示出影象而經過的一系列必要操作。 渲染管道中的很多步驟,都要將幾何物體從一個座標系中變換到另一個座標系中去。主要步驟有:

本地座標->檢視座標->背面裁剪->光照->裁剪->投影->檢視變換->光柵化

五十三:如何優化記憶體?

有很多種方式,例如

1.壓縮自帶類庫;

2.將暫時不用的以後還需要使用的物體隱藏起來而不是直接Destroy掉;

3.釋放AssetBundle佔用的資源;

4.降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小;

5.使用光照貼圖,使用多層次細節(LOD),使用著色器(Shader),使用預設(Prefab)。

6.程式碼中少產生臨時變數

五十四:動態載入資源的方式?他們之間的區別

1.Resources.Load();

2.AssetBundle

區別參考

五十五:請描述遊戲動畫有哪幾種,以及其原理?

主要有關節動畫、骨骼動畫、單一網格模型動畫(關鍵幀動畫)。

關節動畫:把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連線成一個整體的動畫,角色比較靈活,Quake2中使用這種動畫;

骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,有關節相連,可做相對運動,面板作為單一網格蒙在骨骼之外,決定角色的外觀;

單一網格模型動畫由一個完整的網格模型構成,在動畫序列的關鍵幀裡記錄各個頂點的原位置及其改變數,然後插值運算實現動畫效果,角色動畫較真實。

五十六:alpha blend工作原理

Alpha Blend 實現透明效果,不過只能針對某塊區域進行alpha操作,透明度可設。

五十七:寫出光照計算中的diffuse的計算公式

diffuse = Kd x colorLight x max(N*L,0);Kd 漫反射係數、colorLight 光的顏色、N 單位法線向量、L 由點指向光源的單位向量、其中N與L點乘,如果結果小於等於0,則漫反射為0。

五十八:兩種陰影判斷的方法、工作原理。

本影:景物表面上那些沒有被光源直接照射的區域(全黑的輪廓分明的區域)。

半影:景物表面上那些被某些特定光源直接照射但並非被所有特定光源直接照射的區域(半明半暗區域)

工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,儲存這些陰影多邊形資訊,然後再按視點位置對場景進行相應處理得到所要求的檢視(利用空間換時間,每次只需依據視點位置進行一次陰影計算即可,省去了一次消隱過程)

五十九:Vertex Shader是什麼,怎麼計算?

頂點著色器是一段執行在GPU上的程式,用來取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作頂點。

Vertex Shader對輸入頂點完成了從local space到homogeneous space(齊次空間)的變換過程,homogeneous space即projection space的下一個space。在這其間共有world transformation, view transformation和projection transformation及lighting幾個過程。

六十:下列程式碼在執行中會產生幾個臨時物件?

string a = new string("abc");
a = (a.ToUpper() + "123").Substring(0, 2);   

在C#中第一行是會報錯的(Java中倒是可行)。

應該這樣初始化:

string b = new string(new char[]{'a','b','c'});

答案為:5個臨時物件

六十一:下列程式碼在執行中會發