Unity3D相關面試題
Unity3D相關面試題
- 第一部分
- 1.請簡述值型別與引用型別的區別
- 2.C#中所有引用型別的基類是什麼
- 3.請簡述ArrayList和List的主要區別
- 4.請簡述GC(垃圾回收)產生的原因,並描述如何避免?
- 5.請描述Interface與抽象類之間的不同
- 6.請簡述關鍵字Sealed用在類宣告和函式宣告時的作用
- 7.請簡述private,public,protected,internal的區別
- 8.反射的實現原理?
- 9 .Net與Mono的關係?
- 10.簡述unity3d支援的作為指令碼的語言的名稱
- 11.Unity3D是否支援寫成多執行緒程式?如果支援的話需要注意什麼?
- 12.Unity3D的協程和C#執行緒之間的區別是什麼?
- 13.U3D中用於記錄節點空間幾何資訊的元件名稱,及其父類名稱
- 14.簡述四元數的作用,四元數對尤拉角的優點?
- 15.向量的點乘、叉乘以及歸一化的意義?
- 16.矩陣相乘的意義及注意點
- 17.為何大家都在移動裝置上尋求U3D原生GUI的替代方案
- 18.請簡述如何在不同解析度下保持UI的一致性
- 19.為什麼dynamic font在unicode環境下優於static font
- 20.Render的作用?描述MeshRender和SkinnedMeshRender的關係與不同
- 21.簡述SkinnedMesh的實現原理
- 22.在場景中放置多個Camera並同時處於活動狀態會發生什麼?
- 23.Prefab的作用?如何在移動環境的裝置下恰當地使用它?
- 24.如何銷燬一個UnityEngine.Object及其子類
- 25.為什麼Unity3D中會發生在元件上出現資料丟失的情況?
- 26.如何安全的在不同工程間安全地遷移asset資料?三種方法
- 27.MeshCollider和其他Collider的一個主要不同點?
- 28.當一個細小的高速物體撞向另一個較大的物體時,會出現什麼情況?如何避免?
- 29.OnEnable、Awake、Start執行時的發生順序?哪些可能在同一個物件週期中反覆的發生?
- 30.請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回撥函式的意義?
- 31.Unity3D如何獲取場景中需要載入的資料?
- 32.MeshRender中material和sharedmaterial的區別?
- 第二部分
- 1.請描述遊戲動畫有哪幾種,以及其原理。
- 2.alpha blend 工作原理
- 3.寫光照計算中的diffuse的計算公式
- 4.lod是什麼,優缺點是什麼
- 5.兩種陰影判斷的方法工作原理
- 6.MipMap是什麼?作用?
- 7.用u3d實現2d遊戲,有幾種方式?
- 8.u3d中碰撞器和觸發器的區別?
- 9.物體發生碰撞的必要條件
- 10.CharacterController和Rigidbody的區別
- 11.物體發生碰撞時,有幾個階段,分別對應的函式
- 12.u3d中,幾種施加力的方式,描述出來。
- 13.什麼叫做鏈條關節
- 14.物體自旋轉使用的函式叫什麼
- 15.物體繞某點旋轉使用函式叫什麼
- 16.u3d提供了一個用於儲存讀取資料的類,(playerPrefs),請列出儲存讀取整形資料的函式
- 17.unity3d提供了幾種光源,分別是什麼
- 18.unity3d從喚醒到銷燬有一段生命週期,請列出系統自己呼叫的幾個重要方法。
- 19.物理更新一般在哪個系統函式裡?
- 20.移動相機動作在哪個函式裡,為什麼在這個函式裡。
- 21.當遊戲中需要頻繁建立一個物體物件時,我們需要怎麼做來節省記憶體。
- 22.一個場景放置多個camera並同時處於活動狀態,會發生什麼
- 23.簡述prefab的用處和環境
- 24.如何銷燬一個UnityEngine.Object以及其子類
- 25.為什麼u3d會出現元件上資料丟失的情況
- 26.Vertex Shader是什麼?怎麼計算?
- 第三部分
- 第四部分
- 第五部分
- 轉載連結(全文)
第一部分
1.請簡述值型別與引用型別的區別
- 值型別儲存在記憶體棧中,引用型別資料儲存在記憶體堆中,而記憶體單元中存放的是堆中存放的地址。
- 值型別存取快,引用型別存取慢。
- 值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標和引用。
- 棧的記憶體是自動釋放的,堆記憶體是.NET中會由GC來自動釋放。
- 值型別繼承自
System.ValueType
,引用型別繼承自System.Object
。
參考:https://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html
2.C#中所有引用型別的基類是什麼
引用型別的基類是System.Object
。
值型別的基類是System.ValueType
。同時,值型別也隱式繼承自System.Object
3.請簡述ArrayList和List的主要區別
ArrayList
存在不安全型別(ArrayList
會把所有插入其中的資料都當做Object
來處理),裝箱拆箱的操作(費時)。
List
是介面,ArrayList
是一個實現了該介面的類,可以被例項化。
4.請簡述GC(垃圾回收)產生的原因,並描述如何避免?
GC回收堆上的記憶體。
避免:
- 減少new產生物件的次數
- 使用公用的物件(靜態成員)
- 將
String
換為StringBuilder
5.請描述Interface與抽象類之間的不同
抽象類表示該類中可能已經有一些方法的具體定義,但介面就是公公只能定義各個方法的介面 ,不能具體的實現程式碼在成員方法中。
類是子類用來繼承的,當父類已經有實際功能的方法時該方法在子類中可以不必實現,直接引用父類的方法,子類也可以重寫該父類的方法。
實現介面的時候必須要實現介面中所有的方法,不能遺漏任何一個。
參考:http://www.cnblogs.com/seapub/archive/2012/08/08/2628433.html
6.請簡述關鍵字Sealed用在類宣告和函式宣告時的作用
類宣告時可防止其他類繼承此類,在方法中宣告則可防止派生類重寫此方法。
7.請簡述private,public,protected,internal的區別
public
:對任何類和成員都公開,無限制訪問private
:僅對該類公開protected
:對該類和其派生類公開internal
:只能在包含該類的程式集中訪問該類;protected internal
:protected
+internal
8.反射的實現原理?
審查後設資料並收集關於它的型別資訊的能力。
參考:http://blog.163.com/xuanmingzhiyou@yeah/blog/static/1424776762011612115124188/
反射個人認為,就是得到程式集中的屬性和方法。
實現步驟:
- 匯入
using System.Reflection;
Assembly.Load
(“程式集”)載入程式集,返回型別是一個Assembly
foreach (Type type in assembly.GetTypes()){ string t = type.Name; }
得到程式集中所有類的名稱。Type type = assembly.GetType("程式集.類名");
獲取當前類的型別。Activator.CreateInstance(type);
建立此型別例項。MethodInfo mInfo = type.GetMethod("方法名");
獲取當前方法。mInfo.Invoke(null,方法引數);
。
9 .Net與Mono的關係?
Mono官網主頁:
Mono is a software platform designed to allow developers to easily create
cross platform applications. Sponsored by Xamarin, Mono is an open source
implementation of Microsoft’s .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
mono是.net的一個開源跨平臺工具,就類似java虛擬機器,java本身不是跨平臺語言,但執行在虛擬機器上就能夠實現了跨平臺。.net只能在windows下執行,mono可以實現跨平臺跑,
可以執行於linux,Unix,Mac OS等。
10.簡述unity3d支援的作為指令碼的語言的名稱
Unity的指令碼語言基於Mono的.Net平臺上執行,可以使用.NET庫,這也為XML、資料庫、正規表示式等問題提供了很好的解決方案。
Unity裡的指令碼都會經過編譯,他們的執行速度也很快。這三種語言實際上的功能和執行速度是一樣的,區別主要體現在語言特性上。
- JavaScript:和網頁中常用的JavaScript不一樣,它編譯後的執行速度很快,語法方面也會有不少區別。
- C#
- Boo:可以看做是Python語言的變種,又糅合了Ruby和C#的特性,它是靜態型別語言
11.Unity3D是否支援寫成多執行緒程式?如果支援的話需要注意什麼?
僅能從主執行緒中訪問Unity3D的元件。
支援:如果同時你要處理很多事情或者與Unity的物件互動小可以用thread
,否則使用coroutine
。
注意:C#中有lock
這個關鍵字,以確保只有一個執行緒可以在特定時間內訪問特定的物件。
12.Unity3D的協程和C#執行緒之間的區別是什麼?
多執行緒程式同時執行多個執行緒 ,而在任一指定時刻只有一個協程在執行,並且這個正在執行的協同程式只在必要時才被掛起。除主執行緒之外的執行緒無法訪問Unity3D的物件、元件、方法。
Unity3d沒有多執行緒的概念,不過unity也給我們提供了StartCoroutine
(協同程式)和LoadLevelAsync
(非同步載入關卡)後臺載入場景的方法。 StartCoroutine
為什麼叫協同程式呢,所謂協同,就是當你在StartCoroutine
的函式體裡處理一段程式碼時,利用yield
語句等待執行結果,這期間不影響主程式的繼續執行,可以協同工作。而LoadLevelAsync
則允許你在後臺載入新資源和場景,所以再利用協同,你就可以前臺用loading
條或動畫提示玩家遊戲未卡死,同時後臺協同處理載入的事宜。
參考:http://blog.csdn.net/kongbu0622/article/details/8775037
13.U3D中用於記錄節點空間幾何資訊的元件名稱,及其父類名稱
Transform
父類是Component
。
14.簡述四元數的作用,四元數對尤拉角的優點?
四元數用於表示旋轉。
相對尤拉角的優點:
- 能進行增量旋轉。
- 避免萬向鎖。
- 給定方位的表達方式有兩種,互為負(尤拉角有無數種表達方式)。
15.向量的點乘、叉乘以及歸一化的意義?
- 點乘描述了兩個向量的相似程度,結果越大兩向量越相似,還可表示投影。
- 叉乘得到的向量垂直於原來的兩個向量。
- 標準化向量:用在只關係方向,不關心大小的時候。
16.矩陣相乘的意義及注意點
用於表示線性變換:旋轉、縮放、投影、平移、仿射。
注意矩陣的蠕變:誤差的積累。
17.為何大家都在移動裝置上尋求U3D原生GUI的替代方案
不美觀,OnGUI很耗費時間,使用不方便 ,DrawCall。
18.請簡述如何在不同解析度下保持UI的一致性
NGUI很好的解決了這一點,螢幕解析度的自適應性,原理就是計算出螢幕的寬高比跟原來的預設的螢幕解析度求出一個對比值,然後修改攝像機的size。參考:http://blog.csdn.net/mfc11/article/details/17681429。
當前UGUI也已經更新的非常完善。
19.為什麼dynamic font在unicode環境下優於static font
Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。
使用動態字型時,Unity將不會預先生成一個與所有字型的字元紋理。當需要支援亞洲語言或者較大的字型的時候,若使用正常紋理,則字型的紋理將非常大。
20.Render的作用?描述MeshRender和SkinnedMeshRender的關係與不同
A renderer is what makes an object appear on the screen。
Mesh
就是指模型的網格(同名元件是用於調整網格屬性的),MeshFilter
一般是用於獲得模型網格的元件,而MeshRender
是用於把網格渲染出來的元件,
21.簡述SkinnedMesh的實現原理
參考:http://blog.csdn.net/n5/article/details/3105872
22.在場景中放置多個Camera並同時處於活動狀態會發生什麼?
遊戲介面可以看到很多攝像機的混合。
23.Prefab的作用?如何在移動環境的裝置下恰當地使用它?
Prefab在例項化的時候用到,主要用於經常會用到的物體,屬性方便修改。
參考:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html
24.如何銷燬一個UnityEngine.Object及其子類
Destory
。
25.為什麼Unity3D中會發生在元件上出現資料丟失的情況?
元件上繫結的物件被刪除了。
26.如何安全的在不同工程間安全地遷移asset資料?三種方法
- 將Assets目錄和Library目錄一起遷移。
- 匯出包。
- 用unity自帶的assets Server功能。
27.MeshCollider和其他Collider的一個主要不同點?
Meshcollider再快也是基於V3頂點~~ 建議還是用boxcollider,boxcollider本身是基於演算法,沒有面的概念。
28.當一個細小的高速物體撞向另一個較大的物體時,會出現什麼情況?如何避免?
會發生穿透(碰撞檢測失敗)。
解決方法:
- 增大細小物體的碰撞體。
- 使用射線檢測。
- 可以physics time減小,不建議這樣做。
- 確保rigidbody不超過一定的速度,這個也不實用。
參考:http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed。
29.OnEnable、Awake、Start執行時的發生順序?哪些可能在同一個物件週期中反覆的發生?
Awake -》OnEnable-》Start
OnEnable
在同一週期中可以反覆地發生。
參考:http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html。
30.請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回撥函式的意義?
當物體是否可見切換之時。可以用於只需要在物體可見時才進行的計算。
31.Unity3D如何獲取場景中需要載入的資料?
Resource.Load()
:通過Resources模組,呼叫它的load函式:可以直接load
並返回某個型別的Object
,前提是要把這個資源放在Resource命名的資料夾下,Unity不關有沒有場景引用,都會將其全部打入到安裝包中。- AssetBundle:通過bundle的形式:即將資源打成asset bundle放在伺服器或本地磁碟,然後使用WWW模組
get
下來,然後從這個bundle中load
某個object
。 AssetDatabase.loadasset
:這種方式只在editor範圍內有效,遊戲執行時沒有這個函式,它通常是在開發中除錯用的
32.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 = DintensityDcolorN.L;(Dintensity表示漫反射強度,Dcolor表示漫反射光顏色,N為該點的法向量,L為光源向量)
- 鏡面反射光:Ispecular = SintensityScolor(R.V)^n;(Sintensity表示鏡面光照強度,Scolor表示鏡面光顏色,R為光的反射向量,V為觀察者向量,n稱為鏡面光指數)
4.lod是什麼,優缺點是什麼
LOD技術即Levels of Detail的簡稱,意為多細節層次。LOD技術指根據物體模型的節點在顯示環境中所處的位置和重要度,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。
優點:可根據距離動態地選擇渲染不同細節的模型。
缺點:加重美工的負擔,要準備不同細節的同一模型,同樣的會稍微增加遊戲的容量。
5.兩種陰影判斷的方法工作原理
陰影由兩部分組成:本影與半影。
- 本影:景物表面上那些沒有被光源直接照射的區域(全黑的輪廓分明的區域)。
- 半影:景物表面上那些被某些特定光源直接照射但並非被所有特定光源直接照射的區域(半明半暗區域)。
求陰影區域的方法:做兩次消隱過程。
- 一次對每個光源進行消隱,求出對於光源而言不可見的區域L;
- 一次對視點的位置進行消隱,求出對於視點而言可見的面S;
- shadow area= L ∩ S
陰影分為兩種:自身陰影和投射陰影
- 自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出,即假設視點在點光源的位置。 - 投射陰影:因不透明物體遮擋光線使得場景中位於該物體後面的物體或區域受不到光照照射而形成的陰影
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,儲存這些陰影多邊形資訊,然後再按視點位置對場景進行相應處理得到所要求的檢視(利用空間換時間,每次只需依據視點位置進行一次陰影計算即可,省去了一次消隱過程)
若是動態光源此方法就無效了。
6.MipMap是什麼?作用?
在三維計算機圖形的貼圖渲染中有一個常用的技術被稱為Mipmapping。為了加快渲染速度和減少影像鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的檔案,這樣的貼圖被稱為MIP map或者mipmap。
7.用u3d實現2d遊戲,有幾種方式?
- 利用引擎自帶的GUI、UGUI。
- 把攝像機設為Orthographic,用面片作為2d元素。
- 利用第三方外掛:NGUI、2dToolkit。
8.u3d中碰撞器和觸發器的區別?
- collider碰撞器會有碰撞的效果,
isTrigger = false
,可以呼叫OnCollisionEnter/Stay/Exit函式。 - trigger觸發器沒有碰撞效果,
isTrigger = true
,可以呼叫OnTriggerEnter/Stay/Exit函式。
9.物體發生碰撞的必要條件
物體A必須帶有(collider
+rigidb
ody)或者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.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幾個過程。
第三部分
1.什麼是渲染管道?
是指在顯示器上為了顯示出影像而經過的一系列必要操作。 渲染管道中的很多步驟,都要將幾何物體從一個座標系中變換到另一個座標系中去。
主要步驟有:本地座標->檢視座標->背面裁剪->光照->裁剪->投影->檢視變換->光柵化。
2.如何優化記憶體?
有很多種方式,例如
1.壓縮自帶類庫;
2.將暫時不用的以後還需要使用的物體隱藏起來而不是直接Destroy掉;
3. 釋放AssetBundle佔用的資源;
4. 降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小;
5. 使用光照貼圖,使用多層次細節(LOD),使用著色器(Shader),使用預設(Prefab)。
3.什麼是協同程式?
在主執行緒執行時同時開啟另一段邏輯處理,來協助當前程式的執行。換句話說,開啟協程就是開啟一個執行緒。可以用來控制運動、序列以及物件的行為。
第四部分
1.獲取、增加、刪除元件的命令分別是什麼?
- 獲取:
GetComponent
。 - 增加:
AddComponent
。 - 刪除:
Destroy
。
2.Animation.CrossFade命令作用是
答案:©
A.動畫放大 B.動畫轉換 C.動畫的淡入為其他動畫
3.Application.loadLevel命令為
答案:(A)
A.載入關卡 B.非同步載入關卡 C.載入動作
4.除錯記錄到控制檯的命令是什麼?
Debug.Log();
。
5.編輯器類存放路徑是什麼?
工程目錄下的Assets/Editor資料夾下。
6.使用原生GUI建立一個可以拖動的視窗命令是什麼?
GUI.DragWindow();
。
7.localPosition與Position的使用區別?
localPosition
:自身位置,相對於父級的變換的位置。 Position
:在世界座標transform的位置
8.意義連線
Mathf.Round
:四捨五入。Mathf.Clamp
:限制。Mathf.Lerp
:插值。Math.Ceiling
:只要有小數都加1Math.Floor
:總是捨去小數
9.寫一個計時器工具,從整點開始計時,格式為:00:00:00
10.寫出Animation的五個方法
11.怎麼拿到一個物件上指令碼的方法
GameObject.GetComponent<>();
。
12.請簡述向量的點乘,向量的叉乘以及向量歸一化的幾何意義?
- 點乘的幾何意義是:計算兩個向量之間的夾角,以及在某一方向上的投影;
- 叉乘的幾何意義是:建立垂直於平面,三角形,或者多邊形的向量;
第五部分
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
可變,非執行緒同步。
參考:https://zhidao.baidu.com/question/240364840.html
3.C# 函式Func(string a, string b)用Lambda表示式怎麼寫?
參考:https://msdn.microsoft.com/zh-cn/library/bb397687.aspx
4.Mesh,Sphere,Box,Capsule,四種碰撞器。請按照效能開銷由小到大進行排序。
collider的效能和效率大概的順序是:Sphere Collider > Capsule Collider> Box Collider > Mesh Collider。
5. 當遊戲中需要頻繁建立一個物體物件時,我們需要怎麼做來節省記憶體?
- 使用pool物件池。
- 使用AssetBundle也可以降低一定記憶體。
6.Unity中,控制3D人物模型位移方式有幾種?Animator元件的Apply Root Motion的作用是?
- 常用的位移方式有4種元件,如下方法,除了一下方法還有角色控制器移動。
transform.translate()
向某方向移動物體多少距離【預設local座標系】transform.Position()
在世界空間座標transform的位置。RigidBody.Velocity
剛體的速度向量。RigidBody.AddForce
新增一個力到剛體。作為結果剛體將開始移動。RigidBody.MovePosition
移動剛體到position
。- NavMeshAgent元件的
SetDestination
函式,設定自動Path目標點。 - CharacterController元件的
Move
函式,每次都絕對運動。 Vector3.MoveToward
當前的地點移向目標。
- 如果我們勾選了Animator元件中的Apply Root Motion選項,角色的Transform將不能通過指令碼來直接賦值,而是通過動畫的運動的來改變的。
如果我們不勾選我們就可以用指令碼改變角色的Tranform。
7.如何實現遊戲存檔和讀檔的功能?
- Unity提供了一個用於本地持久化儲存與讀取的類——PlayerPrefs。工作原理非常簡單,以鍵值對的形式將資料儲存在檔案中,然後程式可以根據這個名稱取出上次儲存的數值。
PlayerPrefs類支援3中資料型別的儲存和讀取,浮點型,整形,和字串型。
分別對應的函式為:這些函式的用法基本一致使用Set進行儲存,使用Get進行讀取
SetInt();
儲存整型資料;
GetInt();
讀取整形資料;
SetFloat();
儲存浮點型資料;
GetFlost();
讀取浮點型資料;
SetString();
儲存字串型資料;
GetString();
讀取字串型資料; - XML,sql,txt等配置檔案都可以實現存讀等功能,PlayerPrefs自帶的類只能實現簡單的存取功能。
XML存檔參考http://blog.sina.com.cn/s/blog_471132920101d3kh.html。
8.什麼是遊戲框架?使用框架的好處是什麼?
選擇框架和使用框架是控制框架的基礎。
- 遊戲框架是比較上層的封裝,是一套快速搭建遊戲的程式碼結構。
- 使用遊戲框架開發能節約工程時間,易維護,易擴充套件,易閱讀開發,可複用。
Unity的GameObject.Find()是深度優先還是廣度優先?
我們瞭解到深度優先是一種類似遞迴的搜尋演算法(就是一條路走到底,還找不到就返回走第二條路)。
廣度優先剛好相反,是隻要有岔路都走個遍,走到下一個拐點要是還有岔路也都先探一探醬紫。
程式碼是通過GameObject.Find()
的方法,找到名為GameObject
的物體,然後隱藏其子物體。如果是廣度優先的話,那麼該被隱藏應該是和A平級的節點GameObjec
的自物體,但執行下來,隱藏的確是D下面的GameObject的子物體,可見==GameObject.Find()
應該是深度優先==,
網上的這篇文章還是蠻不錯的,講到了GameObject.Find
早就不推薦使用啦,分享給大家:csdn 部落格《Unity3D 遊戲開發GameObject.Find()Transform.Findc 查詢隱藏物件》
轉載連結(全文)
相關文章
- FLume相關面試題面試題
- 集合相關面試題面試題
- ES相關面試題面試題
- springboot+springcloud相關面試題Spring BootGCCloud面試題
- 面試題(五)常見vue相關面試題總結面試題Vue
- 系統設計 相關面試題面試題
- Java中JVM相關面試題-整理JavaJVM面試題
- 面試遇到的redis相關問題面試Redis
- Vue的一些相關面試題Vue面試題
- 深入淺出 Runtime(六):相關面試題面試題
- 分享10道Docker容器相關面試題!!!Docker面試題
- Hadoop/Spark相關面試問題總結HadoopSpark面試
- SSM框架相關基礎面試題整理SSM框架面試題
- 翻譯 | SpringBoot相關的面試問題Spring Boot面試
- iOS 記憶體管理相關面試題iOS記憶體面試題
- HTTPS總結+相關面試問題解答HTTP面試
- 一道與 for 相關的字串面試題字串面試題
- iOS RunLoop 總結以及相關面試題解答iOSOOP面試題
- Android面試相關 - IntentServiceAndroid面試Intent
- 面試之 Memcache 相關面試
- 面試準備——JVM相關面試JVM
- iOS面試題整理01---- Objective-C 物件相關問題iOS面試題Object物件
- 千鋒長沙前端培訓:Vue相關面試題前端Vue面試題
- Python資料分析相關面試題!Python學習教程Python面試題
- 2021-PHP面試題“資料庫“相關知識點面試大全總結PHP面試題資料庫
- 好程式設計師Java教程分享jsp相關面試題程式設計師JavaJS面試題
- 【Java併發程式設計】synchronized相關面試題總結Java程式設計synchronized面試題
- 【資源】NLP 演算法工程師相關的面試題演算法工程師面試題
- Java執行緒類相關面試題與答案總結Java執行緒面試題
- 面試之Java String 編碼相關面試Java
- 面試小知識:MySQL索引相關面試MySql索引
- Android 高階面試-1:Handler 相關Android面試
- Android 高階面試-2:IPC 相關Android面試
- Android面試:大廠必問之OkHttp相關問題全解析Android面試HTTP
- shell相關知識有哪些必備技能?Linux面試題分享Linux面試題
- 面試要求之電商相關經驗面試
- 面試系列之View相關知識點面試View
- Handler相關面試題你答對多少?怎樣清晰表達拿下面試官?面試題