unity3D面試彙總

轉載自:(http://blog.csdn.net/dingxiaowei2013/article/details/25960193)

最先執行的方法是:

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:

1void 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:

01using UnityEngine;
02using System.Collections;
03 
04public 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個是虛部。


——————————————————————————————

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