unity常見面試題

1. 遊戲對象
問題:遊戲對象消失三種方法的區別?(enabled/Destroy/active)
gameObject.renderer.enabled=fasle
是控制一個物體是否在屏幕上渲染或顯示  而物體實際還是存在的 只是想當於隱身 而物體本身的碰撞體還依然存在的
GameObject.Destroy()
表示移除物體或物體上的組件 代表銷燬該物體  實際上該物體的內存並沒有立即釋放 而是在你下下個場景中槽釋放內存資源,就是你a場景中Destroy了 一般是在c場景中才真正釋放該物體的內存資源(這是我的體會 不知道理解錯誤沒)
gameObject.active=false
是否在場景中停用該物體   在你gameObject.active =false中 則你在場景中用find找不到該物體  
如果該物體有子物體 你要用SetActiveRecursively(false) 來控制是否在場景中停用該物體(遞歸的)
副作用:通過GameObject.Find方法查找不到

 

2. 協同程序(Coroutine)
協同程序,即在主程序運行時同時開啓另一段邏輯處理,來協同當前程序的執行。換句話說,開啓協同程序就是開啓一個線程。
原理:協同程序被開啓後作爲一個線程在運行,而MonoBehaviour也是一個線程,他們成爲互不干擾的模塊,除非代碼中用調用,他們共同作用於同一個對象,只有當對象不可見才能同時終止這兩個線程。
使用MonoBehaviour.StartCoroutine方法即可開啓一個協同程序。
使用StopCoroutine(string methodName)來終止一個協同程序,使用StopAllCoroutines()來終止所有可以終止的協同程序,但這兩個方法都只能終止該MonoBehaviour中的協同程序。
還有一種方法可以終止協同程序,即將協同程序所在GameObject的Active屬性設置爲false,當再次設置active爲ture時,協同程序並不會再開啓。
協同程序和多線程的區別?多線程程序同時運行多個線程 ,而在任一指定時刻只有一個協程在運行,並且這個正在運行的協同程序只在必要時才被掛起。除主線程之外的線程無法訪問Unity3D的對象、組件、方法。
Unity3d沒有多線程的概念,不過unity也給我們提供了StartCoroutine(協同程序)和LoadLevelAsync(異步加載關卡)後臺加載場景的方法。 StartCoroutine爲什麼叫協同程序呢,所謂協同,就是當你在StartCoroutine的函數體裏處理一段代碼時,利用yield語句等待執行結果,這期間不影響主程序的繼續執行,可以協同工作。而LoadLevelAsync則允許你在後臺加載新資源和場景,所以再利用協同,你就可以前臺用loading條或動畫提示玩家遊戲未卡死,同時後臺協同處理加載的事宜asynchronous[e ɪˈ s ɪŋ kr ə n ə s] .synchronous同步。

 

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

Resources.Load 資源必須放在Resources文件夾,只能加載本地文件。
AssetBundle和WWW一起使用,可以實現從服務器上下載資源,並動態加載。

Unity資源加載的幾種方式:

instantiate:最簡單的一種方式,以實例化的方式動態生成一個物體。

Assetsbundle:即將資源打成 asset bundle 放在服務器或本地磁盤,然後使用WWW模塊get 下來,然後從這個bundle中load某個object,unity官方推薦也是絕大多數商業化項目使用的一種方式。

AssetDatabase.loadasset :這種方式只在editor範圍內有效,遊戲運行時沒有這個函數,它通常是在開發中調試用的。Resource.Load:可以直接load並返回某個類型的Object,前提是要把這個資源放在Resource命名的文件夾下,Unity不管有沒有場景引用,都會將其全部打入到安裝包中。

 

4. 使用unity3d實現2D遊戲,有幾種方式?
1.使用本身的GUI;
2.把攝像機的Projection(投影)值調爲Orthographic(正交投影),不考慮z軸;
3.使用2d插件,如:2DToolKit、Uni2D;
4.Unity 4.3版本新增的Native 2D

 

5. AssetBundle
AssetBundle的管理總共分爲三部分:1、AssetBundle文件2、AssetBundle內存鏡像3、AssetBundle 內存對象實例

常見問題:
舉一個例子說明AssetBundle如何進行內存釋放?
一個常見的錯誤:你從某個AssetBundle裏Load了一個prefab並克隆之:obj=Instantiate(AssetBundle1.Load('MyPrefab”);
這個prefab比如是個npc。
然後你不需要他的時候你用了:Destroy(obj);你以爲就釋放乾淨了。其實這時候只是釋放了Clone對象,通過Load加載的所有引用、非引用Assets對象全都靜靜靜的躺在內存裏。
這種情況應該在Destroy以後用:AssetBundle1.Unload(true),徹底釋放乾淨。
如果這個AssetBundle1是要反覆讀取的 不方便Unload,那可以在Destroy以後用:Resources.UnloadUnusedAssets()把所有和這個npc有關的Asset都銷燬。
當然如果這個NPC也是要頻繁創建銷燬的那就應該讓那些Assets呆在內存裏以加速遊戲體驗。
由此可以解釋另一個之前有人提過的話題:爲什麼第一次Instantiate一個Prefab的時候都會卡一下,因爲在你第一次Instantiate之前,相應的Asset對象還沒有被創建,要加載系統內置的AssetBundle並創建Assets,第一次以後你雖然Destroy了,但Prefab的Assets對象都還在內存裏,所以就很快了。

unity3d中如何實現動態資源加載?
使用AssetBundle技術,通過WWW類從服務器下載AssetBundle資源包,將需要的資源加載到項目中。AssetBundle資源包帶有版本號,用來判斷是否需要更新。

AssetBunlde的優點?
可以動態加載資源
可以將資源放在服務器上,方便版本更新。
AssetBundle資源的加載和是否可以手動控制,方便資源管理。

 

6. 組件(組件思想)
是什麼?
Unity3D面向對象編程最大的體現就是組件化,任何一個遊戲對象都是通過附加不同的組件實現。每一個遊戲對象都具有一個Transform組件。
問題:獲取、增加、刪除組件的命令分別是什麼?
獲取:GetComponent增加:AddComponent刪除:Destroy

 

7. 物理引擎
物理引擎就是在遊戲中模擬真實的物理效果。Unity內置了NVIDIA的Physx物理引擎,Physx是目前使用最爲廣泛的物理引擎,被很多遊戲大作所採用,開發者可以通過物理引擎高效、逼真地模擬剛體碰撞、車輛駕駛、布料、重力等物理效果,使遊戲畫面更加真實而生動。
物理引擎主要包含三個核心內容:
1. Collider是最基本的觸發物理的條件,例如碰撞檢測。基本上,沒有Collider物理系統基本沒有意義(除了重力);
2. Rigidbody是物體的基本物理屬性設置,當檢測碰撞完之後,就要計算物理效果,而Rigidbody提供計算基本參數。
3. PhysicMaterial則是附加的基本物理參數,是一個物理材質,UNITY3D有自帶默認的物理材質的係數(在Edit/Project Settings/Physic下設置),它參與碰撞的計算例如反彈效果摩擦效果等。
常見問題:
對Rigidbody施加力的常用方式?
AddForce 添加普通力;AddExplosionForce 添加爆炸力;AddForceAtPosition 添加位置力。
兩個Collider產生碰撞的必要條件?
至少要有一個物體具有Rigibody剛體纔會觸發OnColliderEnter函數。
有碰撞器Collider
碰撞器和觸發器的區別?
最大的區別是碰撞器有碰撞效果觸發器沒有;觸發器是一個特殊的碰撞器。
Collider有幾種?(三種)
1、Static Collider(靜態碰撞器):帶有Collider沒有添加Rigidbody的對象,用於靜止物體如地理環境;
2、Rigidbody collider:帶有rigidbody的collider對象,能夠根據物理引擎很好的響應外力和碰撞作用。
3、Kinematic rigidbody collider:帶有rigidbody的collider對象,開啓Is kinematic。
當物體進來OnTriggerEnter觸發,出去時OnTriggerExit觸發。那麼物體在進來後Destory後會如何?
經過測試是:不會調用OnTriggerExit。
PhysicMaterial有哪些主要屬性?
dynamicFriction:移動摩擦力,值在0到1之間。
staticFriction:靜止摩擦力,值在0到1之間。
Bounciness:彈力,0值沒有彈力,1-沒有能量損失的反彈。
Character Controller(角色控制器)的特性
角色本身不受Physics影響,需要接受外力作用時,使用OnCharacterColliderHit();
使用角色控制器如何防止角色經常卡住?
Skin Width:設置爲radius的10%;
Step offset:對於2meter(米)高的Character設爲0.1到0.4;
Min move distance設爲0即可。
Rigidbody常用屬性?
打開Is Kinematic後物體不受物理引擎影響,只受Transform控制;
Freeze Position凍結位置軸向,Freeze Rotation凍結方向軸向,凍結之後的軸向只受Transform控制;
使用Physics時不要使用Transform
CharacterController和Rigidbody的區別?
CharacterController自帶膠囊碰撞器,裏面包含有剛體的屬性;
Rigidbody就是剛體,使物體帶有剛體的特徵。
什麼是Trigger?
Collider勾選Is Trigger屬性,碰撞器變成觸發器;
在物體發生碰撞的整個過程中,有幾個階段,分別列出對應的函數?
OnCollisionEnter(進入)、OnCollisionStay(保持)、OnCollisionExit(退出)
什麼叫做鏈條關節?
Hinge Joint,可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內部相互移動而不產生作用力,但是達到固定距離後就會產生拉力

 

8. 導航網格

NavMesh(導航網格)是3D遊戲世界中用於實現動態物體自動尋路的一種技術,將遊戲中複雜的結構組織關係簡化爲帶有一定信息的網格,在這些網格的基礎上通過一系列的計算來實現自動尋路。。導航時,只需要給導航物體掛載導航組建,導航物體便會自行根據目標點來尋找最直接的路線,並沿着該線路到達目標點。

https://www.cnblogs.com/jiangshuai52511/p/6226358.html

 

9. 解釋下A*尋路?(需要後續進行深入瞭解)
(AI是實時計算的,導航網格是自動計算的。AI可以自己研究算法,比導航網格更方便,導航網格被封裝了。)
首先,A*算法的提出是爲了解決遊戲中從A點到目標B點繞過障礙物 尋找最短路徑的問題。
其次,A*算法核心爲:啓發式搜索、估值函數、選取最小估值
最後,A*算法有優點也有缺點,它理論上將是時間最優的,但空間增長是指數級別的。

 

10. 光照貼圖(Lightmapping)
Lightmapping是一種增強靜態場景光照效果的技術,較少的性能消耗使靜態場景看上去更真實、豐富以及更具有立體感。
Unity使用Autodesk的Beast插件。
使用光照貼圖的優點:
A:使用光照貼圖比使用實時光源渲染要快 B:可以降低遊戲內存消耗 C、多個物體可以使用同一張光照貼圖

 

11. 後期屏幕渲染https://www.jianshu.com/p/aa753721ba2c

Image Effects圖像特效主要應用在Camera對象上,可以讓遊戲畫面帶來豐富的視覺效果,使得遊戲畫面更具藝術感和個性。
U3D的大部分特效可以混合使用,U3D的圖像特效都在OnRenderImage()函數中在圖像到達顏色緩存進行顯示交換前進行的圖像處理,任何附加在攝像機上的Image Effects腳本都可以通過編輯其代碼來修改特效的效果。
所有的後期屏幕特效只有pro版本才支持。
使用步驟:
Image Effects的腳本組件添加到攝像機上。
詳細組件:
1)Antialiasing(Fullscreen)腳本抗鋸齒全屏特效,NFAA、FXAA3、FXAA2、DLAA較快。
具體有邊緣閾值,模糊半徑,清晰度等設置。
2)Bloom腳本泛光特效,是增強版的輝光(類似高光耀斑),光暈(光暈和模糊)效果。
調節泛光的質量等級,模式,混合模式(屏幕是兩張圖像分別處理,Add疊加模式光暈會更亮),HDR高動態光照渲染開關, 泛光強度,閾值,Blur iterations模糊迭代效果。 Mask光暈遮蔽圖。
3) Bloom and Lens Flares 泛光和鏡頭炫光效果
泛光效果下增加鏡頭炫光(耀斑效果),和Bloom效果類似,只是是3.5版本的。
4)Blur 腳本模糊特效,迭代次數越多越模糊,模糊半徑,模糊shader的選擇。
5)Camera Motion Blur基於攝像機的運動模糊特效,模擬物體相對於攝像機作快速移動時產生的模糊效果。
有運動模糊算法的選擇,速度尺度,最小速度,攝像機移動,排除層不受模糊計算影響的層,抖動採樣設置,最大采樣數設置。
6)Color Correction色彩校正特效,有曲線類型,漸變紋理類型。
7)Contrast Enhance對比度增強特效,使用圖像處理領域中非銳化遮蔽圖(unsharp mask)方式來達到增強對比度的效果,使得圖像明亮的更加明亮,暗淡的更加暗淡。
8)Contrast Stretch 對比度拉伸特效。實現從黑暗空間中到明亮的空間時產生的眩目的感覺。
9)Crease 折皺特效,使得邊緣更加明顯粗糙,類似手繪效果。
10)Depth of field景深特效,使得邊緣朦朧,或者物體朦朧,產生視覺上景色深度效果。
Tilt Shift 移軸特效,是景深特效的特殊版本,使得閃焦區域的過渡更加光滑。
11)Edge Detection 邊緣檢測特效(分爲顏色和幾何)。類似手繪邊緣效果。
12)FishEye 魚眼效果。
13)Global Fog全局霧效果。
14)Glow 發光效果。
15) Grayscale灰度特效。
16)Motion Blur(Color Accumulation)運動模糊特效。
17)Noise噪波圖像特效,老式電影和電視的 嘩嘩 效果。
18)Sepia Tone棕褐色效果。
19)Screen Space Ambient Occlusion 屏幕空間環境遮擋(SSAO)特效。
20) SunShafts: 陽光射線特效。
陽光射線特效用於模擬亮度很高的光源被物體遮擋時所產生的徑向光線散射效果,合理運用該特效能有效地提升遊戲畫面的真實感。
21) Tonemapping 色調映射特效,該特效只有在攝像機對象啓用HDR模式時才能正常工作,可以增加視覺方向的光照細節表現,模擬人眼適應環境明暗交替效果,可以和Bloom配合得到更好效果。
22) Twirl 扭曲特效,Vortex旋渦圖像特效類似扭曲特效。
23)Vignettinggand Chromatic Aberration 漸暈和色差特效,也是有模糊效果

 

12. 遮擋剔除https://blog.csdn.net/qq_33747722/article/details/70549006

遮擋剔除 (Occlusion Culling) 功能可在對象因被其他物體遮擋,當前在相機中無法看到時,禁用對象渲染。該功能不會在三維計算機圖形中自動開啓,因爲在大部分情況下,離相機最遠的對象最先渲染,離相機近的對象覆蓋先前的物體(該步驟稱之爲“重複渲染 (overdraw)”)。遮擋剔除 (Occlusion Culling) 與視錐體剔除 (Frustum Culling) 不同。視錐體剔除 (Frustum Culling) 只禁用相機視野外的對象渲染,不禁用視野中被遮擋的任何物體的渲染。注意,使用遮擋剔除 (Occlusion Culling) 功能時,仍將受益於視錐體剔除 (Frustum Culling)。

 

13. 插件
最喜歡的就是U3D中的插件系統,Unity3D中的插件極大得提高了開發效率。
問題:常用的插件有哪些?
NGUI、2D Toolkit、iTween、PlayMaker、特效插件FxMaker、NGJMinMap(小地圖)等(最好多熟悉幾個插件,問的時候好回答)
一 界面製作 推薦:NGUI
二 2D遊戲製作 推薦:2D Toolkit   //[ˈtu:lkɪt] 工具包,工具箱
三 可視化編程 推薦:PlayMaker
四 插值插件 推薦:iTween,HOTween
五 路徑搜尋 推薦:Simple Path

 

14. iTween插件
是什麼?iTween是一個動畫庫。
原理?iTween的核心是數值插值,簡單說就是給iTween兩個數值(開始值,結束值),它會自動生成一些中間值。
應用場景?對象移動、振屏效果

 

15. 協同程序Coroutine
協同程序,即在主程序運行時同時開啓另一段邏輯處理,來協同當前程序的執行。換句話說,開啓協同程序就是開啓一個線程。
問題:協同程序有幾種開啓方式?
有兩種。在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以開啓一個線程。區別在於使用字符串作爲參數可以開啓線程並在線程結束前終止線程,相反使用IEnumerator 作爲參數只能等待線程的結束而不能隨時終止(除非使用StopAllCoroutines()方法);另外使用字符串作爲參數時,開啓線程時最多隻能傳遞一個參數,並且性能消耗會更大一點,而使用IEnumerator 作爲參數則沒有這個限制。
問題:如何終止協同程序?
使用StopCoroutine(string methodName)來終止一個協同程序,使用StopAllCoroutines()來終止所有可以終止的協同程序,但這兩個方法都只能終止該MonoBehaviour中的協同程序。
還有一種方法可以終止協同程序,即將協同程序所在gameobject的active屬性設置爲false。
問題:協同程序和線程之間的區別?
協程和線程差不多,線程的調度是由操作系統完成的,協程把這項任務交給了程序員自己實現,當然也就可以提高靈活性,另外協程的開銷比線程要小,在程序裏可以開更多的協程。
線程與協同程序的主要區別在於,一個具有多線程的程序可以同時運行幾個線程,而協同程序卻需要彼此協作地運行。就是說,一個具有多個協同程序的程序在任何時刻只能運行一個協同程序,並且正在運行的協同程序只會在其顯示地掛起時,它的執行纔會暫停。

 

17. 如何實現遊戲的暫停、加速和減速?
Time.timeScale = 0;即可讓遊戲暫停。
Time.timeScale=1時,Update、LateUpdate、FixedUpdate 都按正常的時間來執行。
Time.timeScale=2時,Update和 LateUpdate的執行速度是之前的2倍,而FixedUpdate還是按正常時間來執行。

 

18. 如何在Unity3D中使用單例模式?
先聲明一個靜態私有變量,如:instance;再聲明一個靜態公共方法,如:GetInstance,在該方法中判斷instance爲null時,通過GameObject.FindObjectOfType(typeof(MyClass))創建instance的實例(在C#中直接new一個新的實例),不爲null則直接返回。
參考代碼:
public class MyClass  
{  
     private static MyClass instance;  
     public static MyClass GetInstance()  
     {  
         if (!instance)  
         {  
             instance = GameObject.FindObjectOfType(typeof(MyClass));
         }  
         return instance;  
     }  
}

 

19. 什麼是遊戲AI
遊戲AI是遊戲中的人工智能,AI中最常用到的是隨機數Random和狀態控制。
如怪物AI:巡邏(隨機目標點)->發現->追趕->攻擊->返回->繼續巡邏
在實際項目中,AI腳本的參數往往設置成Public,供策劃人員修改。如:攻擊速度、技能類型、移動速度、命中率、攻擊百分比
形成一個閉環,保證任何時候Ai可用
要能夠畫出邏輯圖

 

20. Unity3D中腳本的編譯順序
腳本的編譯過程分四步:
1. 編譯所有 ”Standard Assets”, “Pro Standard Assets” or “Plugins” 目錄下的代碼
2. 編譯所有“Standard Assets/Editor”, “Pro Standard Assets/Editor” or “Plugins/Editor” 目錄下的代碼
3. 編譯除了上面列出來的目錄和Editor目錄之外的所有代碼
4. 編譯Editor目錄下的代碼
問題:如何在C#腳本中調用JS腳本中的方法?
如果你希望某個Javascript能被其他腳本引用,那麼把它放到第一組的某個目錄裏,然後把要使用它的代碼放在第三組的某個目錄裏就好了。
同樣,如果希望某個C#代碼能被其他Javascript腳本引用,也必須把這個C#腳本放到第一組的某個目錄裏,Javascript代碼放到第三組的某個目錄裏。
編輯器類存放路徑是什麼?
工程目錄下的Assets/Editor文件夾下。

 

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

 

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

 

23. 有兩個相同的方法,放在兩個腳本的Awake裏,將這兩個腳本放在同一個遊戲對象上,先執行那個?(李老師原創)
跟腳本的添加順序有關,後添加的先執行。由此可以推斷遊戲對象添加的組件以“棧”的數據結構保存,後進先出。


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

 

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

 

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


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


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


29. 如何銷燬一個UnityEngine.Object以及其子類
Destroy


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


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

 

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

 

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

 

34. 圖像學底層原理(李老師原創)
1.GPU計算:頂點、線、三角、像素顏色(貼圖)
2.(攝像機進行)可視化檢測
3.調用顯卡的底層渲染API(OpenGL、DX11)
-DrawPoint/DrawLine/DrawColor

 

35. NGUI核心原理?(原創)
UIGeomety(幾何圖形計算)->UIWebgit(部件)->UIPanel(容器分組)->UICamera(可視化檢測)->UIDrawCall(渲染)36. 座標系
Unity3D採用左手座標系
座標系有:世界座標系、屏幕座標系、GUI座標系
問題:localPosition與Position的使用區別?
localPosition:自身位置,相對於父級的變換的位置。
Position:在世界座標transform的位置


37. 腳本
問題:怎麼拿到一個對象上腳本的方法
GameObject.GetComponent<>();

 

38. 簡述一下對象池,你覺得在FPS遊戲裏哪些東西適合使用對象池?
對象池就存放需要被反覆調用資源的一個空間,比如遊戲中要常被大量複製的對象,子彈,敵人,以及任何重複出現的對象。


39. 對象池的原理?(原創)
作用:複用,提高對象使用效率,避免頻繁的銷燬、創建操作。
過程:
預熱-在使用之前批量創建對象
使用-從對象列表中獲取
回收-隱藏
擴容-自動批量創建(使用對象達到總容量80%)

 

40. 角色換裝怎麼做?思路
1.模型貼圖(類似人體彩繪)
2.Mesh Reander(換網格)
3.紙娃娃系統


41. 技能釋放怎麼做?
一般遊戲中的技能都是粒子特效,結合輸入控制粒子特效的播放。

 

42. 有限狀態機
每個對象都維護自己的狀態機,狀態機的狀態改變,靠狀態觸發器。每一個狀態觸發器都包含三個固定函數:Enter(進入)、Excute(執行)、Exit(退出)
請給我設計一個狀態機,完成一個簡單的xxxx情景。
答:狀態機並不是單純的switch結構,如果你是新手,你說switch我可以容忍,如果你幹了好些年2Dx,然後想自廢武功搞U3d了,再說switch就直接pass了。
FSM
FSMSystem 負責狀態的切換
FSMState 表示各個狀態基類,執行Excute、進入、退出、切換條件ChangeCheck
-Update
可以怪物AI來使用FSM

 

43. Unity 連接數據庫
本地數據最常用的是SQLite,需要得到Mono.Data.Sqlite.dll 文件與System.Data.dll文件。


44. 本地數據存儲方式?(原創)
文本:xml、json、excel(cvs)
數據庫:SQLite
PlayerPrefes

 

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


46. LayerMask.NameToLayer()這個方法有什麼作用?
LayerMask的使用是按位操作的,LayerMask.NameToLayer("Players") 返回該Layer的編號。在射線、攝像機遮罩剔除(Culling Mask)使用


47. itween插件的作用是什麼,itween作用於世界座標還是局部座標,請列舉出3個其常用方法?
iTween是一個動畫庫,作者創建它的目的就是最小的投入實現最大的產出。讓你做開發更輕鬆,用它可以輕鬆實現各種動畫,晃動,旋轉,移動,褪色,上色,控制音頻等等
方法:a、MoveTo  物體移動 ;b、ColorTo:隨着時間改變對象的顏色組; c、LookTo:隨時間旋轉物體讓其臉部朝向所提供的Vector3或Transform位置。

 

48. 什麼是局部座標,什麼是世界座標?
世界座標是不會變的,一直以世界座標軸的XYZ爲標準。
局部座標其實就是自身的座標,會隨着物體的旋轉而變化的。


49. 以下哪個函數在遊戲進入新場景後會被馬上調用?
MonoBehaviour.OnLevelWasLoaded


50. Mecanim系統中,Body Mask的作用是?
指定身體的某一部分是否參與渲染


51. Material和Physic Material區別?
PhysicMaterial 物理材質:物理材質描述,如何處理物體碰撞(摩擦,彈性)。
Material材質(材質類)爲了獲得一個對象使用的材質,可以使用 Renderer.materia屬性


52.動畫層(Animation Layers)的作用是什麼?
動畫層作爲一個具有層級動畫編輯概念的工具,可以用來製作和處理任何類型的動畫


53. 請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及他們執行的意義?
當renderer(渲染器)在任何相機上都不可見時調用:OnBecameInvisible
當renderer(渲染器)在任何相機上可見時調用:OnBecameVisible


54. 請簡述四元數的作用以及四元數相對於歐拉角的優點
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.與旋轉矩陣類似,兩個四元組相乘可表示兩次旋轉


55. 說一下您在U3D遊戲中用到的設計模式?
單例
MVC(NGUI的MVC架構:
1. 一個UI Panel(比如揹包界面)打成一個預製件-View 封裝
2. 揹包數據放在Model裏面
3. 行爲控制對應一個Controler腳本

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