Unity3D面試ABC
楊航最近在學Unity3D
最先執行的方法是:
1、(激活時的初始化代碼)Awake,2、Start、3、Update【FixUpdate、LateUpdate】、4、(渲染模塊)OnGUI、5、再向后,就是卸載模塊(TearDown),這里主要有兩個方法OnDisable與OnDestroy
?
高頻問答的問題:
1.什么是渲染管道?
是指在顯示器上為了顯示出圖像而經過的一系列必要操作。
渲染管道中的很多步驟,都要將幾何物體從一個坐標系中變換到另一個坐標系中去。
主要步驟有:
本地坐標->視圖坐標->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。
2.如何優化內存?
有很多種方式,例如
A、壓縮自帶類庫;
B、將暫時不用的以后還需要使用的物體隱藏起來而不是直接Destroy掉;
C、釋放AssetBundle占用的資源;AssetBundle資源包
D、降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小;
E、使用光照貼圖,使用多層次細節(LOD),使用著色器(Shader),使用預設(Prefab)。
3.動態加載資源的方式?(有時候也問區別,具體請百度)
1.通過Resources模塊,調用它的load函數:可以直接load并返回某個類型的Object,前提是要把這個資源放在Resource命名的文件夾下,Unity不關有沒有場景引用,都會將其全部打入到安裝包中。Resources.Load();
2.通過bundle的形式:即將資源打成?asset?bundle?放在服務器或本地磁盤,然后使用WWW模塊get?下來,然后從這個bundle中load某個object。AssetBundle
3.通過AssetDatabase.loadasset?:這種方式只在editor范圍內有效,游戲運行時沒有這個函數,它通常是在開發中調試用的【AssetDatabase?資源數據庫】
區別:Resources的方式需要把所有資源全部打入安裝包,這對游戲的分包發布(微端)和版本升級(patch)是不利的,所以unity推薦的方式是不用它,都用bundle的方式替代,把資源達成幾個小的bundle,用哪個就load哪個,這樣還能分包發布和patch,但是在開發過程中,不可能沒更新一個資源就打一次bundle,所以editor環境下可以使用AssetDatabase來模擬,這通常需要我們封裝一個dynamic?resource的loader模塊,在不同的環境下做不同實現。
動態資源的存放
??有時我需要存放一些自己的文件在磁盤上,例如我想把幾個bundle放在初始的安裝里,?unity有一個streaming?asset的概念,用于提供存儲接口的訪問。我們需要在編輯器建立一個StreamingAssets名字的文件夾,把需要我們放在客戶磁盤上的動態文件放在這個文件夾下面,這樣安裝后,這些文件會放在用戶磁盤的指定位置,這個位置可以通過Application.streamingAssetsPath來得到。
?
4.什么是協同程序?
在主線程運行時同時開啟另一段邏輯處理,來協助當前程序的執行。換句話說,開啟協程就是開啟一個線程。可以用來控制運動、序列以及對象的行為。
5.你用過哪些插件?
一?界面制作?推薦:NGUI
二?2D游戲制作?推薦:2D?Toolkit???//[?tu:lk?t]?工具包,工具箱
三?可視化編程?推薦:PlayMaker
四?插值插件?推薦:iTween,HOTween
五?路徑搜尋?推薦:Simple?Path
六?美術及動畫制作?推薦:RageSpline,Smooth?Moves
七?畫面增強????推薦:Bitmap2Material,Strumpy?Shader?Editor
八?攝像機管理??推薦:Security?Camera
九?資源包??推薦:Nature?Pack?
十、造路插件EasyRoads3D
6.使用unity3d實現2d游戲,有幾種方式?
1.使用本身的GUI;
2.把攝像機的Projection(投影)值調為Orthographic(正交投影),不考慮z軸;
//[??:θ?'ɡr?f?k]?adj.?正字法的,拼字正確的;正射
3.使用2d插件,如:2DToolKit;
?
7.unity3d中的碰撞器和觸發器的區別?
觸發器只是碰撞器身上的一個屬性,碰撞器是觸發器的載體。
碰撞器有碰撞的效果,IsTrigger=false,可以調用OnCollisionEnter/Stay/Exit函數;
{[k??l??n]n.?碰撞;沖突;(意見,看法)的抵觸;(政黨等的)傾軋}
觸發器沒有碰撞效果,IsTrigger=true,可以調用OnTriggerEnter/Stay/Exit函數。
a.如果不想讓碰撞檢測影響物體移動但是又想檢測到碰撞這時用到觸發器(Trigger)
b.觸發器用來檢測一個物件是否經過空間中的某個區域?
8.物體發生碰撞的必要條件
兩個物體都必須帶有碰撞器(Collider),其中一個物體還必須帶有Rigidbody剛體。
?
8.1?.CharacterController和Rigidbody的區別?
CharacterController自帶膠囊碰撞器,里面包含有剛體的屬性;
Rigidbody就是剛體,使物體帶有剛體的特征。
[CharacterController:角色控制器]
Rigidbody具有完全真實物理的特性,而CharacterController可以說是受限的Rigidbody,具有一定的物理效果但不是完全真實的
?
9.在物體發生碰撞的整個過程中,有幾個階段,分別列出對應的函數
三個階段
1.OnCollisionEnter(進入碰撞)?2.OnCollisionStay?(逗留碰撞)?3.OnCollisionExit(當退出碰撞)?
?
10.Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來
rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函數中。
?
11.什么叫做鏈條關節?
Hinge?Joint,可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內部相互移動而不產生作用力,但是達到固定距離后就會產生拉力。
{?[h?nd?]?n.?鉸鏈,折葉;關鍵,轉折點;樞要,中樞}
12.物體自身旋轉使用的函數?
Transform.Rotate()
?
13.物體圍繞某點旋轉使用的函數?
Transform.RotateAround()
?
14.Unity3d提供了一個用于保存和讀取數據的類(PlayerPrefs),請列出保存和讀取整形數據的函數
PlayerPrefs.SetInt() PlayerPrefs.GetInt()
?
15.Unity3d提供了幾種光源類型,分別是哪幾種?
四種。
平行光:Directional?Light 點光源:Point?Light
聚光燈:Spot?Light 區域光源:Area?Light
16.Unity3d腳本從喚醒到銷毀有著一套比較完整的生命周期,請列出系統自帶的幾個重要的方法。
Awake—>Start—>Update—>FixedUpdate—>LateUpdate—>OnGUI—>Reset—>OnDisable—>OnDestroy
?
17.物理更新一般放在哪個系統函數里?
FixedUpdate,每固定幀繪制時執行一次,和Update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate調用次數就會跟著下降。FixedUpdate比較適用于物理引擎的計算,因為是跟每幀渲染有關。Update就比較適合做控制。
?
18.移動攝像機的動作放在哪個系統函數中,為什么放在這個函數中?
LateUpdate,在每幀執行完畢調用,它是在所有Update結束后才調,比較適合用于命令腳本的執行。官網上例子是攝像機的跟隨,都是在所有Update操作完才跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現。
?
19.當游戲中需要頻繁創建一個物體時,我們需要怎樣做能夠節省內存?
使用預制物體對象Prefab,然后復制創建。
?
20.在場景中放置多個Camera并同時處于活動狀態會發生什么?
游戲界面可以看到很多攝像機的混合。
?
21.請描述Prefab的作用,并描述如何在移動設備的環境下恰當的使用它?
Prefab在實例化的時候用到,主要用于經常會用到的物體,屬性方便修改。
如何銷毀一個UnityEngine.Object及其子類?
使用Destroy()方法;
22.請簡述Unity3d下如何安全的在不同工程間遷移asset數據,請列舉出三種方法?
1.可以把assets目錄和Library目錄一起遷移
2.導出包
3.用Unity帶的assets?Server功能?
23.請描述游戲動畫有哪幾種,以及其原理?
主要有關節動畫、骨骼動畫、單一網格模型動畫(關鍵幀動畫)。
a.關節動畫:把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連接成一?個整體的動畫,角色比較靈活,Quake2中使用這種動畫;
b.骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,有關節相連,可做相對運動,皮膚作為單一網格蒙在骨骼之外,決定角色的外觀;
c.單一網格模型動畫由一個完整的網格模型構成,在動畫序列的關鍵幀里記錄各個頂點的原位置及其改變量,然后插值運算實現動畫效果,角色動畫較真實。
?
24.請描述為什么Unity3d中會發生在組件上出現數據丟失的情況
一般是組件上綁定的物體對象被刪除了
?
25.alpha?blend工作原理
Alpha?Blend?實現透明效果,不過只能針對某塊區域進行alpha操作,透明度可設。
{['?lf?]?透明(度);?[blend]?混合;把…摻在一起}
26.寫出光照計算中的diffuse的計算公式
計算公式為:?Idiffuse?=?Dintensity*Dcolor*N.L?;?(Dintensity表示漫反射強度,?Dcolor?表示漫反射光顏色,?N?為該點的法向量,?L?為光源向量?其中N與L點乘,如果結果小于等于0,則漫反射為0。){[d?'fju:z]?vi.?傳播;四散|intensity[?n'tens?t?]?n.?強烈;(感情的)強烈程度;強度;烈度}
?
27.Lod是什么,優缺點是什么?
LOD(Level?of?detail)多層次細節,是最常用的游戲優化技術。它按照模型的位置和重要程度決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。
?
28.兩種陰影判斷的方法、工作原理。
A.陰影由兩部分組成:本影與半影
a.本影:景物表面上那些沒有被光源直接照射的區域(全黑的輪廓分明的區域)
b.半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的區域(半明半暗區域)
求陰影區域的方法:做兩次消隱過程
一次對每個光源進行消隱,求出對于光源而言不可見的區域L;
一次對視點的位置進行消隱,求出對于視點而言可見的面S;
shadow?area=?L?∩?S
B.陰影分為兩種:自身陰影和投射陰影
自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出,即假設視點在點光源的位置。
投射陰影:因不透明物體遮擋光線使得場景中位于該物體后面的物體或區域受不到光照照射而形成的陰影
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,保存這些陰影多邊形信息,然后再按視點位置對場景進行相應處理得到所要求的視圖(利用空間換時間,每次只需依據視點位置進行一次陰影計算即可,省去了一次消隱過程)
若是動態光源此方法就無效了。
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幾個過程。
?
30.MipMap是什么,作用?
MipMapping:在三維計算機圖形的貼圖渲染中有常用的技術,為加快渲染進度和減少圖像鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的文件,這樣的貼圖被稱為MipMap。
?
31.機試:二選一
1.用代碼實現第三角色控制器
2.實現吊機吊物體的功能
【吊機吊物體需要節點掛接和坐標系轉換】
?
32.反向旋轉動畫的方法是什么?
【反轉動畫,講動畫的速度調到-1,碰撞時,被碰撞物體與碰撞物體有collider組件,碰撞物體有剛體組件,或角色碰撞得包含角色組件?OR?改變animation.speed】
?
33.碰撞檢測需要物體具備什么屬性?
能檢測碰撞發生的方式有兩種,一種是利用碰撞器,另一種則是利用觸發器
【Physics.OverlapSphere相交球檢測碰撞,碰撞檢測需要包圍盒】
?
34.獲取、增加、刪除組件的命令分別是什么?
獲取:GetComponent?增加:AddComponent??刪除:Destroy
?
35.Animation.CrossFade命令作用是:(C)??{Fadevi.?褪去,失去光澤;}
A.動畫放大 B.動畫轉換 C.動畫的淡入為其他動畫
?
36.Application.loadLevel命令為:(A)
A加載關卡 B.異步加載關卡 C.加載動作
?
37.調試記錄到控制臺的命令是什么?
Debug.Log();
?
39.編輯器類存放路徑是什么?
工程目錄下的Assets/Editor文件夾下。
?
40.使用原生GUI創建一個可以拖動的窗口命令是什么?
GUI.DragWindow();
?
41.localPosition與Position的使用區別?
localPosition:自身位置,相對于父級的變換的位置。
Position:在世界坐標transform的位置
?
意義連線
Mathf.Round 插值
Mathf.Clamp 四舍五入
Mathf.Lerp 限制
?
42.寫一個計時器工具,從整點開始計時,格式為:00:00:00
?
43.寫出Animation的五個方法
AddClip?添加剪輯、Blend?混合、Play?播放、Stop?停止、Sample?采樣
?
44.怎么拿到一個對象上腳本的方法
GameObject.GetComponent<>();
?
上機題:用鼠標實現在場景中拖動物體,用鼠標滾輪實現縮放(用一個Cube即可)。
?
45.請簡述向量的點乘,向量的叉乘以及向量歸一化的幾何意義?
點乘的幾何意義是:計算兩個向量之間的夾角,以及在某一方向上的投影;
叉乘的幾何意義是:創建垂直于平面,三角形,或者多邊形的向量;?
?
46..Unity3D是否支持寫成多線程?如果支持的話要注意什么?
支持:如果同時你要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine.{?[k?ru:'ti:n]?n.?協同程序}
注意:C#中有lock這個關鍵字,以確保只有一個線程可以在特定時間內訪問特定的對象
?
?
47.Unity3D中的協程(Coroutine)和C#線程之間的區別是什么?
Unity3d沒有多線程的概念,不過unity也給我們提供了StartCoroutine(協同程序)和LoadLevelAsync(異步加載關卡)后臺加載場景的方法。?StartCoroutine為什么叫協同程序呢,所謂協同,就是當你在StartCoroutine的函數體里處理一段代碼時,利用yield語句等待執行結果,這期間不影響主程序的繼續執行,可以協同工作。而LoadLevelAsync則允許你在后臺加載新資源和場景,所以再利用協同,你就可以前臺用loading條或動畫提示玩家游戲未卡死,同時后臺協同處理加載的事宜asynchronous[e??s??kr?n?s].synchronous同步
48.請簡述四元數的作用以及四元數相對于歐拉角的優點
A.四元數一般定義如下:q=w+xi+yj+zk其中?w,x,y,z是實數。同時,有:?i*i=-1????j*j=-1????k*k=-1
B.四元數也可以表示為:?q=[w,v]
有多種方式可表示旋轉,如?axis/angle、歐拉角(Euler?angles)、矩陣(matrix)、四元組等。?相對于其它方法,四元組有其本身的優點:
a.四元數不會有歐拉角存在的?gimbal?lock?問題[萬向節死鎖]
b.四元數由4個數組成,旋轉矩陣需要9個數
c.兩個四元數之間更容易插值
d.四元數、矩陣在多次運算后會積攢誤差,需要分別對其做規范化(normalize)和正交化?(orthogonalize),對四元數規范化更容易
e.與旋轉矩陣類似,兩個四元組相乘可表示兩次旋轉
49.請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及他們執行的意義?
當renderer(渲染器)在任何相機上都不可見時調用:OnBecameInvisible?
當renderer(渲染器)在任何相機上可見時調用:OnBecameVisible
50.動畫層(Animation?Layers)的作用是什么?
動畫層作為一個具有層級動畫編輯概念的工具,可以用來制作和處理任何類型的動畫
51.
52.請說出4種面向對象的設計原則,并分別簡述它們的含義。
1)?單一職責原則?(The?Single?Responsiblity?Principle,簡稱SRP):一個類,最好只做一件事,只有一個引起它的變化.
2)?開放-封閉原則?(The?Open-Close?Principle,簡稱OCP):對于擴展是開放的,對于更改是封閉的
3)?Liskov?替換原則(The?Liskov?Substitution?Principle,簡稱LSP):子類必須能夠替換其基類
4)?依賴倒置原則(The?Dependency?Inversion?Pricinple,簡稱DIP):依賴于抽象
5)?接口隔離原則?(The?Interface?Segregation?Principle,簡稱ISP):使用多個小的專門的接口,而不要使用一個大的總接口。
53.Material和Physic?Material區別?
PhysicMaterial?物理材質:物理材質描述,如何處理物體碰撞(摩擦,彈性)。
Material材質(材質類)為了獲得一個對象使用的材質,可以使用?Renderer.materia屬性:
54.法線貼圖?、CG動畫
A.法線貼圖:是在原物體的凹凸表面的每個點上均作法線,通過RGB顏色通道來標記法線的方向,你可以把它理解成與原凹凸表面平行的另一個不同的表面,但實際上它又只是一個光滑的平面。?
B.CG動畫:原為Computer?Graphics的英文縮寫。隨著以計算機為主要工具進行視覺設計和生產的一系列相關產業的形成,國際上習慣將利用計算機技術進行視覺設計和生產的領域通稱為CG。它既包括技術也包括藝術,幾乎囊括了當今電腦時代中所有的視覺藝術創作活動,如平面印刷品的設計、網頁設計、三維動畫、影視特效、多媒體技術、以計算機輔助設計為主的建筑設計及工業造型設計等。
NGUI(NUGUI1、NGUI2)
55、NGUI Button怎樣接受用戶點擊并調用函數,具體方法名稱是什么
a、直接監聽事件
把下面腳本直接綁定在按鈕上,當按鈕點擊時就可以監聽到,這種方法不太好很不靈活。
[code]csharpcode:view source print?
1 void?OnClick()
2 {
3 Debug.Log("Button is Click!!!");
4 }
b、SendMessage
選擇Button-Component-NGUI-Interaction-Button Message//[??nt?r'?k?n]n.?一起活動;合作;互相影響;互動
c、UIListener(推薦)
選擇Button-Component-NGUI-Internal-Event Listener
調用方法:
[code]csharpcode:view source print?
01 using?UnityEngine;
02 using?System.Collections;
03 ?
04 public?class?BtnNUGUI : MonoBehaviour {
05 ?
06 ?
07 ????void?Awake()
08 ????{
09 ????????GameObject button = GameObject.Find("UI Root (2D)/Camera/Anchor/Panel/Button");
10 ????????UIEventListener.Get(button).onClick = ButtonClick;
11 ????}
12 ?
13 ????void?ButtonClick(GameObject button)
14 ????{
15 ????????Debug.Log("NGUI button name :"+button.name);
16 ????}
17 ????// Use this for initialization
18 ????void?Start () {
19 ?
20 ????}
21 ?
22 ????// Update is called once per frame
23 ????void?Update () {
24 ?
25 ????}
26 }
?56、請描述游戲動畫有哪幾種,以及其原理。
主要有關節動畫、單一網格模型動畫(關鍵幀動畫)、骨骼動畫。 a、關節動畫把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連接成一個整體的動畫,角色比較靈活Quake2([kwe?k]vi.發抖,顫抖;)中使用了這種動畫;b、 單一網絡模型動畫由一個完整的網格模型構成,在動畫序列的關鍵幀里記錄各個頂點的原位置及其改變量,然后插值運算實現動畫效果,角色動畫較真實。 c、骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,由關節相連,可做相對運動,皮膚作為單一網格蒙在骨骼之外,決定角色的外觀。皮膚網格每一個頂點都會受到骨骼的影響,從而實現完美的動畫
57、下面哪種做法可以打開Unity的Asset?Store
Windows?->?Asset?Store
58、Mecanim系統中,Body?Mask的作用是?
指定身體的某一部分是否參與渲染
59、以下哪種操作步驟可以打開Unity編輯器的Lightmapping視圖?
Windows?-->?Lightmapping
60、關于光照貼圖
A:使用光照貼圖比使用實時光源渲染要快?B:可以降低游戲內存消耗 C、多個物體可以使用同一張光照貼圖
61、關于Vector3的API,以下說法正確的是?
Vector3.forward與Vector3(0,0,1)是一樣的意思;?
62、?以下哪個函數在游戲進入新場景后會被馬上調用?
MonoBehaviour.OnLevelWasLoaded
63、?什么是導航網格(?NavMesh)?
一種用于實現自動尋路的網格
64、什么是局部坐標,什么是世界坐標?
世界坐標是不會變的,一直以世界坐標軸的XYZ為標準。局部坐標其實就是自身的坐標,會隨著物體的旋轉而變化的。
65、itween插件的作用是什么,itween作用于世界坐標還是局部坐標,請列舉出3個其常用方法?
iTween是一個動畫庫,作者創建它的目的就是最小的投入實現最大的產出。讓你做開發更輕松,用它可以輕松實現各種動畫,晃動,旋轉,移動,褪色,上色,控制音頻等等“
方法:a、MoveTo ?物體移動 ;b、ColorTo:隨著時間改變對象的顏色組; c、LookTo:隨時間旋轉物體讓其臉部朝向所提供的Vector3或Transform位置
66、請簡述NGUI中Panel和Anchor的作用
Anchor包含UIAnchor腳本。UIAnchor的功能是把對象錨定在屏幕的邊緣(左上,左中,左下,上,中,下,右上,右中,右下),或縮放物體使其匹配屏幕的尺寸
Panel對象有UIPanel腳本,UIPanel是一個容器,它將包含所有UI小部件,并負責將所包含的部件組合優化,以減少繪制命令的調用。
67、Unity攝像機有幾種工作方式,分別是什么?
?
68、LayerMask.NameToLayer()這個方法有什么作用?
LayerMask的使用是按位操作的,LayerMask.NameToLayer("Players") 返回該Layer的編號。
?69、請描述MeshRender中material和shader的區別?
Shader(著色器)實際上就是一小段程序,它負責將輸入的Mesh(網格)以指定的方式和輸入的貼圖或者顏色等組合作用,然后輸出。繪圖單元可以依據這個輸出來將圖像繪制到屏幕上。輸入的貼圖或者顏色等,加上對應的Shader,以及對Shader的特定的參數設置,將這些內容(Shader及輸入參數)打包存儲在一起,得到的就是一個Material(材質)
Shader大體上可以分為兩類:表面著色器(Surface Shader) 、片段著色器(Fragment Shader)
?70、什么是矢量圖
矢量圖:計算機中顯示的圖形一般可以分為兩大類——矢量圖和位圖。矢量圖使用直線和曲線來描述圖形,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數學公式計算獲得的。例如一幅花的矢量圖形實際上是由線段形成外框輪廓,由外框的顏色以及外框所封閉的顏色決定花顯示出的顏色。由于矢量圖形可通過公式計算獲得,所以矢量圖形文件體積一般較小。矢量圖形最大的優點是無論放大、縮小或旋轉等不會失真;最大的缺點是難以表現色彩層次豐富的逼真圖像效果。
?71、Unity 連接數據庫
需要得到Mono.Data.Sqlite.dll 文件與System.Data.dll文件
72、四元組是什么?
所謂四元數,就是把4個實數組合起來的東西。4個元素中,一個是實部,其余3個是虛部。
------------------------------------------------------------------------------------------
【轉】