本帖最后由 小布丁~ 于 2015-6-30 08:24 編輯 1. 游戲?qū)ο?/div> 問題:游戲?qū)ο笙N方法的區(qū)別?(enabled/Destroy/active) gameObject.renderer.enabled=fasle 是控制一個(gè)物體是否在屏幕上渲染或顯示 而物體實(shí)際還是存在的 只是想當(dāng)于隱身 而物體本身的碰撞體還依然存在的 GameObject.Destroy() 表示移除物體或物體上的組件 代表銷毀該物體 實(shí)際上該物體的內(nèi)存并沒有立即釋放 而是在你下下個(gè)場(chǎng)景中槽釋放內(nèi)存資源,就是你a場(chǎng)景中Destroy了 一般是在c場(chǎng)景中才真正釋放該物體的內(nèi)存資源(這是我的體會(huì) 不知道理解錯(cuò)誤沒) gameObject.active=false 是否在場(chǎng)景中停用該物體 在你gameObject.active =false中 則你在場(chǎng)景中用find找不到該物體 如果該物體有子物體 你要用SetActiveRecursively(false) 來(lái)控制是否在場(chǎng)景中停用該物體(遞歸的) 副作用:通過GameObject.Find方法查找不到 2. 協(xié)同程序(Coroutine) 協(xié)同程序,即在主程序運(yùn)行時(shí)同時(shí)開啟另一段邏輯處理,來(lái)協(xié)同當(dāng)前程序的執(zhí)行。換句話說(shuō),開啟協(xié)同程序就是開啟一個(gè)線程。 原理:協(xié)同程序被開啟后作為一個(gè)線程在運(yùn)行,而MonoBehaviour也是一個(gè)線程,他們成為互不干擾的模塊,除非代碼中用調(diào)用,他們共同作用于同一個(gè)對(duì)象,只有當(dāng)對(duì)象不可見才能同時(shí)終止這兩個(gè)線程。 使用MonoBehaviour.StartCoroutine方法即可開啟一個(gè)協(xié)同程序。 使用StopCoroutine(string methodName)來(lái)終止一個(gè)協(xié)同程序,使用StopAllCoroutines()來(lái)終止所有可以終止的協(xié)同程序,但這兩個(gè)方法都只能終止該MonoBehaviour中的協(xié)同程序。 還有一種方法可以終止協(xié)同程序,即將協(xié)同程序所在GameObject的Active屬性設(shè)置為false,當(dāng)再次設(shè)置active為ture時(shí),協(xié)同程序并不會(huì)再開啟。 協(xié)同程序和多線程的區(qū)別? 3. 動(dòng)態(tài)加載資源的方式?(有時(shí)候也問區(qū)別,具體請(qǐng)百度) Resources.Load();Resources.LoadAll() AssetBundle Resources.Load 資源必須放在Resources文件夾,只能加載本地文件。 AssetBundle和WWW一起使用,可以實(shí)現(xiàn)從服務(wù)器上下載資源,并動(dòng)態(tài)加載。 1.使用本身的GUI; 2.把攝像機(jī)的Projection(投影)值調(diào)為Orthographic(正交投影),不考慮z軸; 3.使用2d插件,如:2DToolKit、Uni2D; 4.Unity 4.3版本新增的Native 2D(原生) 5. AssetBundle AssetBundle的管理總共分為三部分:1、AssetBundle文件2、AssetBundle內(nèi)存鏡像3、AssetBundle 內(nèi)存對(duì)象實(shí)例 一張圖讀懂AssetBundle內(nèi)存管理機(jī)制 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3046.tmp.png 常見問題: 舉一個(gè)例子說(shuō)明AssetBundle如何進(jìn)行內(nèi)存釋放? 一個(gè)常見的錯(cuò)誤:你從某個(gè)AssetBundle里L(fēng)oad了一個(gè)prefab并克隆之:obj=Instantiate(AssetBundle1.Load('MyPrefab”); 這個(gè)prefab比如是個(gè)npc。 然后你不需要他的時(shí)候你用了:Destroy(obj);你以為就釋放干凈了。其實(shí)這時(shí)候只是釋放了Clone對(duì)象,通過Load加載的所有引用、非引用Assets對(duì)象全都靜靜靜的躺在內(nèi)存里。 這種情況應(yīng)該在Destroy以后用:AssetBundle1.Unload(true),徹底釋放干凈。 如果這個(gè)AssetBundle1是要反復(fù)讀取的 不方便Unload,那可以在Destroy以后用:Resources.UnloadUnusedAssets()把所有和這個(gè)npc有關(guān)的Asset都銷毀。 當(dāng)然如果這個(gè)NPC也是要頻繁創(chuàng)建銷毀的那就應(yīng)該讓那些Assets呆在內(nèi)存里以加速游戲體驗(yàn)。 由此可以解釋另一個(gè)之前有人提過的話題:為什么第一次Instantiate一個(gè)Prefab的時(shí)候都會(huì)卡一下,因?yàn)樵谀愕谝淮蜪nstantiate之前,相應(yīng)的Asset對(duì)象還沒有被創(chuàng)建,要加載系統(tǒng)內(nèi)置的AssetBundle并創(chuàng)建Assets,第一次以后你雖然Destroy了,但Prefab的Assets對(duì)象都還在內(nèi)存里,所以就很快了。 問題:unity3d中如何實(shí)現(xiàn)動(dòng)態(tài)資源加載? 使用AssetBundle技術(shù),通過WWW類從服務(wù)器下載AssetBundle資源包,將需要的資源加載到項(xiàng)目中。AssetBundle資源包帶有版本號(hào),用來(lái)判斷是否需要更新。 問題:AssetBunlde的優(yōu)點(diǎn)? 可以動(dòng)態(tài)加載資源 可以將資源放在服務(wù)器上,方便版本更新。 AssetBundle資源的加載和是否可以手動(dòng)控制,方便資源管理。 6. 組件(組件思想) 是什么? Unity3D面向?qū)ο缶幊套畲蟮捏w現(xiàn)就是組件化,任何一個(gè)游戲?qū)ο蠖际峭ㄟ^附加不同的組件實(shí)現(xiàn)。每一個(gè)游戲?qū)ο蠖季哂幸粋€(gè)Transform組件。 問題:獲取、增加、刪除組件的命令分別是什么? 獲?。篏etComponent增加:AddComponent刪除:Destroy 7. 物理引擎 物理引擎就是在游戲中模擬真實(shí)的物理效果。Unity內(nèi)置了NVIDIA的Physx物理引擎,Physx是目前使用最為廣泛的物理引擎,被很多游戲大作所采用,開發(fā)者可以通過物理引擎高效、逼真地模擬剛體碰撞、車輛駕駛、布料、重力等物理效果,使游戲畫面更加真實(shí)而生動(dòng)。 物理引擎主要包含三個(gè)核心內(nèi)容: 1. Collider是最基本的觸發(fā)物理的條件,例如碰撞檢測(cè)?;旧?,沒有Collider物理系統(tǒng)基本沒有意義(除了重力); 2. Rigidbody是物體的基本物理屬性設(shè)置,當(dāng)檢測(cè)碰撞完之后,就要計(jì)算物理效果,而Rigidbody提供計(jì)算基本參數(shù)。 3. PhysicMaterial則是附加的基本物理參數(shù),是一個(gè)物理材質(zhì),UNITY3D有自帶默認(rèn)的物理材質(zhì)的系數(shù)(在Edit/Project Settings/Physic下設(shè)置),它參與碰撞的計(jì)算例如反彈效果摩擦效果等。 常見問題: 對(duì)Rigidbody施加力的常用方式? AddForce 添加普通力;AddExplosionForce 添加爆炸力;AddForceAtPosition 添加位置力。 兩個(gè)Collider產(chǎn)生碰撞的必要條件? 至少要有一個(gè)物體具有Rigibody剛體才會(huì)觸發(fā)OnColliderEnter函數(shù)。 有碰撞器Collider 碰撞器和觸發(fā)器的區(qū)別? 最大的區(qū)別是碰撞器有碰撞效果觸發(fā)器沒有;觸發(fā)器是一個(gè)特殊的碰撞器。 Collider有幾種?(三種) 1、Static Collider(靜態(tài)碰撞器):帶有Collider沒有添加Rigidbody的對(duì)象,用于靜止物體如地理環(huán)境; 2、Rigidbody collider:帶有rigidbody的collider對(duì)象,能夠根據(jù)物理引擎很好的響應(yīng)外力和碰撞作用。 3、Kinematic rigidbody collider:帶有rigidbody的collider對(duì)象,開啟Is kinematic。 當(dāng)物體進(jìn)來(lái)OnTriggerEnter觸發(fā),出去時(shí)OnTriggerExit觸發(fā)。那么物體在進(jìn)來(lái)后Destory后會(huì)如何? 經(jīng)過測(cè)試是:不會(huì)調(diào)用OnTriggerExit。 PhysicMaterial有哪些主要屬性? dynamicFriction:移動(dòng)摩擦力,值在0到1之間。 staticFriction:靜止摩擦力,值在0到1之間。 Bounciness:彈力,0值沒有彈力,1-沒有能量損失的反彈。 Character Controller(角色控制器)的特性 角色本身不受Physics影響,需要接受外力作用時(shí),使用OnCharacterColliderHit(); 使用角色控制器如何防止角色經(jīng)常卡住? Skin Width:設(shè)置為radius的10%; Step offset:對(duì)于2meter(米)高的Character設(shè)為0.1到0.4; Min move distance設(shè)為0即可。 Rigidbody常用屬性? 打開Is Kinematic后物體不受物理引擎影響,只受Transform控制; Freeze Position凍結(jié)位置軸向,F(xiàn)reeze Rotation凍結(jié)方向軸向,凍結(jié)之后的軸向只受Transform控制; 使用Physics時(shí)不要使用Transform CharacterController和Rigidbody的區(qū)別? CharacterController自帶膠囊碰撞器,里面包含有剛體的屬性; Rigidbody就是剛體,使物體帶有剛體的特征。 什么是Trigger? Collider勾選Is Trigger屬性,碰撞器變成觸發(fā)器; 在物體發(fā)生碰撞的整個(gè)過程中,有幾個(gè)階段,分別列出對(duì)應(yīng)的函數(shù)? OnCollisionEnter(進(jìn)入)、OnCollisionStay(保持)、OnCollisionExit(退出) 什么叫做鏈條關(guān)節(jié)? Hinge Joint,可以模擬兩個(gè)物體間用一根鏈條連接在一起的情況,能保持兩個(gè)物體在一個(gè)固定距離內(nèi)部相互移動(dòng)而不產(chǎn)生作用力,但是達(dá)到固定距離后就會(huì)產(chǎn)生拉力。 8. 導(dǎo)航網(wǎng)格 參看PDF 9. 解釋下A*尋路? (AI是實(shí)時(shí)計(jì)算的,導(dǎo)航網(wǎng)格是自動(dòng)計(jì)算的。AI可以自己研究算法,比導(dǎo)航網(wǎng)格更方便,導(dǎo)航網(wǎng)格被封裝了。) 首先,A*算法的提出是為了解決游戲中從A點(diǎn)到目標(biāo)B點(diǎn)繞過障礙物 尋找最短路徑的問題。 其次,A*算法核心為:?jiǎn)l(fā)式搜索、估值函數(shù)、選取最小估值 最后,A*算法有優(yōu)點(diǎn)也有缺點(diǎn),它理論上將是時(shí)間最優(yōu)的,但空間增長(zhǎng)是指數(shù)級(jí)別的 10. 光照貼圖(Lightmapping) Lightmapping是一種增強(qiáng)靜態(tài)場(chǎng)景光照效果的技術(shù),較少的性能消耗使靜態(tài)場(chǎng)景看上去更真實(shí)、豐富以及更具有立體感。 Unity使用Autodesk的Beast插件。 使用光照貼圖的優(yōu)點(diǎn): A:使用光照貼圖比使用實(shí)時(shí)光源渲染要快 B:可以降低游戲內(nèi)存消耗 C、多個(gè)物體可以使用同一張光照貼圖 11. 后期屏幕渲染 參看PDF 12. 遮擋剔除 參看PDF 13. 插件 最喜歡的就是U3D中的插件系統(tǒng),Unity3D中的插件極大得提高了開發(fā)效率。 問題:常用的插件有哪些? NGUI、2D Toolkit、iTween、PlayMaker、特效插件FxMaker、NGJMinMap(小地圖)等(最好多熟悉幾個(gè)插件,問的時(shí)候好回答) 一 界面制作 推薦:NGUI 二 2D游戲制作 推薦:2D Toolkit //[?tu:lk?t] 工具包,工具箱 三 可視化編程 推薦:PlayMaker 四 插值插件 推薦:iTween,HOTween 五 路徑搜尋 推薦:Simple Path 14. iTween插件 是什么?iTween是一個(gè)動(dòng)畫庫(kù)。 原理?iTween的核心是數(shù)值插值,簡(jiǎn)單說(shuō)就是給iTween兩個(gè)數(shù)值(開始值,結(jié)束值),它會(huì)自動(dòng)生成一些中間值。 應(yīng)用場(chǎng)景?對(duì)象移動(dòng)、振屏效果 15. 協(xié)同程序Coroutine 協(xié)同程序,即在主程序運(yùn)行時(shí)同時(shí)開啟另一段邏輯處理,來(lái)協(xié)同當(dāng)前程序的執(zhí)行。換句話說(shuō),開啟協(xié)同程序就是開啟一個(gè)線程。 問題:協(xié)同程序有幾種開啟方式? 有兩種。在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以開啟一個(gè)線程。區(qū)別在于使用字符串作為參數(shù)可以開啟線程并在線程結(jié)束前終止線程,相反使用IEnumerator 作為參數(shù)只能等待線程的結(jié)束而不能隨時(shí)終止(除非使用StopAllCoroutines()方法);另外使用字符串作為參數(shù)時(shí),開啟線程時(shí)最多只能傳遞一個(gè)參數(shù),并且性能消耗會(huì)更大一點(diǎn),而使用IEnumerator 作為參數(shù)則沒有這個(gè)限制。 問題:如何終止協(xié)同程序? 使用StopCoroutine(string methodName)來(lái)終止一個(gè)協(xié)同程序,使用StopAllCoroutines()來(lái)終止所有可以終止的協(xié)同程序,但這兩個(gè)方法都只能終止該MonoBehaviour中的協(xié)同程序。 還有一種方法可以終止協(xié)同程序,即將協(xié)同程序所在gameobject的active屬性設(shè)置為false。 問題:協(xié)同程序和線程之間的區(qū)別? 協(xié)程和線程差不多,線程的調(diào)度是由操作系統(tǒng)完成的,協(xié)程把這項(xiàng)任務(wù)交給了程序員自己實(shí)現(xiàn),當(dāng)然也就可以提高靈活性,另外協(xié)程的開銷比線程要小,在程序里可以開更多的協(xié)程。 線程與協(xié)同程序的主要區(qū)別在于,一個(gè)具有多線程的程序可以同時(shí)運(yùn)行幾個(gè)線程,而協(xié)同程序卻需要彼此協(xié)作地運(yùn)行。就是說(shuō),一個(gè)具有多個(gè)協(xié)同程序的程序在任何時(shí)刻只能運(yùn)行一個(gè)協(xié)同程序,并且正在運(yùn)行的協(xié)同程序只會(huì)在其顯示地掛起時(shí),它的執(zhí)行才會(huì)暫停。 16. 動(dòng)畫系統(tǒng) U3D中支持模型動(dòng)畫和骨骼動(dòng)畫,模型動(dòng)畫是模型中自包含的幀動(dòng)畫,使用Animation組件控制;骨骼動(dòng)畫使用Animator組件控制,也就是Mecanim系統(tǒng),通過狀態(tài)機(jī)和混合樹控制動(dòng)畫的狀態(tài)轉(zhuǎn)換。骨骼動(dòng)畫應(yīng)用最廣泛。 問題:寫出Animation的五個(gè)方法? AddClip 添加剪輯、Blend 混合、Play 播放、Stop 停止、Sample 采樣 17. 如何實(shí)現(xiàn)游戲的暫停、加速和減速? Time.timeScale = 0;即可讓游戲暫停。 Time.timeScale=1時(shí),Update、LateUpdate、FixedUpdate 都按正常的時(shí)間來(lái)執(zhí)行。 Time.timeScale=2時(shí),Update和 LateUpdate的執(zhí)行速度是之前的2倍,而FixedUpdate還是按正常時(shí)間來(lái)執(zhí)行。 18. 如何在Unity3D中使用單例模式? 先聲明一個(gè)靜態(tài)私有變量,如:instance;再聲明一個(gè)靜態(tài)公共方法,如:GetInstance,在該方法中判斷instance為null時(shí),通過GameObject.FindObjectOfType(typeof(MyClass))創(chuàng)建instance的實(shí)例(在C#中直接new一個(gè)新的實(shí)例),不為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中最常用到的是隨機(jī)數(shù)Random和狀態(tài)控制。 如怪物AI:巡邏(隨機(jī)目標(biāo)點(diǎn))->發(fā)現(xiàn)->追趕->攻擊->返回->繼續(xù)巡邏 在實(shí)際項(xiàng)目中,AI腳本的參數(shù)往往設(shè)置成Public,供策劃人員修改。如:攻擊速度、技能類型、移動(dòng)速度、命中率、攻擊百分比 形成一個(gè)閉環(huán),保證任何時(shí)候Ai可用 要能夠畫出邏輯圖 20. Unity3D中腳本的編譯順序 腳本的編譯過程分四步: 1. 編譯所有 ”Standard Assets”, “Pro Standard Assets” or “Plugins” 目錄下的代碼 2. 編譯所有“Standard Assets/Editor”, “Pro Standard Assets/Editor” or “Plugins/Editor” 目錄下的代碼 3. 編譯除了上面列出來(lái)的目錄和Editor目錄之外的所有代碼 4. 編譯Editor目錄下的代碼 問題:如何在C#腳本中調(diào)用JS腳本中的方法? 如果你希望某個(gè)Javascript能被其他腳本引用,那么把它放到第一組的某個(gè)目錄里,然后把要使用它的代碼放在第三組的某個(gè)目錄里就好了。 同樣,如果希望某個(gè)C#代碼能被其他Javascript腳本引用,也必須把這個(gè)C#腳本放到第一組的某個(gè)目錄里,Javascript代碼放到第三組的某個(gè)目錄里。 編輯器類存放路徑是什么? 工程目錄下的Assets/Editor文件夾下。 21. U3D提供了一個(gè)用于保存讀取數(shù)據(jù)的類,(playerPrefs),請(qǐng)列出保存讀取整形數(shù)據(jù)的函數(shù) PlayerPrefs.SetInt 與 PlayerPrefs.GetInt 22. unity3d從喚醒到銷毀有一段生命周期,請(qǐng)列出系統(tǒng)自己調(diào)用的幾個(gè)重要方法。 Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –> OnGUI –> Reset –> OnDisable –> OnDestroy 23. 有兩個(gè)相同的方法,放在兩個(gè)腳本的Awake里,將這兩個(gè)腳本放在同一個(gè)游戲?qū)ο笊希葓?zhí)行那個(gè)?(李老師原創(chuàng)) 跟腳本的添加順序有關(guān),后添加的先執(zhí)行。由此可以推斷游戲?qū)ο筇砑拥慕M件以“?!钡臄?shù)據(jù)結(jié)構(gòu)保存,后進(jìn)先出。 24. 物理更新一般在哪個(gè)系統(tǒng)函數(shù)里? FixedUpdate,每固定幀繪制時(shí)執(zhí)行一次,和update不同的是FixedUpdate是渲染幀執(zhí)行,如果你的渲染效率低下的時(shí)候FixedUpdate調(diào)用次數(shù)就會(huì)跟著下降。FixedUpdate比較適用于物理引擎的計(jì)算,因?yàn)槭歉繋秩居嘘P(guān)。Update就比較適合做控制。 25. 移動(dòng)相機(jī)動(dòng)作在哪個(gè)函數(shù)里,為什么在這個(gè)函數(shù)里。 LateUpdate,,是在所有update結(jié)束后才調(diào),比較適合用于命令腳本的執(zhí)行。官網(wǎng)上例子是攝像機(jī)的跟隨,都是在所有update操作完才跟進(jìn)攝像機(jī),不然就有可能出現(xiàn)攝像機(jī)已經(jīng)推進(jìn)了,但是視角里還未有角色的空幀出現(xiàn)。 26. 當(dāng)游戲中需要頻繁創(chuàng)建一個(gè)物體對(duì)象時(shí),我們需要怎么做來(lái)節(jié)省內(nèi)存。 對(duì)象池,做一個(gè)pool,游戲開始時(shí)預(yù)先實(shí)例化足夠的數(shù)量,然后用的時(shí)候取不用的時(shí)候收回 27. 一個(gè)場(chǎng)景放置多個(gè)camera并同時(shí)處于活動(dòng)狀態(tài),會(huì)發(fā)生什么 實(shí)際看到的畫面由多個(gè)camera的畫面組成,由depth、Clear Flag、Culling Mask都會(huì)影響最終合成效果。 28. 簡(jiǎn)述prefab的用處和環(huán)境 在游戲運(yùn)行時(shí)實(shí)例化,prefab相當(dāng)于一個(gè)模版,對(duì)你已有的素材、腳本、參數(shù)做一個(gè)默認(rèn)配置,以便于以后修改,同時(shí)prefab打包的內(nèi)容簡(jiǎn)化了導(dǎo)出的操作,便于團(tuán)隊(duì)的交流。 29. 如何銷毀一個(gè)UnityEngine.Object以及其子類 Destroy 30. 為什么u3d會(huì)出現(xiàn)組件上數(shù)據(jù)丟失的情況 一般是組件上綁定的物體對(duì)象被刪除了 31. u3d下如何安全的在不同工程遷移asset數(shù)據(jù) 方法1,可以把assets目錄和ProjectSetting目錄一起遷移, 方法2,導(dǎo)出包 方法3,用unity帶的assets server功能 32. 請(qǐng)描述游戲動(dòng)畫有哪幾種,以及其原理。 主要有關(guān)節(jié)動(dòng)畫、單一網(wǎng)格模型動(dòng)畫(關(guān)鍵幀動(dòng)畫)、骨骼動(dòng)畫。 關(guān)節(jié)動(dòng)畫把角色分成若干獨(dú)立部分,一個(gè)部分對(duì)應(yīng)一個(gè)網(wǎng)格模型,部分的動(dòng)畫連接成一個(gè)整體的動(dòng)畫,角色比較靈活Quake2中使用了這種動(dòng)畫。 單一網(wǎng)絡(luò)模型動(dòng)畫由一個(gè)完整的網(wǎng)格模型構(gòu)成,在動(dòng)畫序列的關(guān)鍵幀里記錄各個(gè)頂點(diǎn)的原位置及其改變量,然后插值運(yùn)算實(shí)現(xiàn)動(dòng)畫效果,角色動(dòng)畫較真實(shí)。 骨骼動(dòng)畫,廣泛應(yīng)用的動(dòng)畫方式,集成了以上兩個(gè)方式的優(yōu)點(diǎn),骨骼按角色特點(diǎn)組成一定的層次結(jié)構(gòu),由關(guān)節(jié)相連,可做相對(duì)運(yùn)動(dòng),皮膚作為單一網(wǎng)格蒙在骨骼之外,決定角色的外觀。皮膚網(wǎng)格每一個(gè)頂點(diǎn)都會(huì)受到骨骼的影響,從而實(shí)現(xiàn)完美的動(dòng)畫。(骨骼動(dòng)畫是由關(guān)節(jié)動(dòng)畫發(fā)展而來(lái)的,如今基本都使用骨骼動(dòng)畫來(lái)實(shí)現(xiàn)角色動(dòng)畫) 問題:寫出Animation的五個(gè)方法 33. 如何優(yōu)化內(nèi)存? 有很多種方式,例如 1.壓縮自帶類庫(kù); 2.將暫時(shí)不用的以后還需要使用的物體隱藏起來(lái)而不是直接Destroy掉; 3.釋放AssetBundle占用的資源; 4.降低模型的片面數(shù),降低模型的骨骼數(shù)量,降低貼圖的大??; 5.使用光照貼圖,使用多層次細(xì)節(jié)(LOD),使用著色器(Shader),使用預(yù)設(shè)(Prefab)。 34. 圖像學(xué)底層原理(李老師原創(chuàng)) 1.GPU計(jì)算:頂點(diǎn)、線、三角、像素顏色(貼圖) 2.(攝像機(jī)進(jìn)行)可視化檢測(cè) 3.調(diào)用顯卡的底層渲染API(OpenGL、DX11) -DrawPoint/DrawLine/DrawColor 35. NGUI核心原理?(原創(chuàng)) UIGeomety(幾何圖形計(jì)算)->UIWebgit(部件)->UIPanel(容器分組)->UICamera(可視化檢測(cè))->UIDrawCall(渲染) 36. 坐標(biāo)系 Unity3D采用左手坐標(biāo)系 坐標(biāo)系有:世界坐標(biāo)系、屏幕坐標(biāo)系、GUI坐標(biāo)系 問題:localPosition與Position的使用區(qū)別? localPosition:自身位置,相對(duì)于父級(jí)的變換的位置。 Position:在世界坐標(biāo)transform的位置 37. 腳本 問題:怎么拿到一個(gè)對(duì)象上腳本的方法 GameObject.GetComponent<>(); 38. 簡(jiǎn)述一下對(duì)象池,你覺得在FPS游戲里哪些東西適合使用對(duì)象池? 對(duì)象池就存放需要被反復(fù)調(diào)用資源的一個(gè)空間,比如游戲中要常被大量復(fù)制的對(duì)象,子彈,敵人,以及任何重復(fù)出現(xiàn)的對(duì)象。 39. 對(duì)象池的原理?(原創(chuàng)) 作用:復(fù)用,提高對(duì)象使用效率,避免頻繁的銷毀、創(chuàng)建操作。 過程: 預(yù)熱-在使用之前批量創(chuàng)建對(duì)象 使用-從對(duì)象列表中獲取 回收-隱藏 擴(kuò)容-自動(dòng)批量創(chuàng)建(使用對(duì)象達(dá)到總?cè)萘?0%) 40. 角色換裝怎么做?思路 1.模型貼圖(類似人體彩繪) 2.Mesh Reander(換網(wǎng)格) 3.紙娃娃系統(tǒng) 41. 技能釋放怎么做? 一般游戲中的技能都是粒子特效,結(jié)合輸入控制粒子特效的播放。 42. 有限狀態(tài)機(jī) 每個(gè)對(duì)象都維護(hù)自己的狀態(tài)機(jī),狀態(tài)機(jī)的狀態(tài)改變,靠狀態(tài)觸發(fā)器。每一個(gè)狀態(tài)觸發(fā)器都包含三個(gè)固定函數(shù):Enter(進(jìn)入)、Excute(執(zhí)行)、Exit(退出) 請(qǐng)給我設(shè)計(jì)一個(gè)狀態(tài)機(jī),完成一個(gè)簡(jiǎn)單的xxxx情景。 答:狀態(tài)機(jī)并不是單純的switch結(jié)構(gòu),如果你是新手,你說(shuō)switch我可以容忍,如果你干了好些年2Dx,然后想自廢武功搞U3d了,再說(shuō)switch就直接pass了。 FSM FSMSystem 負(fù)責(zé)狀態(tài)的切換 FSMState 表示各個(gè)狀態(tài)基類,執(zhí)行Excute、進(jìn)入、退出、切換條件ChangeCheck -Update 可以怪物AI來(lái)使用FSM 對(duì)比(偽代碼) Update() If(state1) { If(state is 2) { //go to state2 } Excute(); } If(state2) { } 43. Unity 連接數(shù)據(jù)庫(kù) 本地?cái)?shù)據(jù)最常用的是SQLite,需要得到Mono.Data.Sqlite.dll 文件與System.Data.dll文件。 44. 本地?cái)?shù)據(jù)存儲(chǔ)方式?(原創(chuàng)) 文本:xml、json、excel(cvs) 數(shù)據(jù)庫(kù):SQLite PlayerPrefes 45. 請(qǐng)描述MeshRender中material和shader的區(qū)別? Shader(著色器)實(shí)際上就是一小段程序,它負(fù)責(zé)將輸入的Mesh(網(wǎng)格)以指定的方式和輸入的貼圖或者顏色等組合作用,然后輸出。繪圖單元可以依據(jù)這個(gè)輸出來(lái)將圖像繪制到屏幕上。輸入的貼圖或者顏色等,加上對(duì)應(yīng)的Shader,以及對(duì)Shader的特定的參數(shù)設(shè)置,將這些內(nèi)容(Shader及輸入?yún)?shù))打包存儲(chǔ)在一起,得到的就是一個(gè)Material(材質(zhì)) 46. LayerMask.NameToLayer()這個(gè)方法有什么作用? LayerMask的使用是按位操作的,LayerMask.NameToLayer("Players") 返回該Layer的編號(hào)。 在射線、攝像機(jī)遮罩剔除(Culling Mask)使用 47. itween插件的作用是什么,itween作用于世界坐標(biāo)還是局部坐標(biāo),請(qǐng)列舉出3個(gè)其常用方法? iTween是一個(gè)動(dòng)畫庫(kù),作者創(chuàng)建它的目的就是最小的投入實(shí)現(xiàn)最大的產(chǎn)出。讓你做開發(fā)更輕松,用它可以輕松實(shí)現(xiàn)各種動(dòng)畫,晃動(dòng),旋轉(zhuǎn),移動(dòng),褪色,上色,控制音頻等等 方法:a、MoveTo 物體移動(dòng) ;b、ColorTo:隨著時(shí)間改變對(duì)象的顏色組; c、LookTo:隨時(shí)間旋轉(zhuǎn)物體讓其臉部朝向所提供的Vector3或Transform位置。 48. 什么是局部坐標(biāo),什么是世界坐標(biāo)? 世界坐標(biāo)是不會(huì)變的,一直以世界坐標(biāo)軸的XYZ為標(biāo)準(zhǔn)。 局部坐標(biāo)其實(shí)就是自身的坐標(biāo),會(huì)隨著物體的旋轉(zhuǎn)而變化的。 49. 以下哪個(gè)函數(shù)在游戲進(jìn)入新場(chǎng)景后會(huì)被馬上調(diào)用? MonoBehaviour.OnLevelWasLoaded 50. Mecanim系統(tǒng)中,Body Mask的作用是? 指定身體的某一部分是否參與渲染 51. Material和Physic Material區(qū)別? PhysicMaterial 物理材質(zhì):物理材質(zhì)描述,如何處理物體碰撞(摩擦,彈性)。 Material材質(zhì)(材質(zhì)類)為了獲得一個(gè)對(duì)象使用的材質(zhì),可以使用 Renderer.materia屬性 52. 動(dòng)畫層(Animation Layers)的作用是什么? 動(dòng)畫層作為一個(gè)具有層級(jí)動(dòng)畫編輯概念的工具,可以用來(lái)制作和處理任何類型的動(dòng)畫 53. 請(qǐng)簡(jiǎn)述OnBecameVisible及OnBecameInvisible的發(fā)生時(shí)機(jī),以及他們執(zhí)行的意義? 當(dāng)renderer(渲染器)在任何相機(jī)上都不可見時(shí)調(diào)用:OnBecameInvisible 當(dāng)renderer(渲染器)在任何相機(jī)上可見時(shí)調(diào)用:OnBecameVisible 54. 請(qǐng)簡(jiǎn)述四元數(shù)的作用以及四元數(shù)相對(duì)于歐拉角的優(yōu)點(diǎn) A.四元數(shù)一般定義如下:q=w+xi+yj+zk其中 w,x,y,z是實(shí)數(shù)。同時(shí),有: i*i=-1 j*j=-1 k*k=-1 B.四元數(shù)也可以表示為: q=[w,v] 有多種方式可表示旋轉(zhuǎn),如 axis/angle、歐拉角(Euler angles)、矩陣(matrix)、四元組等。 相對(duì)于其它方法,四元組有其本身的優(yōu)點(diǎn): a.四元數(shù)不會(huì)有歐拉角存在的 gimbal lock 問題[萬(wàn)向節(jié)死鎖 b.四元數(shù)由4個(gè)數(shù)組成,旋轉(zhuǎn)矩陣需要9個(gè)數(shù) c.兩個(gè)四元數(shù)之間更容易插值 d.四元數(shù)、矩陣在多次運(yùn)算后會(huì)積攢誤差,需要分別對(duì)其做規(guī)范化(normalize)和正交化 (orthogonalize),對(duì)四元數(shù)規(guī)范化更容易 e.與旋轉(zhuǎn)矩陣類似,兩個(gè)四元組相乘可表示兩次旋轉(zhuǎn) 55. 說(shuō)一下您在U3D游戲中用到的設(shè)計(jì)模式? 單例 MVC(NGUI的MVC架構(gòu): 1. 一個(gè)UI Panel(比如背包界面)打成一個(gè)預(yù)制件-View 封裝 2. 背包數(shù)據(jù)放在Model里面 3. 行為控制對(duì)應(yīng)一個(gè)Controler腳本 UI架構(gòu)
|
|