Unity3D面試題整合

目錄

 

第一部分:

第二部分:

第三部分:

第四部分:


第一部分:

1、C#有幾種數據類型?

答:C#通常分爲三種數據類型:值類型(ValueType)、引用類型(Reference types)和指針類型(Pointer types)。

值類型可以直接分配給一個值。它們是從類 System.ValueType 中派生的。值類型直接包含數據。比如 int、char、float,它們分別存儲數字、字符、浮點數。當您聲明一個 int 類型時,系統分配內存來存儲值。

引用類型不包含存儲在變量中的實際數據,但它們包含對變量的引用。換句話說,它們指的是一個內存位置。使用多個變量時,引用類型可以指向一個內存位置。如果內存位置的數據是由一個變量改變的,其他變量會自動反映這種值的變化。內置的 引用類型有:objectdynamic 和 string

指針類型變量存儲另一種類型的內存地址。C# 中的指針與 C 或 C++ 中的指針有相同的功能。

值類型與引用類型:

值類型:簡單類型+枚舉類型+結構體類型

引用類型:類類型+數組類型+接口類型+委託類型

 

2、請簡述值類型與引用類型的區別?

答:1.值類型存儲在內存棧中,引用類型數據存儲在內存堆中,而內存單元中存放的是堆中存放的地址。
2.值類型存取快,引用類型存取慢。
3.值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針和引用。
4.棧的內存是自動釋放的,堆內存是.NET中會由GC來自動釋放。
5.值類型繼承自System.ValueType,引用類型繼承自System.Object。

 

3、C#中所有引用類型的基類是什麼?

答:引用類型的基類是System.Object,而值類型的基類是System.ValueType。同時,值類型也隱式繼承自System.Object。

 

4、請簡述ArrayList和List<Int>的主要區別?

答:ArrayList存在不安全類型‘(ArrayList會把所有插入其中的數據都當做Object來處理)裝箱拆箱的操作(費時)。List是接口,ArrayList是一個實現了該接口的類,可以被實例化。

 

5、請簡述GC(垃圾回收)產生的原因,並描述如何避免?
答:GC回收堆上的內存
避免:1)減少new產生對象的次數
2)使用公用的對象(靜態成員)
3)將String換爲StringBuilder

 

6、請描述Interface與抽象類之間的不同?
答:抽象類表示該類中可能已經有一些方法的具體定義,但接口就是公共只能定義各個方法的界面 ,不能具體的實現代碼在成員方法中。
抽象類是子類用來繼承的,當父類已經有實際功能的方法時該方法在子類中可以不必實現,直接引用父類的方法,子類也可以重寫該父類的方法。
實現接口的時候必須要實現接口中所有的方法,不能遺漏任何一個。首先,abstract class 在 c# 語言中表示的是一種繼承關係,一個類只能使用一次繼承關係(因爲c#不支持多繼承 -- 轉註)。但是,一個類卻可以實現多個interface。

 

7、下列代碼在運行中會發生什麼問題?如何避免?

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是隻讀的。不能一邊遍歷一邊修改。

 

8、請簡述關鍵字Sealed用在類聲明和函數聲明時的作用?
答:類聲明時可防止其他類繼承此類,在方法中聲明則可防止派生類重寫此方法。

 

9、請簡述private,public,protected,internal的區別。
答:public:對任何類和成員都公開,無限制訪問
private:僅對該類公開
protected:對該類和其派生類公開
internal:只能在包含該類的程序集中訪問該類
protected internal:protected + internal

 

10、反射的實現原理?

答:審查元數據並收集關於它的類型信息的能力。反射個人認爲,就是得到程序集中的屬性和方法。
實現步驟:
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.mInfo.Invoke(null,方法參數);

 

11、.Net與Mono的關係?

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

 

12、簡述Unity3D支持的作爲腳本的語言的名稱?
答:Unity的腳本語言基於Mono的.Net平臺上運行,可以使用.NET庫,這也爲XML、數據庫、正則表達式等問題提供了很好的解決方案。Unity裏的腳本都會經過編譯,他們的運行速度也很快。這三種語言實際上的功能和運行速度是一樣的,區別主要體現在語言特性上。JavaScript:和網頁中常用的JavaScript不一樣,它編譯後的運行速度很快,語法方面也會有不少區別;C#:類似於Java編程語言的變異型語言;Boo:可以看做是Python語言的變種,又糅合了Ruby和C#的特性,它是靜態類型語言。

 

13、Unity3D是否支持寫成多線程程序?如果支持的話需要注意什麼?
答:參考https://blog.csdn.net/husheng0/article/details/46954473
僅能從主線程中訪問Unity3D的組件,對象和Unity3D系統調用
支持:如果同時你要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。
注意:C#中有lock這個關鍵字,以確保只有一個線程可以在特定時間內訪問特定的對象。

 

14、Unity3D的協程和C#線程之間的區別是什麼?
答:http://blog.csdn.net/kongbu0622/article/details/8775037
多線程程序同時運行多個線程 ,而在任一指定時刻只有一個協程在運行,並且這個正在運行的協同程序只在必要時才被掛起。除主線程之外的線程無法訪問Unity3D的對象、組件、方法。
Unity3d沒有多線程的概念,不過unity也給我們提供了StartCoroutine(協同程序)和LoadLevelAsync(異步加載關卡)後臺加載場景的方法。 StartCoroutine爲什麼叫協同程序呢,所謂協同,就是當你在StartCoroutine的函數體裏處理一段代碼時,利用yield語句等待執行結果,這期間不影響主程序的繼續執行,可以協同工作。而LoadLevelAsync則允許你在後臺加載新資源和場景,所以再利用協同,你就可以前臺用loading條或動畫提示玩家遊戲未卡死,同時後臺協同處理加載的事宜asynchronous[e ɪˈ s ɪŋ kr ə n ə s] .synchronous同步。

 

15、U3D中用於記錄節點空間幾何信息的組件名稱,及其父類名稱?
答:Transform 父類是 Component

 

16、簡述四元數的作用,四元數對歐拉角的優點?
答:四元數用於表示旋轉,相對歐拉角的優點:
1)能進行增量旋轉
2)避免萬向鎖,存儲空間小,計算效率高
3)給定方位的表達方式有兩種,互爲負(歐拉角有無數種表達方式)

 

17、向量的點乘、叉乘以及歸一化的意義?
1)點乘描述了兩個向量的相似程度,結果越大兩向量越相似,還可表示投影
2)叉乘得到的向量垂直於原來的兩個向量
3)標準化向量:用在只關係方向,不關心大小的時候

 

18、矩陣相乘的意義及注意點?
用於表示線性變換:旋轉、縮放、投影、平移、仿射
注意矩陣的蠕變:誤差的積累

 

19、爲何大家都在移動設備上尋求U3D原生GUI的替代方案?
不美觀,OnGUI很耗費時間,使用不方便 ,DrawCall

 

20、請簡述如何在不同分辨率下保持UI的一致性?
NGUI很好的解決了這一點,屏幕分辨率的自適應性,原理就是計算出屏幕的寬高比跟原來的預設的屏幕分辨率求出一個對比值,然後修改攝像機的size。首先通過UGUI進行自適應,然後通過下列代碼實現:

        float globalRate = 1.0F * Constants.ScreenStandardHeight / Screen.height;
        float screenWidth = Screen.width * globalRate;

 

21、爲什麼dynamic font在unicode環境下優於static font?

答:Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。使用動態字體時,Unity將不會預先生成一個與所有字體的字符紋理。當需要支持亞洲語言或者較大的字體的時候,若使用正常紋理,則字體的紋理將非常大。

 

22、Render的作用?描述MeshRender和SkinnedMeshRender的關係與不同?
A renderer is what makes an object appear on the screen,渲染器使對象出現在屏幕上。
Mesh就是指模型的網格(同名組件是用於調整網格屬性的),MeshFilter一般是用於獲得模型網格的組件,而MeshRender是用於把網格渲染出來的組件

 

23、簡述SkinnedMesh的實現原理?
答:http://blog.csdn.net/n5/article/details/3105872

Skinned Mesh中文一般稱作骨骼蒙皮動畫,正如其名,這種動畫中包含骨骼(Bone)和蒙皮(Skinned Mesh)兩個部分,Bone的層次結構和關節動畫類似,Mesh則和關節動畫不同:關節動畫中是使用多個分散的Mesh,而Skinned Mesh中Mesh是一個整體,也就是說只有一個Mesh,實際上如果沒有骨骼讓Mesh運動變形,Mesh就和靜態模型一樣了。Skinned Mesh技術的精華在於蒙皮,所謂的皮並不是模型的貼圖(也許會有人這麼想過吧),而是Mesh本身,蒙皮是指將Mesh中的頂點附着(綁定)在骨骼之上,而且每個頂點可以被多個骨骼所控制,這樣在關節處的頂點由於同時受到父子骨骼的拉扯而改變位置就消除了裂縫。Skinned Mesh這個詞從字面上理解似乎是有皮的模型,哦,如果貼圖是皮,那麼普通靜態模型不也都有嗎?所以我覺得應該理解爲具有蒙皮信息的Mesh或可當做皮膚用的Mesh,這個皮膚就是Mesh。而爲了有皮膚功能,Mesh還需要蒙皮信息,即Skin數據,沒有Skin數據就是一個普通的靜態Mesh了。Skin數據決定頂點如何綁定到骨骼上。頂點的Skin數據包括頂點受哪些骨骼影響以及這些骨骼影響該頂點時的權重(weight),另外對於每塊骨骼還需要骨骼偏移矩陣(BoneOffsetMatrix)用來將頂點從Mesh空間變換到骨骼空間。在本文中,提到骨骼動畫中的Mesh特指這個皮膚Mesh,提到模型是指骨骼動畫模型整體。

 

24、在場景中放置多個Camera並同時處於活動狀態會發生什麼?
答:遊戲界面可以看到很多攝像機的混合

 

25、Prefab的作用?如何在移動環境的設備下恰當地使用它?
答:Prefab在實例化的時候用到,主要用於經常會用到的物體,屬性方便修改

 

26、如何銷燬一個UnityEngine.Object及其子類?
答:Destory

 

27、爲什麼Unity3D中會發生在組件上出現數據丟失的情況?
答:組件上綁定的對象被刪除了

 

28、如何安全的在不同工程間安全地遷移asset數據?三種方法?

答:將Assets目錄和Library目錄一起遷移;
導出包;
用unity自帶的assets Server功能。

 

29、MeshCollider和其他Collider的一個主要不同點?
答:Meshcollider再快也是基於頂點的~~ 建議還是用boxcollider,boxcollider本身是基於算法,沒有面的概念。

 

30、當一個細小的高速物體撞向另一個較大的物體時,會出現什麼情況?如何避免?
穿透(碰撞檢測失敗)
http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed
(碰撞體變大,FixedUpdate, 代碼限制)

 

31、OnEnable、Awake、Start運行時的發生順序?哪些可能在同一個對象週期中反覆的發生?
答:Awake -》OnEnable-》Start,OnEnable在同一週期中可以反覆地發生。

 

32、請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回調函數的意義?
答:當物體是否可見切換之時。可以用於只需要在物體可見時才進行的計算。


33、Unity3D如何獲知場景中需要加載的數據?
答:題目是獲取的意思?Resource.Load、AssetBundle

 

34、MeshRender中material和sharedmaterial的區別?
修改sharedMaterial將改變所有物體使用這個材質的外觀,並且也改變儲存在工程裏的材質設置。
不推薦修改由sharedMaterial返回的材質。如果你想修改渲染器的材質,使用material替代。

 

第二部分:

1、請描述遊戲動畫有哪幾種,以及其原理?
主要有關節動畫、單一網格模型動畫(關鍵幀動畫)、骨骼動畫。
關節動畫把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連接成一個整體的動畫,角色比較靈活Quake2中使用了這種動畫。
單一網絡模型動畫由一個完整的網格模型構成,在動畫序列的關鍵幀裏記錄各個頂點的原位置及其改變量,然後插值運算實現動畫效果,角色動畫較真實。
骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,由關節相連,可做相對運動,皮膚作爲單一網格蒙在骨骼之外,決定角色的外觀。皮膚網格每一個頂點都會受到骨骼的影響,從而實現完美的動畫。(骨骼動畫是由關節動畫發展而來的,如今基本都使用骨骼動畫來實現角色動畫)


2、alpha blend 工作原理?
實際顯示顏色 = 前景顏色*Alpha/255 + 背景顏色*(255-Alpha)/255


3、寫光照計算中的diffuse的計算公式?
實際光照強度 I= 環境光(Iambient) + 漫反射光(Idiffuse) + 鏡面高光(Ispecular);
環境光:Iambient= Aintensity* Acolor; (Aintensity表示環境光強度,Acolor表示環境光顏色)
漫反射光:Idiffuse = Dintensity*Dcolor*N.L;
(Dintensity表示漫反射強度,Dcolor表示漫反射光顏色,N爲該點的法向量,L爲光源向量)
鏡面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;
(Sintensity表示鏡面光照強度,Scolor表示鏡面光顏色,R爲光的反射向量,V爲觀察者向量,n稱爲鏡面光指數)

 

4、lod是什麼,優缺點是什麼?
LOD技術即Levels of Detail的簡稱,意爲多細節層次。LOD技術指根據物體模型的節點在顯示環境中所處的位置和重要度,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。
優點:可根據距離動態地選擇渲染不同細節的模型
缺點:加重美工的負擔,要準備不同細節的同一模型,同樣的會稍微增加遊戲的容量。


5、兩種陰影判斷的方法工作原理?
陰影由兩部分組成:本影與半影
本影:景物表面上那些沒有被光源直接照射的區域(全黑的輪廓分明的區域)
半影:景物表面上那些被某些特定光源直接照射但並非被所有特定光源直接照射的區域(半明半暗區域)
求陰影區域的方法:做兩次消隱過程
一次對每個光源進行消隱,求出對於光源而言不可見的區域L;
一次對視點的位置進行消隱,求出對於視點而言可見的面S;
shadow area= L ∩ S
陰影分爲兩種:自身陰影和投射陰影
自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出,即假設視點在點光源的位置。
投射陰影:因不透明物體遮擋光線使得場景中位於該物體後面的物體或區域受不到光照照射而形成的陰影
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,保存這些陰影多邊形信息,然後再按視點位置對場景進行相應處理得到所要求的視圖(利用空間換時間,每次只需依據視點位置進行一次陰影計算即可,省去了一次消隱過程)
若是動態光源此方法就無效了。

 

5、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幾個過程。


6、MipMap是什麼?作用?
在三維計算機圖形的貼圖渲染中有一個常用的技術被稱爲Mipmapping。爲了加快渲染速度和減少圖像鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的文件,這樣的貼圖被稱爲 MIP map 或者 mipmap。

 

7、用u3d實現2d遊戲,有幾種方式?
1.利用引擎自帶的GUI
2.把攝像機設爲Orthographic,用面片作爲2d元素
3.利用第三方插件:NGUI、2dToolkit

 

攝像機的投射類型

正交Orthographic(無消失點投影)

無法判斷距離

正交視圖無法看到一個物體是遠離自己還是正在我們面前。爲什麼?

因爲它不會根據距離收縮。所以如果你如果你畫一個固定大小的物體在視點前面,同時畫一個同樣大小的物體在第一個物體的遠後方,你無法說那個物體是第一個。

因爲兩個都是一樣的大小,根距離無關。他們不會隨着距離而收縮。

UI或2D遊戲使用正交相機

通常我們在unity中製作2D UI,或是2D遊戲的時候,就會把Camera的投射選擇此項,例如NGUI的UICamera組件,默認的視圖就是正交,還有2DTookit,也會把Main Camera的視圖選擇成正交。

透視Perspective(有消失點投影)

透視視圖和我們從眼睛看到的視圖是一樣的。

例子:遠小近大

一個高個子的人站在你面前,他看上去是很高的。

但是如果這個高個子站在100米以外,他甚至還沒有你的拇指大。他看上去會隨着距離而縮小,但是我們實際上都知道,它依然是個高個子。這種效果叫做透視。

例子中提到的兩個物體,第二個物體將會顯示地更小,所以我們可以區分哪個是離我們近的物體,那個是離我們遠的物體。


8、u3d中碰撞器和觸發器的區別?
collider碰撞器會有碰撞的效果,IsTrigger = false,可以調用OnCollisionEnter/Stay/Exit函數
trigger觸發器沒有碰撞效果,isTrigger = true,可以調用OnTriggerEnter/stay/exit函數


9、物體發生碰撞的必要條件?
物體A必須帶有(collider+rigidbody)或者CharacterController,另一個物體也必須至少帶有collider


10、CharacterController和Rigidbody的區別?
Rigidbody具有完全真實物理的特性,而CharacterController可以說是受限的Rigidbody,具有一定的物理效果但不是完全真實的。


11、物體發生碰撞時,有幾個階段,分別對應的函數?
三個階段,OnCollisionEnter/Stay/Exit函數


12、u3d中,幾種施加力的方式,描述出來?
rigidbody.AddForce/AddForceAtPosition,都是rigidbody的成員函數

 

13、什麼叫做鏈條關節?
Hinge Joint ,他可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內部相互移動而不產生作用力,但是達到固定距離後就會產生拉力。(簡單說就是彈簧)


14、物體自旋轉使用的函數叫什麼?
transform.Rotate


15、物體繞某點旋轉使用函數叫什麼?
transform.RotateAround

 

16、u3d提供了一個用於保存讀取數據的類,(playerPrefs),請列出保存讀取整形數據的函數?
PlayerPrefs.SetInt 與 PlayerPrefs.GetInt


17、unity3d提供了幾種光源,分別是什麼?
平行光:Directional Light
聚光燈:Spot Light
點光源:Point Light
區域光源:Area Light(只用於烘培)

 

18、unity3d從喚醒到銷燬有一段生命週期,請列出系統自己調用的幾個重要方法?
Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –> OnGUI –> Reset –> OnDisable –> OnDestroy


19、物理更新一般在哪個系統函數裏?
FixedUpdate,每固定幀繪製時執行一次,和update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候,FixedUpdate調用次數就會跟着下降。FixedUpdate比較適用於物理引擎的計算,因爲是跟每幀渲染有關。Update就比較適合做控制。


20、移動相機動作在哪個函數裏,爲什麼在這個函數裏?
LateUpdate,是在所有update結束後才調用,比較適合用於命令腳本的執行。官網上例子是攝像機的跟隨,都是在所有update操作完纔跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現。

 

21、當遊戲中需要頻繁創建一個物體對象時,我們需要怎麼做來節省內存?
做一個pool,遊戲開始時預先實例化足夠的數量,然後用的時候取不用的時候收回


22、一個場景放置多個camera並同時處於活動狀態,會發生什麼?
實際看到的畫面由多個camera的畫面組成,由depth、Clear Flag、Culling Mask都會影響最終合成效果。


23、簡述prefab的用處和環境?
在遊戲運行時實例化,prefab相當於一個模版,對你已有的素材、腳本、參數做一個默認配置,以便於以後修改,同時prefab打包的內容簡化了導出的操作,便於團隊的交流。


24、如何銷燬一個UnityEngine.Object以及其子類?
Destroy


25、爲什麼u3d會出現組件上數據丟失的情況?
一般是組件上綁定的物體對象被刪除了


26、u3d下如何安全的在不同工程遷移asset數據?
方法1,可以把assets目錄和Library目錄一起遷移,
方法2,導出包
方法3,用unity帶的assets server功能 

 

第三部分:

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

 

2、如何優化內存?
有很多種方式,例如
1.壓縮自帶類庫;
2.將暫時不用的以後還需要使用的物體隱藏起來而不是直接Destroy掉;
3.釋放AssetBundle佔用的資源;
4.降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小;
5.使用光照貼圖,使用多層次細節(LOD),使用着色器(Shader),使用預設(Prefab)。

 

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

AssetBundle的定義和作用

1,AssetBundle是一個壓縮包包含模型、貼圖、預製體、聲音、甚至整個場景,可以在遊戲運行的時候被加載;

  2,AssetBundle自身保存着互相的依賴關係;

  3,壓縮包可以使用LZMA和LZ4壓縮算法,減少包大小,更快的進行網絡傳輸;

  4,把一些可以下載內容放在AssetBundle裏面,可以減少安裝包的大小;

什麼是AssetBundle

可以歸爲兩點:

1,它是一個存在於硬盤上的文件。可以稱之爲壓縮包。這個壓縮包可以認爲是一個文件夾,裏面包含了多個文件。這些文件可以分爲兩類:serialized file 和 resource files。(序列化文件和源文件)

serialized file:資源被打碎放在一個對象中,最後統一被寫進一個單獨的文件(只有一個)

resource files:某些二進制資源(圖片、聲音)被單獨保存,方便快速加載

2,它是一個AssetBundle對象,我們可以通過代碼從一個特定的壓縮包加載出來的對象。這個對象包含了所有我們當初添加到這個壓縮包裏面的內容,我們可以通過這個對象加載出來使用
 


4、什麼是協同程序?
在主線程運行時同時開啓另一段邏輯處理,來協助當前程序的執行。換句話說,開啓協程就是開啓一個線程。可以用來控制運動、序列以及對象的行爲。

 

5、你用過哪些插件?
(最好多熟悉幾個插件,問的時候好回答)

NGUI:NGUI是Unity最重要的插件之一。使用NGUI可以高效地爲遊戲添加界面。NGUI是嚴格遵循KISS原則並用C#編寫的Unity(適用於專業版和免費版)插件,提供強大的UI系統和事件通知框架。其代碼簡潔,多數類少於200行代碼。這意味着程序員可以很容易地擴展NGUI的功能或調節已有功能。對所有其他用戶而言,這意味着更高的性能、更低的學習難度和更加有趣。完全集成到Inspector面板中。(以上來自於百度百科)獲取NGUI的方式也很簡單,直接進入AssetStore中下載就好啦!

NGUI與UGUI的區別:

   1) uGUI的Canvas 有世界座標和屏幕座標
   2) uGUI的Image可以使用material  
   3) UGUI通過Mask來裁剪,而NGUI通過Panel的Clip 
   4) NGUI的渲染前後順序是通過Widget的Depth,而UGUI渲染順序根據Hierarchy的順序,越下面渲染在頂層. 
   5) UGUI 不需要綁定Colliders,UI可以自動攔截事件
   6) UGUI的Anchor是相對父對象,沒有提供高級選項,個人感覺uGUI的Anchor操作起來比NGUI更方便
   7) UGUI沒有Atlas一說,使用Sprite Packer 
   8) UGUI的Navigation在Scene中能可視化
   9) UGUI的事件需要實現事件系統的接口,但寫起來也算簡單
各自的優缺點:

   1) NGUI還保留着圖集,需要進行圖集的維護。而UGUI沒有圖集的概念,可以充分利用資源,避免重複資源。
   2) UGUI出現了錨點的概念,更方便屏幕自適應。 
   3) NGUI支持圖文混排,UGUI暫未發現支持此功能。 
   4) UGUI沒有 UIWrap 來循環 scrollview 內容。 
   5) UGUI暫時沒有Tween組件。

Dotween插件:https://blog.csdn.net/ldy597321444/article/details/51853184

在NGUI中提供了UITween 
來支持UI的動畫編寫,極度降低了代碼的複雜度

然而,我們的UGUI中並沒有類似UITween的功能進行支撐 
所以我們用到了第三方插件 DoTween

在我們Unity官方的UGUI的Demo中UI的動畫是使用Animator來製作的,試想一下,如果我們的UI如果需要動畫效果,那麼就需要使用 AnimationController,除此之外,還需要去編輯動畫,如果數量不多 的UI可以這樣,如果UI過多的需要動畫,那麼工作量就有些龐大了。所以現在市面上絕大多數使用UGUI開發的公司都使用了DoTween來 輔助完成UI動畫的設計,當然,DoTween也可以應用到3D物體上。

 

第四部分:

1、在類的構造函數前加上static會報什麼錯?爲什麼?
構造函數格式爲 public+類名如果加上static會報錯(靜態構造函數不能有訪問修飾符)
原因:靜態構造函數不允許訪問修飾符,也不接受任何參數; 
無論創建多少類型的對象,靜態構造函數只執行一次; 
運行庫創建類實例或者首次訪問靜態成員之前,運行庫調用靜態構造函數; 
靜態構造函數執行先於任何實例級別的構造函數; 
顯然也就無法使用this和base來調用構造函數。


2、C# String類型比stringBuilder類型的優勢是什麼?
如果是處理字符串的話,用string中的方法每次都需要創建一個新的字符串對象並且分配新的內存地址,而stringBuilder是在原來的內存裏對字符串進行修改,所以在字符串處理方面還是建議用stringBuilder這樣比較節約內存。但是string 類的方法和功能仍然還是比stringBuilder類要強。
string類由於具有不可變性(即對一個string對象進行任何更改時,其實都是創建另外一個string類的對象),所以當需要頻繁的對一個string類對象進行更改的時候,建議使用StringBuilder類,StringBuilder類的原理是首先在內存中開闢一定大小的內存空間,當對此StringBuilder類對象進行更改時,如果內存空間大小不夠,會對此內存空間進行擴充,而不是重新創建一個對象,這樣如果對一個字符串對象進行頻繁操作的時候,不會造成過多的內存浪費,其實本質上並沒有很大區別,都是用來存儲和操作字符串的,唯一的區別就在於性能上。
String主要用於公共API,通用性好、用途廣泛、讀取性能高、佔用內存小。
StringBuilder主要用於拼接String,修改性能好。
不過現在的編譯器已經把 String 的 + 操作優化成 StringBuilder 了,所以一般用String就可以了
String是不可變的,所以天然線程同步。
StringBuilder可變,非線程同步

6、NGUI Button怎樣接受用戶點擊並調用函數,具體方法名稱是什麼?
OnClick()
主要是在UICamera腳本中用射線判斷點擊的物體並通過SendMessage調用OnClick() OnPress()等函數,可以說NGUI的按鈕是通過發消息這個方式調用的。

8、<憤怒的小鳥>給予初速度以後,怎麼讓小鳥受到重力和空氣阻力的影響而繪製拋物線軌跡,說出具體的計算方法.

Vector3 v代表初速度v'代表現在的速度,假設小鳥是沿的z軸也就是transform.forward方向運動的質量爲1,那麼v‘=v-new Vector3(0,g*t,f*t),transform.Translate(v')做的就是拋物線運動(g爲重力加速度不要用現實中的需要自己調試,f爲阻力也要自己調試設置,t爲時間)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章