博主營地 | Unity3D 實用技巧 - 理論知識庫(一)

2021-01-08 網易

  在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#事件本質就是對消息的封裝,用作對象之間的通信;發送方叫事件發送器,接收方叫事件接收器。

  小編初步給大家理論的淺析,後續會繼續匯總收集,同時也期待大家留言討論。最後,再次感謝琳雲科技一如既往的支持~~

相關焦點

  • Unity 實用技巧 - 物理系統初識
    官方文檔:https://docs.unity3d.com/Manual/PhysicsSection.html01  Rigidbody(剛體)/ Rigidbody2D(2D剛體)在使用文檔連結:https://docs.unity3d.com/cn/current/Manual/PhysicsDebugVisualization.html最後,小編特別推薦一些其他大神分享的內容。
  • Unity3D 尋路系統
    一、尋路方式二、實現尋路方法確定尋路者烘培尋路路面程序實現尋路算法1、實現尋路步驟將場景中不動的物體勾選
  • 2021新年匯總:Unity項目原型快速開發資源,看這一篇就夠
    /essentials/asset-packs/standard-assets-for-unity-2018-4-32351 Snaps Art | Sci-Fi / Industrial by Manufactura K4: https://assetstore.unity.com/packages/3d/environments/sci-fi/snaps-art-sci-fi-industrial-by-manufactura-k4
  • Unity約你來剁手啦!
    限時大禮包:免費贈送價值300美金的2個資源工具包,內含多款實用Asset Store資源商店上實用資源插件。免費贈送一款價值99美金的Asset Store熱銷音效插件ADX2。免費贈送價值1200元人民幣的1張Unite 2018 Beijing大會門票。
  • Unity項目開發過程中常見的問題,你遇到過嗎?
    最近看到有朋友問一個unity遊戲開發團隊,需要掌握哪些知識之類的問題。
  • unity 半透明渲染技巧(3則)
    unity 半透明渲染技巧(1):固定深度法半透明渲染排序問題 長期在各種3d引擎存在,這裡將一些針對性技巧。
  • CAXA CAPP教程:工藝知識積累技巧
    我們在編制工藝的過程中所產生的工藝知識是企業的財富,管理好這些工藝知識,可以保證企業專業術語的一致性,也可以保證這些知識不會隨著人員的離職而流失。在前面我們知道了工藝知識庫管理工具的使用方法,那麼,我們該怎樣快捷有效的管理好我們的工藝知識呢?接下來,讓我們一起學習兩個工藝知識積累的小技巧吧。
  • 就是一門實時渲染的藝術!
    所以,如果你想走得遠,在學習的時候不能簡單流於表面,對於一樣知識越深入到底層,你就越能看到其它知識與其的異曲同工之處,因此你將比別人更輕鬆。但是,當然一開始最好儘可能是貼合自己的專屬領域和程式語言,這樣能儘快地在這個領域持有一席之地。
  • 【官方說明】Unity 5 引擎專業版和個人版解析
    下載:Unity 5 Personal Edition(個人版)和Professional Edition(專業版)今天可在 http://unity3d.com/cn/get-unity 立即下載。提問:如您有任何問題請在中文官方論壇中參與討論,或者聯繫:chinasales@unity3d.com
  • Facebook 開源 3D 深度學習函數庫 PyTorch3D
    原標題:Facebook開源3D深度學習函數庫PyTorch3D來源:開源中國Facebook近日開源了將PyTorch用於3D深度學習的函數庫PyTorch3D,這是一個高度模塊化且經過優化的庫,具備獨有的功能,旨在通過PyTorch簡化3D深度學習。
  • CAXA CAPP教程:知識庫查詢的使用及設置
    它不僅包含了CAXA電子圖板的全部功能,而且專門針對工藝技術人員的需要開發了實用的計算機輔助工藝設計功能,是一個方便快捷、易學易用的CAD/CAPP編輯軟體。  眾所周知,CAXA工藝圖表自帶了工藝知識庫管理工具,那麼,我們如何快速的在工藝知識庫裡查找的我們需要的工藝知識並填寫工藝卡片呢?接下來我們將一起學習知識庫查詢功能的使用以及對應知識庫的相關設置。
  • 在unity中用C#連接資料庫步驟
    所以本文就介紹一下unity連MySQL資料庫所遇到的一些坑。unity連接資料庫,首先你需要導入如圖所示的五個數據連結庫。在本圖中,歐陽講他們放到了Mysql文件夾下,在這裡歐陽強調一下――最好將他們放到Plugins文件夾下,不然會出現莫名其妙的問題哦。
  • 簡化AR體驗創作,Unity MARS Query系統程序化生成場景的原理
    Unity MARS資料庫:  https://docs.unity3d.com/Packages/com.unity.mars@1.1/manual/MARSConcepts.html#the-mars-database  每條數據都以稱為數據ID(data ID)的一串數字做區分,每條數據又能包含任意數量的特徵(traits),即帶名稱的特定數據類型
  • CAXA CAPP教程:用戶自定義知識庫
    它不僅包含了CAXA電子圖板的全部功能,而且專門針對工藝技術人員的需要開發了實用的計算機輔助工藝設計功能,是一個方便快捷、易學易用的CAD/CAPP編輯軟體。我們在編制工藝的過程中所產生的工藝知識是企業的財富,管理好這些工藝知識,可以保證企業專業術語的一致性,也可以保證這些知識不會隨著人員的離職而流失。CAXA工藝圖表自帶一個知識庫管理工具,通過這個工具我們可以管理工藝知識。之前跟大家介紹了CAXA工藝圖表的工藝知識庫分為系統知識庫和用戶自定義知識庫,在這一講中,我們將詳細介紹用戶自定義知識庫的常用操作。
  • 高中化學常見超實用解題技巧總結 高中化學高分必看
    高中化學常見超實用解題技巧總結 高中化學高分必看高中化學複習固然是一個逐漸積累的過程,但掌握一定的高中化學答題公式和模板將在考試中事半功倍,下面有途網小編跟打家說說高中化學常見超實用解題技巧總結,高中化學高分必看,希望對你有幫助。
  • 使用Unity 粒子系統實現 2D 人物足跡效果
    其基本思路是根據輸入計算一個 2 維向量lookDirection作為角色的「面向」,並根據這一向量移動剛體以及播放動畫。 它能夠保證對於任意角度,角色的移動速度都保持一致,並且這一向量對於腳印效果的實現很重要。 如有疑問可以查閱底部的教程連結或直接下載腳本。
  • 程序猿必備基礎知識+高頻面試類型之3D數學
    三維數學跟數據結構與算法一樣地重要,同樣都是程式設計師必備知識,也是高頻面試類型。掌握好三維數學,再處理一些圖形,或者空間信息的時候,可以得心應手。下面是三維數學必備的幾個知識點,程序猿們好好地去掌握吧,下面用unity開發引擎來作為演示,unity是左手坐標系的:
  • Unity粒子系統小技巧X1
    下面我們就來學幾個跳出去又跳回來的小技巧放心,不會被人打的哈哈哈哈首先我們來看看效果圖幾個方法都是用unity粒子系統裡面的Velocity over lifetime(不知道這是什麼的去學基礎課)第一個方法
  • 【遊戲流體力學基礎及Unity代碼(一)】熱傳導方程
    https://github.com/pylbm/pylbm3.然後這個空氣動力學python庫,雖然說是空氣動力學,但和流體力學相同的地方很多https://github.com/barbagroup/AeroPython於是這個「遊戲流體力學基礎」系列將在這些庫的幫助下,從最基本的方程開始推導,儘量保證貓都都能看懂,來完成遊戲中的流體模擬吧
  • unity什麼意思
    unity什麼意思uni前綴,只包含一個的,更多例子還有:uniform, unique, unilateral, etc. 發音類似於有你,整個世界中有你就夠了,不需要別人,也就是只包含一個的。unity,聯合、統一、團結、和睦。學單詞,只記住意思可不行,會用才行,小夥伴們可以在評論區造句,我們一起學習哦!我先來:造句:Unity is strength. (團結就是力量)