Unity3D重要知識點(轉)


Unity3D重要知識點

數據結構和算法很重要!圖形學也很重要!大的游戲公司很看重個人基礎,綜合能力小公司看你實際工作能力,看你的Demo。

 

1.什么是渲染管道?

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

主要步驟有:

本地坐標->視圖坐標->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。

 

2.如何優化內存?

有很多種方式,例如

1.壓縮自帶類庫;

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

3.釋放AssetBundle占用的資源;

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

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

 

3.動態加載資源的方式?

1.Resources.Load();

2.AssetBundle

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 /工具包,工具箱

三 可視化編程 推薦: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軸;

3.使用2d插件,如:2DToolKit;

 

7.Unity3d中的碰撞器和觸發器的區別?

觸發器只是碰撞器身上的一個屬性,碰撞器是觸發器的載體。

碰撞器有碰撞的效果,IsTrigger=false,可以調用OnCollisionEnter/Stay/Exit函數;

觸發器沒有碰撞效果,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,可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內部相互移動而不產生作用力,但是達到固定距離后就會產生拉力。

 

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在實例化的時候用到,主要用於經常會用到的物體,屬性方便修改。

 

22.請簡述Unity3d下如何安全的在不同工程間遷移asset數據,請列舉出三種方法?

1.可以把assets目錄和Library目錄一起遷移

2.導出包

3.用Unity帶的assets Server功能

 

23.請描述游戲動畫有哪幾種,以及其原理?

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

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

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

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

 

24.請描述為什么Unity3d中會發生在組件上出現數據丟失的情況

一般是組件上綁定的物體對象被刪除了

 

25.alpha blend工作原理

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

 

26.寫出光照計算中的diffuse的計算公式

計算公式為: Idiffuse = Dintensity*Dcolor*N.L ; (Dintensity表示漫反射強度,

Dcolor 表示漫反射光顏色,

N 為該點的法向量,

 L 為光源向量 其中N與L點乘,如果結果小於等於0,則漫反射為0。

 

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)

 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的位置

 

42.寫一個計時器工具,從整點開始計時,格式為:00:00:00

 

43.寫出Animation的五個方法

AddClip 添加剪輯、

Blend 混合、

Play 播放、

Stop 停止、

Sample 采樣

 

44.怎么拿到一個對象上腳本的方法

GameObject.GetComponent<>();

 

45.請簡述向量的點乘,向量的叉乘以及向量歸一化的幾何意義?

點乘的幾何意義是:計算兩個向量之間的夾角,以及在某一方向上的投影;

叉乘的幾何意義是:創建垂直於平面,三角形,或者多邊形的向量;

 

46.Unity3D是否支持寫成多線程?如果支持的話要注意什么?

支持:如果同時你要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine.

注意: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.請說出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):使用多個小的專門的接口,而不要使用一個大的總接口。

 

52.Material和Physic Material區別?

PhysicMaterial 物理材質:物理材質描述,如何處理物體碰撞(摩擦,彈性)。

Material材質(材質類)為了獲得一個對象使用的材質,可以使用 Renderer.materia屬性:

 

 

53.法線貼圖 、CG動畫

A.法線貼圖:是在原物體的凹凸表面的每個點上均作法線,通過RGB顏色通道來標記法線的方向,你可以把它理解成與原凹凸表面平行的另一個不同的表面,但實際上它又只是一個光滑的平面。

B.CG動畫:原為Computer Graphics的英文縮寫。隨着以計算機為主要工具進行視覺設計和生產的一系列相關產業的形成,國際上習慣將利用計算機技術進行視覺設計和生產的領域通稱為CG。它既包括技術也包括藝術,幾乎囊括了當今電腦時代中所有的視覺藝術創作活動,如平面印刷品的設計、網頁設計、三維動畫、影視特效、多媒體技術、以計算機輔助設計為主的建築設計及工業造型設計等。 NGUI(NUGUI1、NGUI2)

 

54. 如何銷毀一個UnityEngine.Object及其子類?

使用Destroy()方法;

 

55、請描述游戲動畫有哪幾種,以及其原理。

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

a、關節動畫把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連接成一個整體的動畫,角色比較靈活Quake2([kwe?k]vi.發抖,顫抖;)中使用了這種動畫;

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

c、骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,由關節相連,可做相對運動,皮膚作為單一網格蒙在骨骼之外,決定角色的外觀。皮膚網格每一個頂點都會受到骨骼的影響,從而實現完美的動畫

 

56、下面哪種做法可以打開Unity的Asset Store

Windows -> Asset Store

 

57、Mecanim系統中,Body Mask的作用是?

指定身體的某一部分是否參與渲染

 

58、以下哪種操作步驟可以打開Unity編輯器的Lightmapping視圖?

Windows --> Lightmapping

 

59、關於光照貼圖

A:使用光照貼圖比使用實時光源渲染要快

B:可以降低游戲內存消耗

C、多個物體可以使用同一張光照貼圖

 

60、關於Vector3的API,以下說法正確的是?

Vector3.forward與Vector3(0,0,1)是一樣的意思;

 

61、 什么是導航網格( NavMesh)?

一種用於實現自動尋路的網格

 

62、什么是局部坐標,什么是世界坐標?

世界坐標是不會變的,一直以世界坐標軸的XYZ為標准。局部坐標其實就是自身的坐標,會隨着物體的旋轉而變化的。

 

63、itween插件的作用是什么,itween作用於世界坐標還是局部坐標,請列舉出3個其常用方法?

iTween是一個動畫庫,作者創建它的目的就是最小的投入實現最大的產出。讓你做開發更輕松,用它可以輕松實現各種動畫,晃動,旋轉,移動,褪色,上色,控制音頻等等“

方法:

a、MoveTo 物體移動 ;

b、ColorTo:隨着時間改變對象的顏色組;

c、LookTo:隨時間旋轉物體讓其臉部朝向所提供的Vector3或Transform位置

 

64、請簡述NGUI中Panel和Anchor的作用

Anchor包含UIAnchor腳本。UIAnchor的功能是把對象錨定在屏幕的邊緣(左上,左中,左下,上,中,下,右上,右中,右下),或縮放物體使其匹配屏幕的尺寸Panel對象有UIPanel腳本,UIPanel是一個容器,它將包含所有UI小部件,並負責將所包含的部件組合優化、承載,以減少繪制命令的調用。

 

65、Unity攝像機有幾種工作方式,分別是什么?

perspective透視攝像機和orthographic正交攝像機

 

66、LayerMask.NameToLayer()這個方法有什么作用?

LayerMask的使用是按位操作的,LayerMask.NameToLayer("Players") 返回該Layer的編號。

 

67、請描述MeshRender中material和shader的區別?

Shader(着色器)實際上就是一小段程序,它負責將輸入的Mesh(網格)以指定的方式和輸入的貼圖或者顏色等組合作用,然后輸出。繪圖單元可以依據這個輸出來將圖像繪制到屏幕上。輸入的貼圖或者顏色等,加上對應的Shader,以及對Shader的特定的參數設置,將這些內容(Shader及輸入參數)打包存儲在一起,得到的就是一個Material(材質)

Shader大體上可以分為兩類:

表面着色器(Surface Shader) 、

片段着色器(Fragment Shader)

 

68、什么是矢量圖

矢量圖:計算機中顯示的圖形一般可以分為兩大類——矢量圖和位圖。矢量圖使用直線和曲線來描述圖形,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數學公式計算獲得的。例如一幅花的矢量圖形實際上是由線段形成外框輪廓,由外框的顏色以及外框所封閉的顏色決定花顯示出的顏色。由於矢量圖形可通過公式計算獲得,所以矢量圖形文件體積一般較小。矢量圖形最大的優點是無論放大、縮小或旋轉等不會失真;最大的缺點是難以表現色。

 

69. 上機題:用鼠標實現在場景中拖動物體,用鼠標滾輪實現縮放(用一個Cube即可)。

 

70、 以下哪個函數在游戲進入新場景后會被馬上調用?

MonoBehaviour.OnLevelWasLoaded

 

71、Unity3D方法執行的順序:

1、Awake( ),2、Start( )(激活時的初始化代碼)

3、Update( )【FixUpdate、LateUpdate】、

4、OnGUI(渲染模塊)

5、然后是卸載模塊(TearDown),這里主要有兩個方法OnDisable( )與OnDestroy( )

 

72.數學函數

Mathf.Round;  Mathf.Clamp 插值 四舍五入;   Mathf.Lerp 限制

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM