在Unity社區分享經驗,你也有機會獲得官方推薦!發稿入口:unity.cn/articles
更多Unity博主專屬權益見文末
其實學習Unity3D引擎,我們除了懂得實操,同時兼顧理解一些理論知識,也是挺不錯的積累。今天小編會把常用的一些理論問題匯總起來,後面可以做一個快速的記憶和學習。
請簡述值類型與引用類型的區別。
區別:A.值類型存儲在內存棧中,引用類型數據存儲在內存堆中,而內存單元中存放的是堆中存放的地址;B.值類型存取快,引用類型存取慢;C.值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針和引用;D.棧的內存是自動釋放的,堆內存是.NET中會由GC來自動釋放;E.值類型繼承自System.ValueType,引用類型繼承自System.Object。
參考:
http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html
C#中所有引用類型的基類是什麼?
引用類型的基類是System.Object值類型的基類是System.ValueType,同時,值類型也隱式繼承自System.Object。
請簡述ArrayList和List的主要區別。
ArrayList存在不安全類型(ArrayList會把所有插入其中的數據都當做Object來處理)裝箱拆箱的操作(費時),List是接口,ArrayList是一個實現了該接口的類,可以被實例化。
請簡述GC(垃圾回收)產生的原因,並描述如何避免?
GC回收堆上的內存,避免:A.減少new產生對象的次數;B.使用公用的對象(靜態成員);C.將String換為StringBuilder。
請描述Interface與抽象類之間的不同。
抽象類表示該類中可能已經有一些方法的具體定義,但接口就是只能定義各個方法的界面 ,不能具體的實現代碼在成員方法中。類是子類用來繼承的,當父類已經有實際功能的方法時該方法在子類中可以不必實現,直接引用父類的方法,子類也可以重寫該父類的方法。實現接口的時候必須要實現接口中所有的方法,不能遺漏任何一個。
參考:
http://www.cnblogs.com/seapub/archive/2012/08/08/2628433.html
下列代碼在運行中會產生幾個臨時對象?
string a = new string("abc");
a = (a.ToUpper() + "123").Substring(0, 2);
其實在C#中第一行是會出錯的(Java中倒是可行)。應該這樣初始化:
string b = new string(new char[]{'a','b','c'});
下列代碼在運行中會發生什麼問題?如何避免?
List ls = new List(new int[] { 1, 2, 3, 4, 5 });foreach (int item in ls)
{
Console.WriteLine(item * item);
ls.Remove(item);
}
右滑查看完整代碼
會產生運行時錯誤,因為foreach是只讀的。不能一邊遍歷一邊修改。
請簡述關鍵字Sealed用在類聲明和函數聲明時的作用。
類聲明時可防止其他類繼承此類,在方法中聲明則可防止派生類重寫此方法。
請簡述private,public,protected,internal的區別。
public:對任何類和成員都公開,無限制訪問
private:僅對該類公開
protected:對該類和其派生類公開
internal:只能在包含該類的程序集中訪問該類
protected internal:protected + internal
反射的實現原理?
審查元數據並收集關於它的類型信息的能力。
參考:http://blog.163.com/xuanmingzhiy … 762011612115124188/
反射就是得到程序集中的屬性和方法。
實現步驟:
A.導入using System.Reflection;
B.Assembly.Load("程序集")加載程序集,返回類型是一個Assembly
C.得到程序集中所有類的名稱
foreach (Type type in assembly.GetTypes()){string t = type.Name;}
右滑查看完整代碼
E.Type type = assembly.GetType("程序集.類名");獲取當前類的類型
E.Activator.CreateInstance(type); 創建此類型實例
G.MethodInfomInfo = type.GetMethod("方法名");獲取當前方法
H.mInfo.Invoke(null,方法參數);
.Net與Mono的關係?
Mono是 .net 的一個開源跨平臺工具,就類似java虛擬機,java本身不是跨平臺語言,但運行在虛擬機上就能夠實現了跨平臺。.net只能在windows下運行,mono可以實現跨平臺跑,可以運行於linux,Unix,Mac OS等。
簡述unity3d支持的作為腳本的語言的名稱。
Unity的腳本語言基於Mono的.Net平臺上運行,可以使用.NET庫,這也為XML、資料庫、正則表達式等問題提供了很好的解決方案。Unity編輯器裡的腳本都會經過編譯,他們的運行速度也很快。這三種語言實際上的功能和運行速度是一樣的,區別主要體現在語言特性上。JavaScript:和網頁中常用的JavaScript不一樣,它編譯後的運行速度很快,語法方面也會有不少區別。
C#:類似於Java程式語言的變異型語言;
Boo:可以看做是Python語言的變種,又糅合了Ruby和C#的特性,它是靜態類型語言。
Unity3D是否支持寫成多線程程序?
如果支持的話需要注意什麼?
僅能從主線程中訪問Unity3D的組件,對象和Unity3D系統調用支持;如果同時你要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。
參考:
http://www.unitymanual.com/3821.html
注意:C#中有lock這個關鍵字,以確保只有一個線程可以在特定時間內訪問特定的對象。
Unity3D的協程和C#線程之間的區別是什麼?
多線程程序同時運行多個線程 ,而在任一指定時刻只有一個協程在運行,並且這個正在運行的協同程序只在必要時才被掛起。除主線程之外的線程無法訪問Unity3D的對象、組件、方法。Unity3d沒有多線程的概念,不過Unity也給我們提供了StartCoroutine(協同程序)和LoadLevelAsync(異步加載關卡)後臺加載場景的方法。StartCoroutine為什麼叫協同程序呢,所謂協同,就是當你在StartCoroutine的函數體裡處理一段代碼時,利用Yield語句等待執行結果,這期間不影響主程序的繼續執行,可以協同工作。而LoadLevelAsync則允許你在後臺加載新資源和場景,所以再利用協同,你就可以前臺用loading條或動畫提示玩家遊戲未卡死。
U3D中用於記錄節點空間幾何信息的組件名稱,及其父類名稱。
Transform 父類是 Component。
簡述四元數的作用,四元數對歐拉角的優點?
四元數用於表示旋轉,相對歐拉角的優點:A.能進行增量旋轉;B.避免萬向鎖;C.給定方位的表達方式有兩種,互為負(歐拉角有無數種表達方式)。
向量的點乘、叉乘以及歸一化的意義?
點乘描述了兩個向量的相似程度,結果越大兩向量越相似,還可表示投影。
叉乘得到的向量垂直於原來的兩個向量。
標準化向量:用在只關係方向,不關心大小的時候。
矩陣相乘的意義及注意點。
用於表示線性變換:旋轉、縮放、投影、平移、仿射;注意矩陣的蠕變:誤差的積累。
為何大家都在行動裝置上尋求U3D原生GUI的替代方案?
不美觀,OnGUI很耗費時間,使用不方便。
請簡述如何在不同解析度下保持UI的一致性。
NGUI很好的解決了這一點,屏幕解析度的自適應性,原理就是計算出屏幕的寬高比跟原來的預設的屏幕解析度求出一個對比值,然後修改攝像機的Size。
原生GUI:http://unity3d.9ria.com/?p=2587
NGUI:http://blog.csdn.net/mfc11/article/details/17681429
為什麼dynamic font在unicode環境下優於static font。
Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。使用動態字體時,Unity將不會預先生成一個與所有字體的字符紋理。當需要支持亞洲語言或者較大的字體的時候,若使用正常紋理,則字體的紋理將非常大。
Prefab的作用?
如何在移動環境的設備下恰當地使用它?
Prefab在實例化的時候用到,主要用於經常會用到的物體,屬性方便修改。
參考:
http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html
如何銷毀一個UnityEngine.Object及其子類?
Destory。
為什麼Unity3D中會發生在組件上出現數據丟失的情況?
組件上綁定的對象被刪除了。
如何安全的在不同工程間安全地遷移asset數據?三種方法。
將Assets目錄和Library目錄一起遷移;
導出包;
用Unity自帶的Assets Server功能。
當一個細小的高速物體撞向另一個較大的物體時,
會出現什麼情況?如何避免?
穿透(碰撞檢測失敗)
參考:
http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed
OnEnable、Awake、Start運行時的發生順序?
哪些可能在同一個對象周期中反覆的發生?
Awake -》OnEnable-》Start
OnEnable在同一周期中可以反覆地發生
參考:
http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html
請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回調函數的意義?
當物體是否可見切換之時。可以用於只需要在物體可見時才進行的計算。
MeshRender中material和sharedmaterial的區別?
修改sharedMaterial將改變所有物體使用這個材質的外觀,並且也改變儲存在工程裡的材質設置。不推薦修改由sharedMaterial返回的材質。如果你想修改渲染器的材質,使用material替代。
物體發生碰撞時,有幾個階段,分別對應的函數?
3個階段:開始碰撞:Enter:OnTriggerEnter/OnCollisionEnter
持續碰撞:Stay:OnTriggerStay/OnCollisionStay
結束碰撞:Exit:OnTriggerExit/OnCollisionExit
物體發生碰撞時,幾種施加壓力的方式,描述出來?
3種:AddForce添加普通力;AddExplosionForce添加爆炸力;AddForceAtPosition添加位置力。
物理更新一般在哪個系統函數裡?
FixedUpdate,每固定幀繪製時執行一次可以在edit->project setting->time設置 update 是在渲染幀執行,和Update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate調用次數就會跟著下降。FixedUpdate比較適用於物理引擎的計算,因為是跟每幀渲染有關。Update就比較適合做控制。
簡述一下對象池,你覺得在FPS遊戲裡哪些東西適合使用對象池?
對象池就存放需要被反覆調用資源的一個空間,當一個對象回大量生成的時候如果每次都銷毀創建會很費時間,通過對象池把暫時不用的對象放到一個池中(也就是一個集合),當下次要重新生成這個對象的時候先去池中查找一下是否有可用的對象,如果有的話就直接拿出來使用,不需要再創建,如果池中沒有可用的對象,才需要重新創建,利用空間換時間來達到遊戲的高速運行效果,在FPS遊戲中要常被大量複製的對象包括子彈,敵人,粒子等。
Unity3D常用的組件有哪些?
Transform、Camera、Rigidbody、NavMeshAgent、Animator、Button、Text、Image、代碼類組件等。
Unity3D裡的遊戲對象(GameObject)有哪些屬性?
公用的有Transform,不同的遊戲對象有不同的屬性,如Camera、Rigidbody、NavMeshAgent、Animator、Button、Text、Image、代碼類組件等。
什麼是3D渲染管線?
是指在顯示器上為了顯示出圖像而經過的一系列必要操作。渲染管道中的很多步驟,都要將幾何物體從一個坐標系中變換到另一個坐標系中去。
主要步驟有:本地坐標->視圖坐標->背面裁剪->光照->裁剪->投影->視圖變換->光柵化
C#中命名空間如何寫?作用是什麼?
C#中的類是利用命名空間組織起來的。命名空間提供了一種從邏輯上組織類的方式,防止命名衝突。 命名空間聲明用namespace 關鍵字用於聲明一個命名空間。此命名空間範圍允許您組織代碼並為您提供了創建全局唯一類型的方法。namespace name {類型定義} 其中:在命名空間中,可以聲明類、接口、結構、枚舉、委託 命名空間。
C#靜態與非靜態成員變量的區別是什麼?
區別:靜態成員先分配內存,只能調用靜態成員;
非靜態成員在對象實例化後才分配內存,可以調用靜態成員。
C#中什麼是重寫(override)?
重寫」父類方法就是修改它的實現方式或者說在子類中對它進行重新編寫。父類前面就加virtual,子類後面加override。
C#中什麼是重載?
方法名相同,參數不同,參數不同主要體現在參數的位置、個數、類型不同。
圖像中的RGBA指的什麼?
RGBA是代表Red(紅色) Green(綠色) Blue(藍色)和 Alpha(透明度)的色彩空間。也叫顏色空間。
遊戲中的常用的尋路算法有哪些?
方法:
1)、A*尋路算法;
2)、智能尋路:NavMeshAgent;
3)、WayPoint尋路插件
遊戲中的攝像機的作用是什麼?
什麼情況下需要多個攝像機?
作用:渲染它能照射到的對象;
當需要單獨渲染某一層時,需要用到多個攝像機。
什麼叫做漫反射貼圖,法向貼圖,高光貼圖,凹凸貼圖,環境貼圖?
漫反射貼圖:表現出物體表面的反射和表面顏色。換句話說,它可以表現出物體被光照射到而顯出的顏色和強度。
法線貼圖:法線貼圖定義了一個表面的傾斜度或者法線。換一種說法,他們改變了我們所看到的表面的傾斜度。法線貼圖把空間坐標的參數(X,Y,Z)記錄在像素中(R,G,B)。
OpenGL 和 DirectX是什麼?
OpenGL(全寫Open Graphics Library)是個定義了一個跨程式語言、跨平臺的編程接口規格的專業的圖形程序接口。它用於三維圖象(二維的亦可),是一個功能強大,調用方便的底層圖形庫。DirectX:由微軟公司創建的多媒體編程接口。由C++程式語言實現,遵循COM,DirectX加強3D圖形和聲音效果,並提供設計人員一個共同的硬體驅動標準,讓遊戲開發者不必為每一品牌的硬體來寫不同的驅動程序,也降低了用戶安裝及設置硬體的複雜度。從字面意義上說,Direct就是直接的意思,而後邊的X則代表了很多的意思,從這一點上可以看出DirectX的出現就是為了為眾多軟體提供直接服務的。
Unity3D中製作關卡地形的技術有哪些?
Unity3D手冊中介紹了兩種地形製作方法:
A.在SceneView中使用height tools直接繪製
B.使用外部工具製作的heightmaps。
Unity3D中動畫系統有幾種?
各自特點是什麼?如何配置一個模型的行走動畫?
Legacy:是老的動畫系統,這裡就多說了。
Generic:是新的動畫系統,它就是支持非人形的動畫,建議使用它。但是它不能向Humanoid重定向動畫。
Humanoid:就是新的人形重定向動畫系統。
協同程序的執行代碼是什麼?有何用處,有何缺點?
MB.StartCoroutine(Load(path, UA));static IEnumerator Load(string path,UnityAction _UA){//加載打包文件WWW www = new WWW(path);
//等待加載完成yield return www;
右滑查看完整代碼
作用:一個協同程序在執行過程中,可以在任意位置使用yield語句。yield的返回值控制何時恢復協同程序向下執行。協同程序在對象自有幀執行過程中堪稱優秀。協同程序在性能上沒有更多的開銷。缺點:協同程序並非真線程,可能會發生堵塞。
概述序列化
序列化簡單理解成把對象轉換為容易傳輸的格式的過程。比如,可以序列化一個對象,然後使用HTTP通過Internet在客戶端和伺服器端之間傳輸該對象。
概述c#中代理和事件?
代理就是用來定義指向方法的引用。C#事件本質就是對消息的封裝,用作對象之間的通信;發送方叫事件發送器,接收方叫事件接收器。
小編初步給大家理論的淺析,後續會繼續匯總收集,同時也期待大家留言討論。最後,再次感謝琳雲科技一如既往的支持~~