Unity3D常见面试题
Unity3D常見面試題
目錄
C#問題 4
1.在類的構造函數前加上static會報什么錯?為什么? 4
2.C#?StringBuilder類型比string類型的優勢是什么? 4
3.C#?函數Func(string?a,?string?b)用Lambda表達式怎么寫? 4
4.數列1,1,2,3,5,8,13...第n位數是多少?用C#遞歸算法實現 4
5.?請簡述值類型與引用類型的區別 4
6.?請簡述ArrayList和List<>的主要區別 5
7.?請簡述GC(垃圾回收)產生的原因,并描述如何避免? 5
8.?請描述Interface與抽象類之間的不同 5
9.下列代碼在運行中會產生幾個臨時對象? 5
10.下列代碼在運行中會發生什么問題?如何避免? 6
11.請簡述關鍵字Sealed用在類聲明和函數聲明時的作用 6
12.請簡述private,public,protected,internal的區別 6
13.反射的實現原理? 6
14.Net與Mono的關系? 6
15.請說出4種面向對象的設計原則,并分別簡述它們的含義。 7
16.?Hashtable是無序的嗎? 7
Unity問題 7
UI 7
1.NGUI?Button怎樣接受用戶點擊并調用函數,具體方法名稱是什么? 7
2.請簡述NGUI中Panel和Anchor的作用 7
3.為何大家都在移動設備上尋求U3D原生GUI的替代方案 8
4.使用原生GUI創建一個可以拖動的窗口命令是什么? 8
5.使用Unity3d實現2d游戲,有幾種方式? 8
碰撞 8
6.怎么判斷兩個平面是否相交?不能用碰撞體,說出計算方法 8
7.MeshCollider和其他Collider的一個主要不同點? 8
8.Unity3d中的碰撞器和觸發器的區別? 8
9.物體發生碰撞的必要條件 9
10.當一個細小的高速物體撞向另一個較大的物體時,會出現什么情況?如何避免? 9
動畫 10
11.一個簡單的游戲,怪物會走動\攻擊\死亡,游戲角色會走動,跳躍\攻擊\格擋\死亡,還會接受玩家從輸入端輸入的指令,NPC會走動,他們彼此之間可以互相通信.請畫出以上三種角色的UML圖示. 10
12.請描述游戲動畫有哪幾種,以及其原理? 10
13.反向旋轉動畫的方法是什么? 10
14.寫出Animation的五個方法 11
15.動畫層(AnimationState?Layers)的作用是什么? 11
16.Itween插件的作用是什么,Itween作用于世界坐標還是局部坐標,請列舉出3個其常用方法? 11
17.法線貼圖?、CG動畫?? 11
線程和協程 11
18.Unity3D是否支持寫成多線程程序?如果支持的話需要注意什么? 11
19.Unity3D的協程和C#線程之間的區別是什么? 12
20.什么是協同程序? 12
四元數 12
21.四元數是什么?主要作用什么?對歐拉角的優點是什么? 12
攝像機 12
22.在場景中放置多個Camera并同時處于活動狀態會發生什么? 12
23.Unity攝像機有幾種工作方式,分別是什么? 13
預制物 13
24.Prefab的作用?如何在移動環境的設備下恰當地使用它? 13
unity?當需要頻繁創建一個物體對象時,怎樣減少內存 13
Shader 13
25.出光照計算中的diffuse的計算公式 13
26.MeshRender中material和shader的區別? 13
27.alpha?blend工作原理 14
28.光照貼圖?的優勢是什么? 14
29.Vertex?Shader是什么,怎么計算? 14
系統函數 14
物理更新一般在哪個系統函數里? 14
30.OnEnable、Awake、Start運行時的發生順序?哪些可能在同一個對象周期中反復的發生? 15
31.Unity3d腳本從喚醒到銷毀有著一套比較完整的生命周期,請列出系統自帶的幾個重要的方法。 15
32.物理更新一般放在哪個系統函數里? 15
33.移動攝像機的動作放在哪個系統函數中,為什么放在這個函數中? 15
34.請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回調函數的意義? 15
35.Unity3d提供了一個用于保存和讀取數據的類(PlayerPrefs),請列出保存和讀取整形數據的函數 15
36.動態加載資源的方式?區別是什么? 16
37.以下哪個函數在游戲進入新場景后會被馬上調用? 16
38.如何銷毀一個UnityEngine.Object及其子類 16
39.獲取、增加、刪除組件的命令分別是什么? 16
40.Application.loadLevel命令是什么? 16
41.調試記錄到控制臺的命令是什么? 16
42.LayerMask.NameToLayer()這個方法有什么作用? 16
43.localPosition與Position的使用區別? 17
44.物體自身旋轉使用的函數? 17
45.物體圍繞某點旋轉使用的函數? 17
46.U3D中用于記錄節點空間幾何信息的組件名稱,及其父類名稱 17
47.寫一個計時器工具,從整點開始計時,格式為:00:00:00 17
物理引擎 18
48.<憤怒的小鳥>給予初速度以后,怎么讓小鳥受到重力和空氣阻力的影響而繪制拋物線軌跡,說出具體的計算方法. 18
49.實現吊機吊物體的功能 18
50.上機題:用鼠標實現在場景中拖動物體,用鼠標滾輪實現縮放(用一個Cube即可)。 22
51.Material和Physic?Material區別? 24
52.CharacterController和Rigidbody的區別? 24
53.Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來 24
54.什么叫做鏈條關節? 24
55.什么是導航網格(?NavMesh)? 24
56.Unity3d提供了幾種光源類型,分別是哪幾種? 25
Unity引擎問題 25
57.簡述Unity3D支持的作為腳本的語言的名稱 25
58.向量的點乘、叉乘以及歸一化的意義? 25
59.矩陣相乘的意義及注意點? 25
60.為什么dynamic?font在unicode環境下優于static?font? 25
61.Render的作用?描述MeshRender和SkinnedMeshRender的關系與不同 26
62.簡述SkinnedMesh的實現原理 26
63.為什么Unity3D中會發生在組件上出現數據丟失的情況? 26
64.如何安全的在不同工程間安全地遷移asset數據?三種方法 26
65.Lod是什么,優缺點是什么? 26
66.兩種陰影判斷的方法、工作原理。 26
67.MipMap是什么,作用? 27
68.用代碼實現第三角色控制器 27
69.Mecanim系統中,Body?Mask的作用是? 27
70.Unity連接數據庫 27
71.如何優化內存? 27
72.你用過哪些插件? 27
在哪個模塊下可以修改Render?Path? 28
圖形圖像 28
1.什么是渲染管道? 28
2.什么是矢量圖?? 29
3.什么是矩陣?矩陣運算? 29
4.角度和弧度的轉換 29
5.矢量標量 29
?
C#問題
1.在類的構造函數前加上static會報什么錯?為什么?
答:在構造函數如果有public修飾的靜態構造函數時會報:“靜態構造函數中不允許出現訪問修飾符”,如果什么修飾符都不加的話不會報錯,靜態構造函數一般是起初始化作用。
2.C#?StringBuilder類型比string類型的優勢是什么?
答:StringBuilde的優勢在于拼接,string的優勢在于對字符串做一些處理,在使用過程中看具體的需求。
3.C#?函數Func(string?a,?string?b)用Lambda表達式怎么寫?
答:(a,b)=>{}
4.數列1,1,2,3,5,8,13...第n位數是多少?用C#遞歸算法實現
答:
5.?請簡述值類型與引用類型的區別
答:區別:
????1.值類型存儲在內存棧中,引用類型數據存儲在內存堆中,而內存單元中存放的是堆中??
存放的地址。
????2.值類型存取快,引用類型存取慢。
????3.值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針和引用。
????4.棧的內存是自動釋放的,堆內存是.NET中會由GC來自動釋放。
????5.值類型繼承自System.ValueType,引用類型繼承自System.Object。
6.?請簡述ArrayList和List<>的主要區別
答:ArrayList是非泛型列表,存儲數據時把所有的數據都當成object類型存儲,存在裝箱問題,取出來使用的時候存在拆箱問題,裝箱拆箱會使性能變差,而且存在數據安全問題,但是優點在于可以讓值類型和引用類型互相轉換。
List是泛型列表,在使用的時候才去定義數據類型,泛型避免了拆箱裝箱的問題,存入讀取速度較快,類型也更安全。
7.?請簡述GC(垃圾回收)產生的原因,并描述如何避免?
答:GC回收堆上的內存
????避免:1)減少new產生對象的次數
??????????2)使用公用的對象(靜態成員)
??????????3)如果字符串拼接多的將String換為StringBuilder
8.?請描述Interface與抽象類之間的不同
答:語法不同處:1.抽象類中可以有字段,接口沒有。
2.抽象類中可以有實現成員,接口只能包含抽象成員。
3.抽象類中所有成員修飾符都可以使用,接口中所有的成員都是對外的,所以不需要修飾符修飾。
用法不同處:1.抽象類是概念的抽象,接口關注于行為。
???????????2.抽象類的子類與父類的關系是泛化關系,耦合度較高,而實現類和接口之間是實現的關系,耦合度比泛化低。
???????????3.一個類只能繼承一個類,但是可以實現多個接口。
9.下列代碼在運行中會產生幾個臨時對象?
string?a?=?new?string("abc");
a?=?(a.ToUpper()?+?"123").Substring(0,?2);???
答:第一行是會出錯的。應該這樣初始化:
string?b?=?new?string(new?char[]{'a','b','c'});
3個臨時對象
10.下列代碼在運行中會發生什么問題?如何避免?
List<int>?ls?=?new?List<int>(new?int[]?{?1,?2,?3,?4,?5?});
?foreach?(int?item?in?ls)
?{
?Console.WriteLine(item?*?item);
????????ls.Remove(item);
?}???
答:會產生運行時錯誤,因為foreach是只讀的。不能一邊遍歷一邊修改。
使用foreach時候不要對內容進行修改,如果要修改可以使用for
11.請簡述關鍵字Sealed用在類聲明和函數聲明時的作用
答:Sealed訪問修飾符用于類時,該類是密封類,可防止其他類繼承此類。
在方法中使用時則可防止派生類重寫此方法。
12.請簡述private,public,protected,internal的區別
答:public:對任何類和成員都公開,無限制訪問
????private:僅對該類公開
????protected:對該類和其派生類公開
????internal:只能在包含該類的程序集中訪問該類
????protected?internal:protected?+?internal
13.反射的實現原理?
答:審查元數據并收集關于它的類型信息的能力。
14.Net與Mono的關系?
答:mono是.net的一個開源跨平臺工具。.net只能在windows下運行,mono可以實現跨平臺,可以運行于linux,Unix,Mac?OS等。
15.請說出4種面向對象的設計原則,并分別簡述它們的含義。?
答:1)?單一職責原則:一個類,最好只做一件事,只有一個引起它的變化.?
2)?開放-封閉原則:對于擴展是開放的,對于更改是封閉的?
3)?里氏替換原則:子類必須能夠替換其基類?
4)?依賴倒置原則:依賴于抽象?
5)?接口隔離原則?:使用多個小的專門的接口,而不要使用一個大的總接口。
16.?Hashtable是無序的嗎?
答:電腦沒有絕對的無序,hashtable是通過哈希碼讓開發者感覺無序。
?
?
?
?
Unity問題
UI
1.NGUI?Button怎樣接受用戶點擊并調用函數,具體方法名稱是什么?
答:1.直接監聽事件:在按鈕上綁定一個帶有OnClick腳本,但這種方法不太好用,也不靈活。
????2.ButtonScript:在按鈕上添加BoxCollider,在添加ButtonScript腳本,把要調用的方法放到場景中一個物體上,一般放在攝像機上,因為攝像機一直存在,然后把這個方法添加到ButtonScript腳本里寫好的委托里面,所以可以添加多個方法,一旦點擊就觸發事件。
2.請簡述NGUI中Panel和Anchor的作用?
答:Panel是一個容器,它將包含所有UI小部件,并負責將所包含的部件組合優化,以減少繪制命令的調用。??
?Anchor是NGUI中屏幕分辨率的自適應性,來適應不同的分辨率的屏幕顯示。
3.為何大家都在移動設備上尋求U3D原生GUI的替代方案
答:1.不美觀
2.OnGUI很耗費時間
3.使用不方便?
4.?drawcall很高
4.使用原生GUI創建一個可以拖動的窗口命令是什么??
答:GUI.DragWindow()
5.使用Unity3d實現2d游戲,有幾種方式?
答:1.使用本身的GUI
2.把攝像機的Projection(投影)值調為Orthographic(正交投影),不考慮z軸
3.使用2d插件,如:2DToolKit
碰撞
6.怎么判斷兩個平面是否相交?不能用碰撞體,說出計算方法
答:在兩個平面上分別取一個向量,然后看是否相交
7.MeshCollider和其他Collider的一個主要不同點?
答:MeshCollider是網格碰撞器,對于復雜網狀模型上的碰撞檢測,比其他的碰撞檢測精確的多,但是相對其他的碰撞檢測計算也增多了,所以一般使用網格碰撞也不會在面數比較高的模型上添加,而會做出兩個模型,一個超簡模能表示物體的形狀用于做碰撞檢測,一個用于顯示。
8.Unity3d中的碰撞器和觸發器的區別?
答:1.碰撞器物體不能互相進入到對方內部,觸發器可以
2.觸發器角色控制器可以使用,碰撞器中不能使用
3.觸發器沒有物理屬性了,碰撞器可以有力存在
4.碰撞器調用OnCollisionEnter/Stay/Exit函數,觸發器調用OnTriggerEnter/Stay/Exit函數
9.物體發生碰撞的必要條件
答:兩個物體都必須帶有碰撞器(Collider),其中一個物體還必須帶有Rigidbody剛體。
?
CharacterController和Rigidbody的區別?
CharacterController自帶膠囊碰撞器,里面包含有剛體的屬性;
Rigidbody就是剛體,使物體帶有剛體的特征。
?
10.當一個細小的高速物體撞向另一個較大的物體時,會出現什么情況?如何避免?
答:穿透(碰撞檢測失敗)
避免的方法:把剛體的實時碰撞檢測打開Collision?Detection修改為Continuous?Dynamic
?
在unity3d中物體發生碰撞的整個過程中,有幾個階段,分別列出對應的階段函數
主要是三個階段:1.Collider.OnCollisionEnter?進入碰撞,
OnCollisionEnter?is?called?when?this?collider/rigidbody?has?begun?touching?
another?rigidbody/collider.
當collider/rigidbody開始觸動另一個rigidbody/collider時OnCollisionEnter被調用。
2.Collider.OnCollisionStay?逗留碰撞,
OnCollisionStay?is?called?once?per?frame?for?every?collider/rigidbody?that?is?
touching?rigidbody/collider.
每個collider/rigidbody觸動rigidbody/collider,將在每幀調用OnCollisionStay。通俗的說,
一個碰撞器或剛體觸動另一個剛體或碰撞器,在每幀都會調用OnCollisionStay,直到它們之間離開不接觸。
3.Collider.OnCollisionExit?退出碰撞,
OnCollisionExit?is?called?when?this?collider/rigidbody?has?stopped?touching?
another?rigidbody/collider.
當?collider/rigidbody停止觸動另一個?rigidbody/collider時,OnCollisionExit被調用。
?
?
動畫
11.一個簡單的游戲,怪物會走動\攻擊\死亡,游戲角色會走動,跳躍\攻擊\格擋\死亡,還會接受玩家從輸入端輸入的指令,NPC會走動,他們彼此之間可以互相通信.請畫出以上三種角色的UML圖示.
答:
?
12.請描述游戲動畫有哪幾種,以及其原理??
答:主要有關節動畫、單一網格模型動畫(關鍵幀動畫)、骨骼動畫。?
1.關節動畫:把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連接成一個整體的動畫,角色比較靈活,Quake2中使用這種動畫。?
2.單一網格模型動畫由一個完整的網格模型構成,在動畫序列的關鍵幀里記錄各個頂點的原位置及其改變量,然后插值運算實現動畫效果,角色動畫較真實。???
3.骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,有關節相連,可做相對運動,皮膚作為單一網格蒙在骨骼之外,決定角色的外觀,皮膚網格每一個頂點都會受到骨骼的影響,從而實現完美的動畫。
13.反向旋轉動畫的方法是什么?
答:??反轉動畫,將動畫的速度調到-1。
14.寫出Animation的五個方法??
答:AddClip?添加剪輯、Blend?混合、Play?播放、Stop?停止、Sample?采樣?、CrossFade淡入淡出切換動畫、IsPlaying是否正在播放某個動畫?
15.動畫層(AnimationState?Layers)的作用是什么??
答:動畫層作為一個具有層級動畫編輯概念的工具,可以用來制作和處理任何類型的動畫
16.Itween插件的作用是什么,Itween作用于世界坐標還是局部坐標,請列舉出3個其常用方法??
答:ITween是補間動畫的一個插件,主要作用就是給出開始、結束的值、時間,此插件實現各種動畫,晃動,旋轉,移動,褪色,上色,音量控制等等。
?方法:1.MoveTo??物體移動?
2.ColorTo:隨著時間改變對象的顏色組
?3.LookTo:隨時間旋轉物體讓其臉部朝向所提供的Vector3或Transform位置??
17.法線貼圖?、CG動畫??
答:法線貼圖:是一種特殊的紋理,可以應用在3D表面,讓低模呈現出更明顯的凹凸效果。一般應用在CG動畫、美術效果要求較高的單機游戲
CG動畫:游戲中的CG動畫其實是用3D模擬引擎制作的游戲短片,一般畫面效果比較真實。
線程和協程
18.Unity3D是否支持寫成多線程程序?如果支持的話需要注意什么?
答:Unity支持多線程,如果同時要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。
注意:1.雖然支持多線程,但是僅能從主線程中訪問Unity3D的組件,對象和Unity3D系統調用,所以如果使用的話需要把組件中的數值傳到開啟的新線程中。
2.C#中有lock這個關鍵字,以確保只有一個線程可以在特定時間內訪問特定的對象
19.Unity3D的協程和C#線程之間的區別是什么?
答:多線程程序同時運行多個線程,除主線程之外的線程無法訪問Unity3D的對象、組件、方法,而在任一指定時刻只有一個協程在運行。
20.什么是協同程序?
答:在主線程運行時同時開啟另一段邏輯處理,來協助當前程序的執行。換句話說,開啟協程就是開啟一個線程。可以用來控制運動、序列以及對象的行為。
四元數
21.四元數是什么?主要作用什么?對歐拉角的優點是什么??
答:所謂四元數,就是把4個實數組合起來的東西。4個元素中,一個是實部,其余3個是虛部
作用:四元數用于表示旋轉
優點:
1)能進行增量旋轉
2)避免萬向鎖
3)給定方位的表達方式有兩種,互為負(歐拉角有無數種表達方式)
四元數不會有歐拉角存在的?gimbal?lock?問題[萬向節死鎖]?
四元數由4個數組成,旋轉矩陣需要9個數
兩個四元數之間更容易插值?
四元數、矩陣在多次運算后會積攢誤差,需要分別對其做規范化(normalize)和正交化?(orthogonalize),對四元數規范化更容易?
與旋轉矩陣類似,兩個四元組相乘可表示兩次旋轉
攝像機
22.在場景中放置多個Camera并同時處于活動狀態會發生什么?
答:游戲界面可以看到很多攝像機的混合
23.Unity攝像機有幾種工作方式,分別是什么???
答:正交和透視
正交無法看到一個物體距離自己有多遠,或者遠近的變化,物體也不會隨著距離而收縮,所以一般做2D游戲或者是UI時會使用正交攝像機。
透視一般看物體會隨著距離有大小的變化,一般3D游戲里經常使用這種攝像機。
預制物
24.Prefab的作用?如何在移動環境的設備下恰當地使用它?
答:Prefab是預制物,一般當游戲中需要頻繁創建一個物體時,使用預制物可以節省內存,方便創建,方便對游戲物體進行操作,方便對屬性進行修改。
?
unity?當需要頻繁創建一個物體對象時,怎樣減少內存
答:動態加載再實例化,如果自己不主動清理內存的話,再次加載不會增加內存的,會自動去取之前已經加載好的assets,如果這一個assets你都嫌多的話,那你只能減資源了,比如,模型面數,紋理尺寸等
Shader
25.出光照計算中的diffuse的計算公式?
答:實際光照強度l=環境光(lambient)+漫反射光(Idiffuse)+鏡面高光(lspecular)
????環境光:lambient=環境光強度(Aintensity)*環境光顏色(Acolor)
????漫反射光:ldiffuse=鏡面光照強度(Dintensity)*鏡面光顏色(Scolor)*(光的反射向量(R).觀察者向量(V))^鏡面光指數(n)
26.MeshRender中material和shader的區別?
答:MeshRender是模型渲染的組件,有此組件物體才能顯示出來
Material是材質球,實際就是shader的實例,并進行賦值,貼圖、紋理、顏色等。
Shader是著色器,實際上是一段程序,還可以用來實現一些僅靠貼圖不容易實現的效果,如玻璃。
Shader大致分為:1.表面著色器
2.頂點和片元著色器
3.固定功能著色器
27.alpha?blend工作原理?
答:Alpha?Blend是?實現透明效果,Color?=?原顏色*alpha/255+目標色*(255-alpha)/255
28.光照貼圖?的優勢是什么?
答:1.使用光照貼圖比使用實時光源渲染要快
2.可以降低游戲內存消耗?
3.多個物體可以使用同一張光照貼圖??
29.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幾個過程。??
.unity3d提供了幾種光源,分別是什么
?答:4種,Directionl?light?,Point?Light?,Spot?Light,Area?Light
?
Unity系統API
?
物理更新一般在哪個系統函數里?
?答:FixedUpdate,每固定幀繪制時執行一次,和update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate調用次數就會跟著下降。FixedUpdate比較適用于物理引擎的計算,因為是跟每幀渲染有關。Update就比較適合做控制。
?
?
30.OnEnable、Awake、Start運行時的發生順序?哪些可能在同一個對象周期中反復的發生?
答:Awake?–>OnEnable->Start
????OnEnable在同一周期中可以反復地發生
31.Unity3d腳本從喚醒到銷毀有著一套比較完整的生命周期,請列出系統自帶的幾個重要的方法。
答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
32.物理更新一般放在哪個系統函數里?
答:FixedUpdate因為不受到計算機幀頻的影響,所以比較適合于做物理方面的更新。
33.移動攝像機的動作放在哪個系統函數中,為什么放在這個函數中?
答:LateUpdate,在每幀執行完畢調用,它是在所有Update結束后才調,比較適合用于命令腳本的執行。官網上例子是攝像機的跟隨,都是在所有Update操作完才跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現。
34.請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回調函數的意義?
答:當物體是否可見切換之時。可以用于只需要在物體可見時才進行的計算。
?????當renderer(渲染器)在任何相機上都不可見時調用:OnBecameInvisible?當renderer(渲染器)在任何相機上可見時調用:OnBecameVisible??
35.Unity3d提供了一個用于保存和讀取數據的類(PlayerPrefs),請列出保存和讀取整形數據的函數
答:PlayerPrefs.SetInt()
PlayerPrefs.GetInt()
36.動態加載資源的方式?區別是什么?
答:1.Resources.Load();
2.AssetBundle
區別:
Resources是動態內部調用,Resources在編輯環境下是project窗口的一個文件夾,調用里面的資源,可以用Resources類,比如Resources.Load,打包后這個文件夾是不存在的,會統一生成assets資源,AssetBundle?是外部調用,要用AssetBundle?首先要先把資源打包為.assetbundle文件,再動態的去加載這個文件,本地或者網絡服務器都可以。
簡單說,Resources資源的加載是動態加載內部的,AssetBundle?是動態加載外部的
37.以下哪個函數在游戲進入新場景后會被馬上調用??
答:MonoBehaviour.OnLevelWasLoaded??
38.如何銷毀一個UnityEngine.Object及其子類對象
答:Destory
39.獲取、增加、刪除組件的命令分別是什么??
答:獲取:GetComponent?
增加:AddComponent?
沒有刪除組件只有讓組件不生效:enable
40.Application.loadLevel命令是什么?
答:加載關卡?
41.調試記錄到控制臺的命令是什么?
答:?Debug.Log();??
42.LayerMask.NameToLayer()這個方法有什么作用??
答:層索引
43.localPosition與Position的使用區別??
答:localPosition:自身位置,相對于父級的變換的位置,局部坐標其實就是自身的坐標,會隨著物體的旋轉而變化的。?
?Position:在世界坐標transform的位置,世界坐標是不會變的,一直以世界坐標軸的XYZ為標準。
44.物體自身旋轉使用的函數?
答:Transform.Rotate()
45.物體圍繞某點旋轉使用的函數?
答:Transform.RotateAround()
46.U3D中用于記錄節點空間幾何信息的組件名稱,及其父類名稱
答:Transform?父類是?Component
47.寫一個計時器工具,從整點開始計時,格式為:00:00:00??
答:
int?scend;
int?minte;
int?hour;
void?Start()
{
scend=0;
minte=0;
hour=0;
}
void?Update()
{
If(scend<60)
{
Scend+=time.deltime;
}
Else
{
Scend-=60;
Minte+=1;
}
If(minte>=60)
{
??Minte-=60;
??Hour+=1;
}
}
物理引擎
48.<憤怒的小鳥>給予初速度以后,怎么讓小鳥受到重力和空氣阻力的影響而繪制拋物線軌跡,說出具體的計算方法.
答:添加剛體使小鳥模擬受到重力影響。
49.實現吊機吊物體的功能??
1. 答:using UnityEngine; 2. using System.Collections; 3. public class QizhongjiCS : MonoBehaviour { 4. private float dianX = 0; 5. public GameObject hook; 6. private float yuandianX; 7. private Vector3 hookV; 8. private int flag=0; 9. private delegate void HookMove(); 10. private HookMove _hookMove=null; 11. private int speed=3; 12. public HookZhongWu hzw; 13. private int zwFlag=0; 14. private GameObject zhongwu; //抓住的重物; 15. public GameObject shengzi; 16. public GameObject heng; 17. // Use this for initialization 18. void Start () { 19. hookV = hook.transform.localPosition; 20. yuandianX = hookV.x; 21. } 22. // Update is called once per frame 23. void Update () { 24. if (flag == 0) { 25. if (Input.GetMouseButtonDown(0)) 26. { 27. dianX = Input.mousePosition.x; 28. } 29. else if (Input.GetMouseButton(0)) 30. { 31. float dx = Input.mousePosition.x - dianX; 32. if (Mathf.Abs(dx) > 0.1f) 33. { 34. 35. hookV.x = yuandianX + dx / 32; 36. if (hookV.x > -6 && hookV.x < 6) 37. { 38. hook.transform.localPosition = hookV; 39. } 40. 41. } 42. } 43. else if (Input.GetMouseButtonUp(0)) 44. { 45. //yuandianX = hookV.x; 46. flag = 1; 47. _hookMove = hookDown; 48. StartCoroutine(downZhua()); 49. } 50. } 51. } 52. IEnumerator downZhua() { 53. yield return new WaitForSeconds(0.01f); 54. //1、向下移動, +speed 55. //2、判斷移動的位置 如果大于某個位置 ,返回 speed為負 56. if (_hookMove != null) 57. { 58. _hookMove(); 59. yield return StartCoroutine(downZhua()); 60. } 61. else { 62. yield return null; 63. } 64. //3、判斷移動回到原點 整個鉤子向原始位置水平運動 65. //4、判斷鉤子回到原點 停止協程 flag=0 66. yield return StartCoroutine(downZhua()); 67. } 68. void hookDown() { 69. hook.transform.Translate(Vector3.down * Time.deltaTime * speed); changeShengZi(); 70. if (hook.transform.localPosition.y < -2) { 71. if (zwFlag == 1) { 72. zhongwu.transform.parent = null; 73. zhongwu = null; 74. zwFlag = 0; 75. } 76. _hookMove = hookUp; 77. } 78. } 79. void hookUp() 80. { 81. hook.transform.Translate(Vector3.up * Time.deltaTime * speed); 82. changeShengZi(); 83. if (hook.transform.localPosition.y >3.2) 84. { 85. _hookMove = HMove; 86. } 87. } 88. void HMove() 89. { 90. hook.transform.Translate(Vector3.left * Time.deltaTime * speed); 91. if (hook.transform.localPosition.x <=-4.5) 92. { 93. if (zwFlag == 0) 94. { 95. flag = 0; 96. _hookMove = null; 97. } 98. else { 99. _hookMove = hookDown; 100. } 101. } 102. } 103. public void zhuaZhongWu(GameObject zhongwu) { 104. _hookMove = hookUp; 105. zwFlag = 1; 106. this.zhongwu = zhongwu; 107. } 108. void changeShengZi() { 109. Vector3 hookPosition = hook.transform.position; 110. Vector3 hengliangP = heng.transform.position; 111. float dy = hookPosition.y - hengliangP.y; 112. Vector3 shengziP = shengzi.transform.position; 113. shengziP.y = hengliangP.y + dy / 2; 114. shengzi.transform.position = shengziP; 115. //改變 繩子長度 116. Vector3 shengziSclae = shengzi.transform.localScale; 117. shengziSclae.y = dy/2; 118. shengzi.transform.localScale = shengziSclae; 119. } 120. }
HookZhongWu.cs用來判斷?鉤子是否和重物碰撞
碰上的時候?將重物設置成鉤子的子對象??就可以實現帶著往上升的效果了
1. public class HookZhongWu : MonoBehaviour { 2. public QizhongjiCS qzj; 3. void OnTriggerEnter(Collider collision) 4. {//當碰撞時 5. print("OnTriggertEnter+" + collision.gameObject.name); 6. if (collision.gameObject.name == "zhongwu") { 7. collision.gameObject.transform.parent = this.gameObject.transform; 8. Vector3 v = collision.gameObject.transform.localPosition; 9. v.y = -1.2f; 10. collision.gameObject.transform.localPosition = v; 11. qzj.zhuaZhongWu(collision.gameObject); 12. } 13. } 14. }
?
50.上機題:用鼠標實現在場景中拖動物體,用鼠標滾輪實現縮放(用一個Cube即可)。??
答:在場景中添加一個Plan,Camera,Directional?Light,Cube。添加兩個腳本scrollerScirpt(掛在Camera),CubeDragScript(掛在Cube上)。
1.鼠標滾輪實現縮放:將攝像機的鏡頭拉近或者拉遠,調整攝像機的視角就可以實現,主要實現代碼如下:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void Update () {//鼠標滾輪的效果//Camera.main.fieldOfView 攝像機的視野//Camera.main.orthographicSize 攝像機的正交投影//Zoom outif (Input.GetAxis("Mouse ScrollWheel") < 0){if (Camera.main.fieldOfView <= 100) Camera.main.fieldOfView += 2;if (Camera.main.orthographicSize <= 20)Camera.main.orthographicSize += 0.5F; }//Zoom inif (Input.GetAxis("Mouse ScrollWheel") > 0){if (Camera.main.fieldOfView > 2)Camera.main.fieldOfView -= 2;if (Camera.main.orthographicSize >= 1)Camera.main.orthographicSize -= 0.5F;}} |
2.鼠標實現在場景中拖動物體:
解決思路就是將世界坐標轉換成屏幕坐標,然后計算物體與鼠標之間移動量,循環鼠標被按下操作,得到鼠標的當前位置,加上計算好的移動量,將新的坐標賦值給物理就行了。主要是開啟一個協同程序(Corountine)來處理
??主要代碼如下:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //?Use?this?for?initialization ????void?Start?() ????{ ????????StartCoroutine(OnMouseDown()); ????} ? ????IEnumerator?OnMouseDown() ????{ ????????//將物體由世界坐標系轉換為屏幕坐標系 ????????Vector3?screenSpace?=?Camera.main.WorldToScreenPoint(transform.position);//三維物體坐標轉屏幕坐標 ????????//完成兩個步驟?1.由于鼠標的坐標系是2維,需要轉換成3維的世界坐標系?? ????????//????//?????????????2.只有3維坐標情況下才能來計算鼠標位置與物理的距離,offset即是距離 ????????//將鼠標屏幕坐標轉為三維坐標,再算出物體位置與鼠標之間的距離 ????????Vector3?offset?=?transform.position?-?Camera.main.ScreenToWorldPoint(new?Vector3(Input.mousePosition.x,?Input.mousePosition.y,?screenSpace.z)); ????????while?(Input.GetMouseButton(0)) ????????{ ????????????//得到現在鼠標的2維坐標系位置 ????????????Vector3?curScreenSpace?=?new?Vector3(Input.mousePosition.x,?Input.mousePosition.y,?screenSpace.z); ????????????//將當前鼠標的2維位置轉換成3維位置,再加上鼠標的移動量 ????????????Vector3?curPosition?=?Camera.main.ScreenToWorldPoint(curScreenSpace)?+?offset; ????????????//curPosition就是物體應該的移動向量賦給transform的position屬性 ????????????transform.position?=?curPosition; ????????????yield?return?new?WaitForFixedUpdate();?//這個很重要,循環執行 ????????} ????} |
?
51.Material和Physic?Material區別?
答:PhysicMaterial?物理材質:主要是控制物體的摩擦,彈力等物理屬性。?
Material材質:主要是控制一個物體的顏色,質感等顯示。
52.CharacterController和Rigidbody的區別?
答:CharacterController自帶膠囊碰撞器,里面包含有剛體的屬性;
Rigidbody就是剛體,使物體帶有剛體的特征。
53.Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來
答:rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函數中。
54.什么叫做鏈條關節?
答:Hinge?Joint,可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內部相互移動而不產生作用力,但是達到固定距離后就會產生拉力。
55.什么是導航網格(?NavMesh)???
答:?Unity內一種用于實現自動尋路的網格??
56.Unity3d提供了幾種光源類型,分別是哪幾種?
答:四種。
平行光:Directional?Light
點光源:Point?Light
聚光燈:Spot?Light
區域光源:Area?Light
Unity引擎問題
57.簡述Unity3D支持的作為腳本的語言的名稱
答:Unity的腳本語言基于Mono的.Net平臺上運行,可以使用.NET庫,這也為XML、數據庫、正則表達式等問題提供了很好的解決方案。
Unity里的腳本都會經過編譯,他們的運行速度也很快。這三種語言實際上的功能和運行速度是一樣的,區別主要體現在語言特性上。
JavaScript
C#
Boo?
58.向量的點乘、叉乘以及歸一化的意義?
答:1)點乘計算兩個向量之間的夾角,還可表示某一方向的投影
2)叉乘得到的是法向量
3)標準化向量:用在只關系方向,不關心大小的時候
59.矩陣相乘的意義及注意點?
答:用于表示線性變換:旋轉、縮放、投影、平移、仿射
注意:矩陣的蠕變:誤差的積累
60.為什么dynamic?font在unicode環境下優于static?font?
答:Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。
使用動態字體時,Unity將不會預先生成一個與所有字體的字符紋理。當需要支持亞洲語言或者較大的字體的時候,若使用正常紋理,則字體的紋理將非常大。
61.Render的作用?描述MeshRender和SkinnedMeshRender的關系與不同
答:render是渲染器,渲染器可以使物體顯示在屏幕上。
MeshRender是網格渲染,SkinnedMeshRender是蒙皮網格渲染器
62.簡述SkinnedMesh的實現原理
答:骨骼蒙皮動畫,模型本身是靜態的,是因為通過蒙皮,使模型每個點都有Skin數據,Skin數據包括頂點受到哪些骨骼影響以及這些骨骼影響頂點的權重值,還有動畫數據,有了Skin數據的模型就可以根據動畫數據進行顯示動畫了。?
63.為什么Unity3D中會發生在組件上出現數據丟失的情況?
答:組件上綁定的對象被刪除了
64.如何安全的在不同工程間安全地遷移asset數據?三種方法
答:1)將Assets目錄和Library目錄一起遷移
2)導出包
3)用unity自帶的assets?Server功能
65.Lod是什么,優缺點是什么??
答:LOD是Level?of?detail簡稱,意為多層次細節,是最常用的游戲優化技術,LOD技術指根據物體模型的幾點在顯示環境中所處的位置和重要性,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。
???優點:可根據距離動態的選擇渲染不同細節的模型
缺點:增加美工工作量,增大了游戲的容量。
66.兩種陰影判斷的方法、工作原理。?
答:自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出,即假設視點在點光源的位置。
投射陰影:因不透明物體遮擋光線使得場景中位于該物體后面的物體或區域收不到光照照射而形成的陰影。
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,保存這些陰影多邊形信息,然后在按視點位置對場景進行相應處理得到所要求的師徒(利用空間換時間,每次只需依據視點位置進行一次陰影計算即可,省去了一次消隱過程)若是動態光源此方法就無效了。
67.MipMap是什么,作用??
答:MipMapping:在三維計算機圖形的貼圖渲染中有常用的技術,為加快渲染進度和減少圖像鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的文件,這樣的貼圖被稱為MipMap。??
68.用代碼實現第三角色控制器?
答:??
69.Mecanim系統中,Body?Mask的作用是?
答:指定身體的某一部分是否參與渲染??
70.Unity連接數據庫?
答:需要得到Mono.Data.Sqlite.dll?文件與System.Data.dll文件??
71.如何優化內存?
答:1.壓縮自帶類庫
2.將暫時不用的以后還需要使用的物體隱藏起來而不是直接Destroy掉
3.釋放AssetBundle占用的資源
4.降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小
5.使用光照貼圖
6.使用多層次細節(LOD)
7.使用著色器(Shader)
8.使用預設(Prefab)等
72.你用過哪些插件?
答:NGUI/DF/ITeen
m
?
在哪個模塊下可以修改Render?Path?
a.?Camera
b.?Light
c.?Render?settings
d.?ProjectSetting=》Player=》OtherSettings
?
?
圖形圖像
1.什么是渲染管道?
答:是指在顯示器上為了顯示出圖像而經過的一系列必要操作。
渲染管道中的很多步驟,都要將幾何物體從一個坐標系中變換到另一個坐標系中去。
主要有三步:應用程序階段,幾何階段?光柵階段
本地坐標->視圖坐標->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。
2.什么是矢量圖??
答:計算機中顯示的圖形一般可以分為兩大類——矢量圖和位圖。矢量圖使用直線和曲線來描述圖形,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數學公式計算獲得的。例如一幅花的矢量圖形實際上是由線段形成外框輪廓,由外框的顏色以及外框所封閉的顏色決定花顯示出的顏色。由于矢量圖形可通過公式計算獲得,所以矢量圖形文件體積一般較小。矢量圖形最大的優點是無論放大、縮小或旋轉等不會失真;最大的缺點是難以表現色彩層次豐富的逼真圖像效果。
3.什么是矩陣?矩陣運算?
答:矩陣:橫軸排列的二維數據表格
矩陣運算:
加減?限制條件:行和列必須相同,對應相加相減得到結果
乘法?限制條件:要求左矩陣的行和右矩陣的列必須同,行數和左矩陣相等,列數和右矩陣相等,結果的第i行第j列,是左矩陣的第i行和右矩陣的第j列逐個相乘并把結果相加,得到結果是結果?的?第i行第j列
4.角度和弧度的轉換
答:角度和弧度
度和弧度之間的換算??1弧度?=?180度?/pi(約57.3)
???????????????????????1度=pi/180弧度(約0.017)
5.矢量標量
答:矢量有方向如力速度?標量只有大小沒有方向如溫度
矢量取模就是只要大小不要方向
^單位向量?有方向??大小為1的向量
?
矢量的加法:是矢量的幾何和,服從平行四邊形規則
矢量滿足交換律,滿足結合律
?
在直角坐標系中,矢量等于騎在坐標軸上投影的矢量之和(二維矢量可以看做三維矢量的特例也就是說??三維成立,二維也成立)
?
矢量減法:
大小相等?方向相反?稱為逆矢量
?
任意多個矢量首尾相連接組成閉合多邊形,其結果必為0
矢量的乘法:點積(內積、標量積)、叉積(外積)結果是矢量
點積方法?dot
?
?
?
?
Unity面試題1.B??2.?A??3.?B??4.?B??5.?D??6.?D?7.D??8.A??9.B?
?
?
?
?
?
?
?
1.D??2.C??3.C??4.A??5.D??6.B.D??7.B??8.c??9.D??10.a
?
?
?
?
?
答;A
?
???這三題都有了!?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Unity3D常见面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何编写简单的lua小脚本@@
- 下一篇: Unity笔记(正版全阶段)目录