111.
[動畫系統(tǒng)]如何將其他類型的動畫轉(zhuǎn)換成關(guān)鍵幀動畫?
動畫->點(diǎn)緩存->關(guān)鍵幀
112.
[動畫]Unity引擎Mecanim動畫系統(tǒng)功能優(yōu)點(diǎn)?
答:
l? 簡單化對類人角色動畫設(shè)計與功能實(shí)現(xiàn)的工作流程狰贯。
l? Mecanim動畫系統(tǒng)使用一個可視化編程工具來管理動畫之間復(fù)雜的交互歼跟。
l? 對完成綁定骨骼的類人角色轩性,能夠?qū)ι眢w不同的地方使用不同的邏輯進(jìn)行動畫控制声登。
l? 可以在角色動畫播放過程中添加動畫事件。
l? 人形動畫骨骼動畫可重復(fù)使用。
113.
[UI]請簡述NGUI中Panel和Anchor的作用?悯嗓。
答:Panel是一個容器件舵,它將包含所有UI小部件,并負(fù)責(zé)將所包含的部件組合脯厨。
Anchor是NGUI中屏幕分辨率的自適應(yīng)性铅祸,來適應(yīng)不同的分辨率的屏幕顯示。
注:
114.
[碰撞]怎么判斷兩個平面是否相交?不能用碰撞體合武,說出計算方法临梗。
答:以平面任意兩點(diǎn),取兩平面法向量眯杏,鏈接兩點(diǎn)線段夜焦,線段是否與法向量的夾角來判斷是否平行壳澳。
法向量如果平行岂贩,看線段與法向量的夾角,如果平行則兩平面重合巷波,判斷邊界是否相交萎津。
如果平行,且有夾角抹镊,說明不重合兩平面平行锉屈,一定不相交。
如果法向量不平行垮耳,將該線段的在兩平面投影方向上的射線判斷與平面的邊界條件颈渊,如果兩條射線的交點(diǎn)都在邊界內(nèi),則相交终佛,否則不相交俊嗽。
注:
115.
[碰撞]MeshCollider和其他Collider的一個主要不同點(diǎn)?
答:MeshCollider是網(wǎng)格碰撞器铃彰,對于復(fù)雜網(wǎng)狀模型上的碰撞檢測绍豁,比其他的碰撞檢測精確的多,但是相對其他的碰撞檢測計算也增多了牙捉,所以一般使用網(wǎng)格碰撞也不會在面數(shù)比較高的模型上添加竹揍,而會做出兩個模型,一個超簡模能表示物體的形狀用于做碰撞檢測邪铲,一個用于顯示芬位。
MeshCollider有Mesh屬性
116.
[碰撞]Unity3d中的碰撞器和觸發(fā)器的區(qū)別?
答:
碰撞器物體不能互相進(jìn)入到對方內(nèi)部带到,觸發(fā)器可以昧碉。
觸發(fā)器角色控制器可以使用,碰撞器中不能使用。
觸發(fā)器沒有物理屬性了晌纫,碰撞器可以有力存在税迷。
碰撞器調(diào)用OnCollisionEnter/Stay/Exit函數(shù),觸發(fā)器調(diào)用OnTriggerEnter/Stay/Exit函數(shù)锹漱。
117.
[碰撞]物體發(fā)生碰撞的必要條件箭养。
答:兩個物體都必須帶有碰撞器(Collider),其中一個物體還必須帶有Rigidbody剛體哥牍。
注:動的物體毕泌,你希望發(fā)生碰撞效果的物體要帶能接受物理引擎的操作,最常見的就是掛載Rigidbody組件嗅辣。
118.
[碰撞]CharacterController和Rigidbody的區(qū)別撼泛?
答:CharacterController自帶膠囊碰撞器,里面包含有剛體的屬性澡谭;
Rigidbody就是剛體愿题,使物體帶有剛體的特征。
注:
119.
[碰撞]當(dāng)一個細(xì)小的高速物體撞向另一個較大的物體時蛙奖,會出現(xiàn)什么情況潘酗?如何避免?
答:穿透(碰撞檢測失斞阒佟)仔夺。將物體移動放在FixedUpdate中,盡量使用物理引擎自己的移動方法攒砖。
避免的方法:把剛體的實(shí)時碰撞檢測打開Collision
Detection修改為Continuous
Dynamic
注:
120.
[碰撞]在unity3d中物體發(fā)生碰撞的整個過程中缸兔,有幾個階段,分別列出對應(yīng)的階段函數(shù)?
答:
主要是三個階段:
1.Collider.OnCollisionEnter 進(jìn)入碰撞吹艇,當(dāng)collider/rigidbody開始觸動另一個rigidbody/collider時OnCollisionEnter被調(diào)用惰蜜。
2.Collider.OnCollisionStay
逗留碰撞,每個collider/rigidbody觸動rigidbody/collider掐暮,將在每幀調(diào)用OnCollisionStay蝎抽。通俗的說,一個碰撞器或剛體觸動另一個剛體或碰撞器路克,在每幀都會調(diào)用OnCollisionStay樟结,直到它們之間離開不接觸。
3.Collider.OnCollisionExit 退出碰撞精算,當(dāng) collider/rigidbody停止觸動另一個
rigidbody/collider時瓢宦,OnCollisionExit被調(diào)用。
121.
[動畫]一個簡單的游戲,怪物會走動\攻擊\死亡,游戲角色會走動,跳躍\攻擊\格擋\死亡,還會接受玩家從輸入端輸入的指令,NPC會走動,他們彼此之間可以互相通信.請畫出以上三種角色的UML圖示.
答:
122.
[動畫]請描述游戲動畫有哪幾種灰羽,以及其原理驮履?
答:主要有關(guān)節(jié)動畫鱼辙、單一網(wǎng)格模型動畫(關(guān)鍵幀動畫)、骨骼動畫玫镐。
1.關(guān)節(jié)動畫:把角色分成若干獨(dú)立部分倒戏,一個部分對應(yīng)一個網(wǎng)格模型,部分的動畫連接成一個整體的動畫恐似,角色比較靈活杜跷,Quake2中使用這種動畫。
2.單一網(wǎng)格模型動畫由一個完整的網(wǎng)格模型構(gòu)成矫夷,在動畫序列的關(guān)鍵幀里記錄各個頂點(diǎn)的原位置及其改變量葛闷,然后插值運(yùn)算實(shí)現(xiàn)動畫效果,角色動畫較真實(shí)双藕。
3.骨骼動畫淑趾,廣泛應(yīng)用的動畫方式,集成了以上兩個方式的優(yōu)點(diǎn)忧陪,骨骼按角色特點(diǎn)組成一定的層次結(jié)構(gòu)扣泊,有關(guān)節(jié)相連,可做相對運(yùn)動赤嚼,皮膚作為單一網(wǎng)格蒙在骨骼之外旷赖,決定角色的外觀顺又,皮膚網(wǎng)格每一個頂點(diǎn)都會受到骨骼的影響更卒,從而實(shí)現(xiàn)完美的動畫。
123.
[動畫]反向旋轉(zhuǎn)動畫的方法是什么稚照?
答:反轉(zhuǎn)動畫蹂空,將動畫的播放速度調(diào)到-1。
124.
[動畫]寫出Animation的五個方法果录。
答:AddClip?添加剪輯上枕、Blend?混合、Play?播放弱恒、Stop?停止辨萍、Sample?采樣?、CrossFade淡入淡出切換動畫返弹、IsPlaying是否正在播放某個動畫
125.
[動畫]動畫層(AnimationState?Layers)的作用是什么锈玉?
答:動畫層作為一個具有層級動畫編輯概念的工具,可以用來制作和處理任何類型的動畫义起。202,203題
126.
[動畫]Itween插件的作用是什么拉背,Itween作用于世界坐標(biāo)還是局部坐標(biāo),請列舉出3個其常用方法默终?
答:ITween是補(bǔ)間動畫的一個插件椅棺,主要作用就是給出開始犁罩、結(jié)束的值、時間两疚,此插件實(shí)現(xiàn)各種動畫床估,晃動,旋轉(zhuǎn)诱渤,移動顷窒,褪色,上色源哩,音量控制等等鞋吉。
方法:??? 1.MoveTo??物體移動
2.ColorTo:隨著時間改變對象的顏色組
3.LookTo:隨時間旋轉(zhuǎn)物體讓其臉部朝向所提供的Vector3或Transform位置
127.
[動畫]什么是法線貼圖?、CG動畫?励烦?
答:
法線貼圖:是一種特殊的紋理谓着,可以應(yīng)用在3D表面,讓低模呈現(xiàn)出更明顯的凹凸效果坛掠。一
般應(yīng)用在CG動畫赊锚、美術(shù)效果要求較高的單機(jī)游戲
CG動畫:游戲中的CG動畫其實(shí)是用3D模擬引擎制作的游戲短片,一般畫面效果比較真實(shí)屉栓。
128.
[線程和協(xié)程]Unity3D是否支持寫成多線程程序舷蒲?如果支持的話需要注意什么靡羡?(?)
答:Unity支持多線程惨恭,如果同時要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。
注意:1.雖然支持多線程罐寨,但是僅能從主線程中訪問Unity3D的組件域滥,對象和Unity3D系統(tǒng)調(diào)用纵柿,所以如果使用的話需要把組件中的數(shù)值傳到開啟的新線程中。
2.C#中有l(wèi)ock這個關(guān)鍵字启绰,以確保只有一個線程可以在特定時間內(nèi)訪問特定的對象
129.
[線程和協(xié)程]Unity3D的協(xié)程和C#線程之間的區(qū)別是什么昂儒?
答:多線程程序同時運(yùn)行多個線程,除主線程之外的線程無法訪問Unity3D的對象委可、組件渊跋、方法,而在任一指定時刻只有一個協(xié)程在運(yùn)行着倾。
130.
[線程和協(xié)程]什么是協(xié)同程序拾酝?
答:在主線程運(yùn)行時同時開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行屈呕。使用戶可以編寫更靈活的程序來控制運(yùn)動微宝、序列以及對象的行為。
131.
[3D數(shù)學(xué)]四元數(shù)是什么虎眨?主要作用什么蟋软?對歐拉角的優(yōu)點(diǎn)是什么镶摘?
答:所謂四元數(shù),就是把4個實(shí)數(shù)組合起來的東西岳守。4個元素中凄敢,一個是實(shí)部,其余3個是虛部
作用:四元數(shù)用于表示旋轉(zhuǎn)
優(yōu)點(diǎn):
1)能進(jìn)行增量旋轉(zhuǎn)
2)避免萬向鎖
3)給定方位的表達(dá)方式有兩種湿痢,互為負(fù)(歐拉角有無數(shù)種表達(dá)方式)
四元數(shù)不會有歐拉角存在的?gimbal?lock?問題[萬向節(jié)死鎖]
四元數(shù)由4個數(shù)組成涝缝,旋轉(zhuǎn)矩陣需要9個數(shù)
兩個四元數(shù)之間更容易插值
四元數(shù)、矩陣在多次運(yùn)算后會積攢誤差譬重,需要分別對其做規(guī)范化(normalize)和正交化?(orthogonalize)拒逮,對四元數(shù)規(guī)范化更容易
與旋轉(zhuǎn)矩陣類似,兩個四元組相乘可表示兩次旋轉(zhuǎn)
132.
[攝像機(jī)]在場景中放置多個Camera并同時處于活動狀態(tài)會發(fā)生什么臀规?
答:游戲界面可以看到很多攝像機(jī)的混合滩援。
133.
[攝像機(jī)]Unity攝像機(jī)有幾種工作方式,分別是什么塔嬉?
答:正交和透視玩徊。
正交無法看到一個物體距離自己有多遠(yuǎn),或者遠(yuǎn)近的變化谨究,物體也不會隨著距離而收縮恩袱,所以一般做2D游戲或者是UI時會使用正交攝像機(jī)。
透視一般看物體會隨著距離有大小的變化胶哲,一般3D游戲里經(jīng)常使用這種攝像機(jī)畔塔。
134.
[預(yù)制件]Prefab的作用?如何在移動環(huán)境的設(shè)備下恰當(dāng)?shù)厥褂盟?/p>
答:Prefab是預(yù)制件(預(yù)制物)纪吮,一般當(dāng)游戲中需要頻繁創(chuàng)建一個物體時俩檬,使用預(yù)制物可以節(jié)省內(nèi)存,方便創(chuàng)建碾盟,方便對游戲物體進(jìn)行操作,方便對屬性進(jìn)行修改技竟。
135.
[預(yù)制件]unity當(dāng)需要頻繁創(chuàng)建一個物體對象時冰肴,怎樣減少內(nèi)存?
答:動態(tài)加載再實(shí)例化榔组,如果自己不主動清理內(nèi)存的話熙尉,再次加載不會增加內(nèi)存的,會自動去取之前已經(jīng)加載好的assets搓扯,如果這一個assets你都嫌多的話检痰,那你只能減資源了,比如锨推,模型面數(shù)铅歼,紋理尺寸等
136.
[ Shader]寫出光照計算中的diffuse的計算公式
答:實(shí)際光照強(qiáng)度l=環(huán)境光(lambient)+漫反射光(Idiffuse)+鏡面高光(lspecular)
環(huán)境光:lambient=環(huán)境光強(qiáng)度(Aintensity)*環(huán)境光顏色(Acolor)
漫反射光:ldiffuse=鏡面光照強(qiáng)度(Dintensity)*鏡面光顏色(Scolor)*(光的反射向量(R).觀察者向量(V))^鏡面光指數(shù)(n)
137.
[ Shader]MeshRender中material和shader的區(qū)別公壤?
答:MeshRender是模型渲染的組件,有此組件物體才能顯示出來
Material是材質(zhì)球椎椰,實(shí)際就是shader的實(shí)例厦幅,并進(jìn)行賦值,貼圖慨飘、紋理确憨、顏色等。
Shader是著色器瓤的,實(shí)際上是一段程序休弃,還可以用來實(shí)現(xiàn)一些僅靠貼圖不容易實(shí)現(xiàn)的效果,如玻璃圈膏。
Shader大致分為:1.表面著色器
2.頂點(diǎn)和片元著色器
3.固定功能著色器
138.
[ Shader]alpha?blend工作原理
答:Alpha?Blend是?實(shí)現(xiàn)透明效果玫芦,Color = 原顏色*alpha/255+目標(biāo)色*(255-alpha)/255
139.
[ Shader]光照貼圖?的優(yōu)勢是什么?
答:1.使用光照貼圖比使用實(shí)時光源渲染要快
2.可以降低游戲內(nèi)存消耗
3.多個物體可以使用同一張光照貼圖
140.
[ Shader]Vertex?Shader是什么本辐,怎么計算桥帆?
答:頂點(diǎn)著色器:頂點(diǎn)著色器是一段執(zhí)行在GPU上的程序,用來取代fixed?pipeline中的
transformation和lighting慎皱,Vertex?Shader主要操作頂點(diǎn)老虫。
Vertex?Shader對輸入頂點(diǎn)完成了從local?space到homogeneous?space(齊次空間)的變換過程,homogeneous?space即projection?space的下一個space茫多。在這其間共有world?transformation,?view?transformation和projection?transformation及l(fā)ighting幾個過程祈匙。
141.
[ Shader] Unity3d提供了幾種光源,分別是什么天揖?
答:4種夺欲,Directionl light ,Point Light 今膊,Spot Light些阅,Area Light
平行光:Directional Light
點(diǎn)光源:Point Light
聚光燈:Spot Light
區(qū)域光源:Area Light
142.
[Unity]物理更新一般在哪個系統(tǒng)函數(shù)里?
答:FixedUpdate斑唬,每固定幀繪制時執(zhí)行一次市埋,和Update不同的是FixedUpdate是渲染幀執(zhí)行,如果你的渲染效率低下的時候FixedUpdate調(diào)用次數(shù)就會跟著下降恕刘。FixedUpdate比較適用于物理引擎的計算缤谎,因?yàn)槭歉繋秩居嘘P(guān)。Update就比較適合做控制褐着。
143.
[Unity]OnEnable坷澡、Awake、Start運(yùn)行時的發(fā)生順序含蓉?哪些可能在同一個對象周期中反復(fù)的發(fā)生频敛?
答:Awake –>OnEnable->Start
OnEnable在同一周期中可以反復(fù)地發(fā)生
Awake用于在游戲開始之前初始化變量或游戲狀態(tài)项郊。在腳本整個生命周期內(nèi)它僅被調(diào)用一次.Awake在所有對象被初始化之后調(diào)用,所以你可以安全的與其他對象對話或用諸如GameObject.FindWithTag這樣的函數(shù)搜索它們姻政。每個游戲物體上的Awke以隨機(jī)的順序被調(diào)用呆抑。因此,你應(yīng)該用Awake來設(shè)置腳本間的引用汁展,并用Start來傳遞信息鹊碍。
Start在腳本的生命周期中只被調(diào)用一次。它和Awake的不同是Start只在腳本實(shí)例被啟用時調(diào)用食绿。你可以按需調(diào)整延遲初始化代碼侈咕。Awake總是在Start之前執(zhí)行。這允許你協(xié)調(diào)初始化順序器紧。
但Start可以作為協(xié)程耀销,達(dá)到在同一周期調(diào)用多次的效果。不過實(shí)質(zhì)上依然是調(diào)用一次铲汪。
144.
[Unity]接上題熊尉,在上題當(dāng)中假設(shè)有一物體,一個腳本掛了兩次掌腰,請指出Awake的執(zhí)行順序狰住。
答:ExcutionOrder有關(guān),不設(shè)定順序的時候初始化Start的順序不確定齿梁。
145.
[Unity]Unity3d腳本從喚醒到銷毀有著一套比較完整的生命周期催植,請列出系統(tǒng)自帶的幾個重要的方法。
答:
方法名(按腳本聲明周期排列)
作用
備注
Editor
Reset
重置為默認(rèn)值勺择。
在用戶點(diǎn)擊見識版面的Reset按鈕或者首次添加該組件時被調(diào)用创南。此方法只在編輯模式下被調(diào)用。
Initialization
Awake
OnEnable
Start
Start在behaviour的生命周期中只被調(diào)用一次省核。它和Awake的不同是Start只在腳本實(shí)例被啟用時調(diào)用稿辙。你可以按需調(diào)整延遲初始化代碼。Awake總是在Start之前執(zhí)行芳撒。這允許你協(xié)調(diào)初始化順序邓深。
Start僅在Update方法第一次被調(diào)用前調(diào)用。
Physics
FixedUpdate
處理Rigidbody時笔刹,需要用FixedUpdate代替Update。例如:給剛體加一個作用力時冬耿,你必須應(yīng)用作用力在FixedUpdate里的固定幀舌菜,而不是Update中的幀。(兩者幀長不同)
如果固定時間步長小于實(shí)際幀更新時間亦镶,那么每一幀物理周期將會可能發(fā)生不止一次日月。
yield WaitForFixedUpdate
Internal physics update
OnTriggerXXX
OnCollisionXXX
Input events
OnMouseXXX
Game logic
Update
如果一個協(xié)成之前已經(jīng)yield了袱瓮,但是現(xiàn)在由于恢復(fù)了,那么將執(zhí)行剩下的部分爱咬。
yield null
yield WaitForSeconds
yield WWW
yield StartCoroutine
Internal animation update
LateUpdate
Scene rendering
OnWillRenderObject
如果對象可見每個相機(jī)都會調(diào)用它尺借。此函數(shù)在消隱過程中被調(diào)用,在渲染所有被消隱的物體之前被調(diào)用精拟。你可以用它來創(chuàng)建具有依賴性的紋理并且只有在被渲染的物體可見時才更新這個紋理燎斩。舉例來講,它已用于水組件中蜂绎。
OnPreCull
消隱決定哪個物體對于相機(jī)來說是可見的.OnPreCull僅是在這個過程被調(diào)用栅表。
只有腳本被附加到相機(jī)上時才會調(diào)用這個函數(shù)。
OnBecameVisible
OnBecameInvisible
OnPreRender
在相機(jī)渲染場景之前被調(diào)用师枣。
只有腳本被附加到相機(jī)并被啟用時才會調(diào)用這個函數(shù)怪瓶。
OnRenderObject
OnPostRender
在相機(jī)完成場景渲染之后被調(diào)用。
只有該腳本附于相機(jī)并啟用時才會調(diào)用這個函數(shù)践美。OnPostRender可以是一個協(xié)同程序洗贰。
OnRenderImage
Gizmo rendering
OnDrawGizmos
只在編輯模式下調(diào)用
GUI
renderingOnGUI
在每一幀更新時調(diào)用多次
End of frame
yield WaitForEndOfFrame
Pausing
OnApplicationPause
在程序檢測到暫停時,會在幀的結(jié)尾處被調(diào)用陨倡。
Disable/enable
OnDisable
在腳本是失效時被調(diào)用敛滋,被銷毀時也會被調(diào)用。如果再啟用的話玫膀,OnEnable會再一次被調(diào)用矛缨。
Decommissioning
OnDestroy
OnApplicationQuit
146.
[Unity]物理更新一般放在哪個系統(tǒng)函數(shù)里?
答:FixedUpdate因?yàn)椴皇艿接嬎銠C(jī)幀頻的影響帖旨,所以適合于做物理方面的更新箕昭。
147.
[Unity]移動攝像機(jī)的動作放在哪個系統(tǒng)函數(shù)中,為什么放在這個函數(shù)中解阅?
答:LateUpdate落竹,它是在Update結(jié)束后才調(diào)用。一般來說攝像機(jī)的跟隨货抄,都是在所有Update操作完成后進(jìn)行的述召,以免出現(xiàn)攝像機(jī)已經(jīng)推進(jìn)了,但是還有角色未刷新的空幀出現(xiàn)蟹地。
148.
[Unity]請簡述OnBecameVisible及OnBecameInvisible的發(fā)生時機(jī)积暖,以及這一對回調(diào)函數(shù)的意義?
答:當(dāng)物體是否可見切換之時怪与《嵝蹋可以用于只需要在物體可見時才進(jìn)行的計算。
當(dāng)renderer(渲染器)在任何相機(jī)上都不可見時調(diào)用:OnBecameInvisible
當(dāng)renderer(渲染器)在任何相機(jī)上可見時調(diào)用:OnBecameVisible
149.
[Unity]Unity3d提供了一個用于保存和讀取數(shù)據(jù)的類(PlayerPrefs),請列出保存和讀取整形數(shù)據(jù)的函數(shù)遍愿。
答:PlayerPrefs.SetInt()
PlayerPrefs.GetInt()
150.
[動畫]動畫狀態(tài)是動畫狀態(tài)機(jī)的基本構(gòu)件存淫。每種狀態(tài)包含的可能性有哪兩種?
答:單獨(dú)的動畫狀態(tài)沼填,混合樹桅咆。
151.
[動畫]簡述一下動畫層中權(quán)重(Weight )的概念
答:
動畫層中的權(quán)重是指某個動畫層在整個動畫中的影響,Weight的取值范圍為(0~1)
若權(quán)重值為1則此層動畫將與整個動畫融合
若權(quán)重值為0則此層動畫與整個動畫完全不融合
152.
[動畫]簡述一下Mecanim動畫層中動畫層的作用坞笙?
答:使用動畫層來管理身體不同部分的復(fù)雜狀態(tài)機(jī)岩饼。比如:你可以使用下半身(動畫)層來管理走動/跑動;使用上半身(動畫)層來控制攻擊/揮手動作羞海。
153.
[動畫]簡述一下以下代碼的功能忌愚?
Animator anim
;
int
idle = Animator.StringToHash("Base Layer.Idle");
AnimatorStateInfo
currentBaseStage;
void
Start () {
anim
= GetComponent();
}
void
Update () {
currentBaseStage
= anim.GetCurrentAnimatorStateInfo(0);
if
(currentBaseStage.nameHash == idle && !anim.IsInTransition(0))??????? {
anim.SetBool("hit",
false);
}
答:判斷當(dāng)前播放的動畫名字若是默認(rèn)層的Idle,并且沒有在進(jìn)行動畫切換却邓,則設(shè)置hit動畫參數(shù)為false硕糊。
154.
[動畫]若想讓尋路的物體在Walkable跟Red層可以尋路GetComponent().
areaMask等于幾?
答案:9
155.
[動畫]若想實(shí)現(xiàn)敵人攻擊動畫播放一半的時候角色減血腊徙,可用Mecanim動畫系統(tǒng)中的哪個功能處理比較好简十?
答:動畫事件。
156.
[動畫]Mecanim動畫系統(tǒng)中2DBlendTree與1DBlendTree的區(qū)別撬腾?
答:
1D是使用一個動畫參數(shù)來控制blend tree中幾個動畫判斷的融合螟蝙,
2D是使用兩個動畫參數(shù)來控制blend tree中幾個動畫判斷的融合。
157.
[物理引擎]如何實(shí)現(xiàn)把射線碰到的點(diǎn)(hit)轉(zhuǎn)為非主攝像機(jī)的屏幕坐標(biāo)民傻?
答:
public Camera myCamera;
myCamera.WorldToScreenPoint(hit)胰默;
158.
[Unity]Unity中的尋路系統(tǒng)屬于那種尋路方式?
答:網(wǎng)格尋路漓踢。
159.
[Unity]動態(tài)加載資源的方式牵署?區(qū)別是什么?
答:
1.Resources.Load();
2.AssetBundle
區(qū)別:
Resources資源的加載是動態(tài)加載內(nèi)部的喧半,AssetBundle 是動態(tài)加載外部的奴迅。
Resources是動態(tài)內(nèi)部調(diào)用,Resources在編輯環(huán)境下是project窗口的一個文件夾挺据,調(diào)用里面的資源取具,可以用Resources類,比如Resources.Load扁耐,打包后這個文件夾是不存在的暇检,會統(tǒng)一生成Assets資源。
AssetBundle 是外部調(diào)用婉称,要用AssetBundle 首先要先把資源打包為.assetbundle文件占哟,再動態(tài)的去加載這個文件,本地或者網(wǎng)絡(luò)服務(wù)器都可以酿矢。
WWW讀取文件
160.
[Unity]以下哪個函數(shù)在游戲進(jìn)入新場景后會被馬上調(diào)用榨乎?
答:?????? MonoBehaviour.OnLevelWasLoaded
161.
[Unity]如何銷毀一個UnityEngine.Object及其子類
答:Destory
162.
[Unity]獲取、增加瘫筐、刪除組件的命令分別是什么蜜暑?
答:獲取:GetComponent
增加:AddComponent
沒有刪除組件只有讓組件不生效:enable
163.
[Unity]Application.loadLevel命令是什么策肝?//過時了
答:加載關(guān)卡?肛捍。
UnityEngine.SceneManagement名稱空間下
SceneManager.LoadScene//加載場景
SceneManager.LoadSceneAsync//異步加載場景
164.
[Unity]調(diào)試記錄到控制臺的命令是什么?
答:?Debug.Log();
165.
[Unity]LayerMask.NameToLayer()這個方法有什么作用之众?
答:層索引拙毫。射線。
166.
[Unity]localPosition與Position的使用區(qū)別棺禾?
答:
localPosition:自身位置缀蹄,相對于父級物體的變換的位置,局部坐標(biāo)其實(shí)就是自身的坐標(biāo)膘婶。
Position:在世界坐標(biāo)transform的位置缺前,世界坐標(biāo)是不會變的,一直以世界坐標(biāo)軸的XYZ為標(biāo)準(zhǔn)悬襟。
167.
[Unity]物體自身旋轉(zhuǎn)使用的函數(shù)衅码?
答:Transform.Rotate()。
168.
[Unity]現(xiàn)有物體A和物體B脊岳,使物體A圍繞B旋轉(zhuǎn)并保持物體A的Y軸朝向不變逝段,請寫出你的方法。
答:
public class TestAround : MonoBehaviour
{
public GameObject ObjA;
public GameObject ObjB;
Vector3 NormalVector3;//法線
float speed = 5;
void Start()
{
GetNormal(AroundType.Horizontal);
}
private void GetNormal(AroundType aroundType)
{
Vector3 temp = ObjB.transform.position - ObjA.transform.position;
switch (aroundType)
{
case AroundType.Vertical:
NormalVector3=Vector3.Cross(Vector3.forward,temp);
break;
case AroundType.Horizontal:
NormalVector3 =
Vector3.Cross(Vector3.up, temp);
break;
default:
break;
}
}
void Update()
{
Debug.DrawLine(NormalVector3,ObjA.transform.position);
Vector3 temp = ObjB.transform.position - ObjA.transform.position;
Debug.DrawLine(temp, ObjA.transform.position);
Around(ObjA, ObjB);
}
private void Around(GameObject objA, GameObject objB)
{
Quaternion quater=Quaternion.Euler( NormalVector3*Time.deltaTime*speed);
objB.transform.position = quater * objB.transform.position;
}
}
enum AroundType
{
Vertical,
Horizontal
}
169.
[Unity]U3D中用于記錄節(jié)點(diǎn)空間幾何信息的組件名稱割捅,及其父類名稱奶躯。
答:Transform 父類是 Component
170.
[物理引擎]<憤怒的小鳥>給予初速度以后,怎么讓小鳥受到重力和空氣阻力的影響而繪制拋物線軌跡,說出具體的計算方法。
答:添加剛體使小鳥模擬受到重力和空氣阻力影響棺牧。不添加剛體的話寫受力分析巫糙。
設(shè)橫軸為方向的加速度為ax,垂直軸為ay。
小鳥的Vx,Vy
Vx=Vx+t*ax;(Vx>=0)
Vy=Vy+t*ay;
171.
[物理引擎]Material和Physic?Material區(qū)別颊乘?
答:PhysicMaterial?物理材質(zhì):主要是控制物體的摩擦参淹,彈力等物理屬性。
Material材質(zhì):主要是控制一個物體的顏色乏悄,質(zhì)感等顯示浙值。
172.
[物理引擎]Unity3d的物理引擎中,有幾種施加力的方式檩小,分別描述出來开呐。
答:rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函數(shù)中。
173.
[物理引擎]什么叫做鏈條關(guān)節(jié)筐付?
答:Hinge Joint卵惦,可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內(nèi)部相互移動而不產(chǎn)生作用力瓦戚,但是達(dá)到固定距離后就會產(chǎn)生拉力沮尿。
174.
[自動尋路]什么是導(dǎo)航網(wǎng)格(?NavMesh)?
答:?Unity內(nèi)一種用于實(shí)現(xiàn)自動尋路的網(wǎng)格较解。
175.
[
Unity]簡述Unity3D支持的作為腳本的語言的名稱畜疾。
答: JavaScript,C#印衔,Boo
176.
[3D數(shù)學(xué)]向量的點(diǎn)乘啡捶、叉乘以及歸一化的意義?
答:1)點(diǎn)乘計算兩個向量之間的夾角奸焙,還可表示某一方向的投影瞎暑。
2)叉乘得到的是法向量。
3)標(biāo)準(zhǔn)化向量:用在只關(guān)系方向忿偷,不關(guān)心大小的時候金顿。
177.
[3D數(shù)學(xué)]矩陣相乘的意義及注意點(diǎn)?
答:用于表示線性變換:旋轉(zhuǎn)鲤桥、縮放揍拆、投影、平移茶凳、仿射嫂拴。
注意:矩陣的蠕變:誤差的積累。
178.
[Unity引擎]為什么dynamic font在unicode環(huán)境下優(yōu)于static font贮喧?
答:Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案筒狠。
使用動態(tài)字體時,Unity將不會預(yù)先生成一個與所有字體的字符紋理箱沦。當(dāng)需要支持亞洲語言或者較大的字體的時候辩恼,若使用正常紋理,則字體的紋理將非常大谓形。
179.
[Unity引擎]Render的作用灶伊?描述MeshRender和SkinnedMeshRender的關(guān)系與不同。
答:render是渲染器寒跳,渲染器可以使物體顯示在屏幕上聘萨。
MeshRender是網(wǎng)格渲染,SkinnedMeshRender是蒙皮網(wǎng)格渲染器
180.
[Unity引擎]簡述SkinnedMesh的實(shí)現(xiàn)原理童太。
答:骨骼蒙皮動畫米辐,模型本身是靜態(tài)的胸完,是因?yàn)橥ㄟ^蒙皮,使模型每個點(diǎn)都有Skin數(shù)據(jù)翘贮,Skin數(shù)據(jù)包括頂點(diǎn)受到哪些骨骼影響以及這些骨骼影響頂點(diǎn)的權(quán)重值赊窥,還有動畫數(shù)據(jù),有了Skin數(shù)據(jù)的模型就可以根據(jù)動畫數(shù)據(jù)進(jìn)行顯示動畫了择膝。
181.
[Unity引擎]如何安全的在不同工程間安全地遷移asset數(shù)據(jù)誓琼?三種方法。
答:1)將Assets目錄和Library目錄一起遷移肴捉。
2)導(dǎo)出包。
3)用unity自帶的assets Server功能叔收。
182.
[
Unity引擎]Lod是什么齿穗,優(yōu)缺點(diǎn)是什么?
答:LOD是Level?of?detail簡稱饺律,意為多層次細(xì)節(jié)窃页,是最常用的游戲優(yōu)化技術(shù),LOD技術(shù)指根據(jù)物體模型的幾點(diǎn)在顯示環(huán)境中所處的位置和重要性复濒,決定物體渲染的資源分配脖卖,降低非重要物體的面數(shù)和細(xì)節(jié)度,從而獲得高效率的渲染運(yùn)算巧颈。
優(yōu)點(diǎn):可根據(jù)距離動態(tài)的選擇渲染不同細(xì)節(jié)的模型
缺點(diǎn):增加美工工作量畦木,增大了游戲的容量。
注:精簡文字描述砸泛。
答:LOD(Level?of?detail)多層次細(xì)節(jié)十籍,是最常用的游戲優(yōu)化技術(shù),LOD技術(shù)指根據(jù)物體模型的幾點(diǎn)在顯示環(huán)境中所處的位置和重要性唇礁,決定物體渲染的資源分配勾栗,降低非重要物體的面數(shù)和細(xì)節(jié)度,從而獲得高效率的渲染運(yùn)算盏筐。
優(yōu)點(diǎn):可根據(jù)距離動態(tài)的選擇渲染不同細(xì)節(jié)的模型
缺點(diǎn):增加美工工作量围俘,增大了游戲的容量。
183.
[
Unity]兩種陰影判斷的方法琢融、工作原理界牡。
答:自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出,即假設(shè)視點(diǎn)在點(diǎn)光源的位置吏奸。
投射陰影:因不透明物體遮擋光線使得場景中位于該物體后面的物體或區(qū)域收不到光照照射而形成的陰影欢揖。
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面奋蔚,再將這些投影面與場景中的其他平面求交得出陰影多邊形她混,保存這些陰影多邊形信息烈钞,然后在按視點(diǎn)位置對場景進(jìn)行相應(yīng)處理得到所要求的視圖(利用空間換時間,每次只需依據(jù)視點(diǎn)位置進(jìn)行一次陰影計算即可坤按,省去了一次消隱過程)若是動態(tài)光源此方法就無效了毯欣。
184.
[
Unity]MipMap是什么,作用臭脓?
答:MipMapping:在三維計算機(jī)圖形的貼圖渲染中有常用的技術(shù)酗钞,為加快渲染進(jìn)度和減少圖像鋸齒,貼圖被處理成由一系列被預(yù)先計算和優(yōu)化過的圖片組成的文件来累,這樣的貼圖被稱為MipMap砚作。
185.
[
Unity]Mecanim系統(tǒng)中,Body?Mask的作用是嘹锁?
答:指定身體的某一部分是否參與渲染
186.
[
Unity]Unity連接數(shù)據(jù)庫葫录。
答:需要得到Mono.Data.Sqlite.dll?文件與System.Data.dll文件。
187.
[ Unity]如何優(yōu)化內(nèi)存领猾?
答:1.壓縮自帶類庫米同;
2.將暫時不用的以后還需要使用的物體隱藏起來而不是直接Destroy掉;
3.釋放AssetBundle占用的資源摔竿;
4.降低模型的片面數(shù)面粮,降低模型的骨骼數(shù)量,降低貼圖的大屑痰汀熬苍;
5.使用光照貼圖;
6.使用多層次細(xì)節(jié)(LOD)郁季;
7.使用著色器(Shader)冷溃;
8.使用預(yù)設(shè)(Prefab)等。
解析:內(nèi)存開銷無外乎三大部分:1.資源內(nèi)存占用梦裂;2.引擎模塊自身內(nèi)存占用似枕;3.托管堆內(nèi)存占用
資源內(nèi)存占用。
在一個較為復(fù)雜的大型項目中年柠,資源的內(nèi)存占用往往占據(jù)了總體內(nèi)存的70%以上凿歼。因此,資源使用是否恰當(dāng)直接決定了項目的內(nèi)存占用情況冗恨。一般來說答憔,一款游戲項目的資源主要可以分為以下幾種:紋理(Texture),網(wǎng)絡(luò)(Mesh),動畫片段(AnimationClip)掀抹、音頻片段(AudioClip)虐拓、材質(zhì)(Material)、著色器(shader)傲武、字體資源(Font)以及文本資源(TextAsset)等等蓉驹。其中城榛,紋理,網(wǎng)格态兴、動畫片段和音頻片段則容易造成較大內(nèi)存開銷的資源狠持。
紋理
紋理資源可以說是幾乎所有游戲項目中占據(jù)最大內(nèi)存開銷的資源。一個6萬片的場景瞻润,網(wǎng)格資源最大才不過10MB喘垂,但一個2048*2048的紋理,可能直接就達(dá)到16MB绍撞,因此正勒,項目中紋理資源的使用是否恰當(dāng)會及大地印象項目的內(nèi)存占用。
那么楚午,紋理資源再使用時應(yīng)該注意哪些地方呢昭齐?
紋理格式。紋理格式是研發(fā)團(tuán)隊最需要關(guān)注的紋理屬性矾柜。因?yàn)樗粌H影響紋理的內(nèi)粗你占用,同時還決定了紋理的加載效率就谜。一般來說,我們建議開發(fā)團(tuán)隊盡可能根據(jù)硬件的種類選擇硬件支持的紋理格式比如Android平臺的ETC、iOS平臺的PVRTC畜埋、WindowsPC上的DXT等等翻伺。因此,我們在UWA測評報告中虹统,將紋理格式進(jìn)行了羅列弓坞,一邊開發(fā)團(tuán)隊進(jìn)行快速查找,一步定位车荔。
在使用硬件支持的紋理格式時渡冻,你可能會遇到以下幾個問題:
色階問題
由于ETC、PVRTC等格式均為有損壓縮忧便,因此族吻,當(dāng)紋理色差范圍跨度較大時,均不可避免地造成不同程度的階梯狀的色階問題珠增。因此超歌,很多研發(fā)團(tuán)隊使用RGBA32/ARGB32格式來實(shí)現(xiàn)更好的效果。但是蒂教,這種做法將造成很大的內(nèi)存占用巍举。比如,同樣一張1024*1024的紋理凝垛,如果不開啟Mipmap,并且為PVRTC格式懊悯,則其內(nèi)存占用為512KB蜓谋,而如果轉(zhuǎn)換為RGBA32位,則很可能占用更達(dá)到4MB定枷。所以孤澎,研發(fā)團(tuán)隊在使用RGBA32或ARGB32格式的紋理時,一定要慎重考慮欠窒,更為明智的選擇是盡量減少紋理的色差范圍覆旭,時期盡可能使用硬件支持的壓縮格式進(jìn)行存儲。
ETC1不支持透明通道問題
在Android平臺上岖妄,對于使用OpenGLES2.0的設(shè)備型将,其紋理格式僅能支持ETC1格式,該格式有個較為嚴(yán)重的問題荐虐,即不支持Alpha透明通道七兜,使得透明貼圖無法直接通過ETC1格式來進(jìn)行存儲。對此福扬。我們建議研發(fā)團(tuán)隊將透明貼圖盡可能分成兩張腕铸,即一張RGB24位紋理記錄原始紋理的顏色部分和一張Alpha8紋理記錄原始紋理的透明通道部分。然后铛碑,將這輛張貼圖分別轉(zhuǎn)化為ETC1格式的紋理狠裹,并通過特定的Shader來進(jìn)行渲染,從而來達(dá)到支持透明貼圖的效果汽烦。該種方法不僅可以極大程度上逼近RGBA透明貼圖的渲染效果涛菠,同時還可以降低紋理的內(nèi)存占用,是我們非常推薦的使用方式撇吞。
當(dāng)然俗冻,目前已經(jīng)有越來越多的設(shè)備支持了OpenGLES3.0這樣Android平臺上你可以進(jìn)一步使用ETC2甚至ASTC,這些紋理格式均為支持透明通道且壓縮比更為理想的紋理格式牍颈。如果你的游戲適合人群為中高端設(shè)備用戶迄薄,那么不妨直接使用這兩種格式來作為主要存儲格式。
紋理尺寸
一般來說颂砸,紋理尺寸越大噪奄,占用內(nèi)存越大。
Mipmap功能
Mipmap旨在有效降低渲染帶寬的壓力人乓,提升游戲的渲染效率勤篮。但是,開啟Mipmap會有將紋理內(nèi)存提升1.33倍色罚。對于具有較大縱深感的3D游戲來說碰缔,3D場景模型和角色我們一般是建議開啟Mipmap功能的,但很多2DUI紋理就不必要了戳护。
Read&Write
一般情況下金抡,文理資源“Read&Write”功能在Unity引擎中是默認(rèn)關(guān)閉的瀑焦。但是,我們?nèi)匀辉陧椖可疃葍?yōu)化時發(fā)現(xiàn)了不少項目的紋理資源會開啟該選項梗肝。對此榛瓮,我們建議壓發(fā)團(tuán)隊密切關(guān)注文理資源中該選項的使用,因?yàn)殚_啟該選項將會使文理內(nèi)存增大一倍巫击。
網(wǎng)格
網(wǎng)格資源在比較復(fù)雜的游戲中禀晓,往往占據(jù)較高的內(nèi)存。對于網(wǎng)格資源來說坝锰,它在使用時應(yīng)該注意那方面呢粹懒?
1)
Normal\Color和Tangent(切線)
在我們深度優(yōu)化過的大量項目中,Mesh資源的數(shù)據(jù)經(jīng)常會含有大量的Color數(shù)據(jù)顷级,Normal數(shù)據(jù)和Tangent數(shù)據(jù)凫乖。這些數(shù)據(jù)的存在將大幅增加Mesh資源的文件體積和內(nèi)存占用。其中Color數(shù)據(jù)和Normal數(shù)據(jù)主要為3DMax弓颈、Maya等建模軟件導(dǎo)出時設(shè)計所生成帽芽,而Tangent一般為導(dǎo)入引擎時生成。
更為麻煩的是翔冀,如果項目對Mesh進(jìn)行DrawCallBatching操作的話嚣镜,那么狠有可能進(jìn)一步增加總體內(nèi)存的占用。正因如此橘蜜,我們在UWA測評報告中為每個Mesh展示了其Normal,Color和Tangent屬性的具體使用情況,研發(fā)團(tuán)隊可以直接針對每種屬性進(jìn)行排序查看付呕,直接定位出現(xiàn)冗余數(shù)據(jù)的資源计福。一般來說這些數(shù)據(jù)主要為Shader所用,來生成較為酷炫的效果徽职。所以象颖,建議研發(fā)團(tuán)隊針對項目中的網(wǎng)格資源進(jìn)行詳細(xì)檢測,查看該模型的渲染Shader中是否需要這些數(shù)據(jù)進(jìn)行渲染姆钉。
動畫片段
音頻片段
引擎模塊自身內(nèi)存占用说订。
托管堆內(nèi)存占用
188.
[
Unity]如何優(yōu)化CPU?
答:
解析:CPU方面
就目前Unity移動游戲而言潮瓶,CPU方面的性能開銷主要可歸結(jié)為兩大類:引擎模塊性能開銷和自身代碼性能開銷陶冷。其中,引擎模塊中又可細(xì)致劃分為渲染模塊毯辅、動畫模塊埂伦、物理模塊、UI模塊思恐、粒子系統(tǒng)沾谜、加載模塊和GC調(diào)用等等膊毁。
通過大量的性能測評數(shù)據(jù),我們發(fā)現(xiàn)渲染模塊基跑、UI模塊和加載模塊婚温,往往占用了CPU性能開銷的Top3。
1.渲染模塊
1降低DrawCall
降低DrawCall的方法則主要是減少渲染物體的材質(zhì)種類媳否,并通過DrawCallBatching來減少其數(shù)量栅螟。Unity文檔對DrawCallBatching的原理和注意事項非常詳盡,感興趣的朋友可以直接查看Unity官方文登逆日。
但是嵌巷,需要注意的是游戲性能并非DrawCall越小越好。這是因?yàn)槭页椋瑳Q定渲染模塊心梗的除了DrawCall之外搪哪,還有用于傳輸渲染數(shù)據(jù)的總先帶寬。當(dāng)我們使用DrawCallBatching將同種的材質(zhì)和網(wǎng)絡(luò)模型拼合在儀器室坪圾,可能會造成同一時間需要傳輸?shù)臄?shù)據(jù)(Texture晓折、VB/IB等)大大增加,以至于造成堵塞兽泄。在資源無法計時傳輸過去的情況下漓概,GPU只能等待,從而反倒降低了游戲的運(yùn)行幀率病梢。
DrawCall和總線帶寬是天平的兩端胃珍,我們需要做的是盡可能維持天平的平衡,任何一邊過高或過低蜓陌,對性能來說都是無益的觅彰。
2簡化資源
簡化資源師非常行之有效的優(yōu)化手段。在大量的移動游戲中钮热,其渲染資源其實(shí)是過量的填抬。過量的過量的網(wǎng)絡(luò)資源、不合規(guī)的紋理資源等等隧期。
關(guān)于渲染模塊在CPU方面的優(yōu)化方法還有很多飒责,比如LOD、Occlusion Culling和Culling Distance等等仆潮。
2 UI模塊
UI模塊同樣也是幾乎所有的游戲項目中必備的模塊宏蛉。一個性能優(yōu)異的UI模塊可以將游戲的用戶體驗(yàn)再抬高一個檔次。
在NGUI優(yōu)化方面鸵闪,UIPanel.LateUpdate為性能優(yōu)化的重中之重檐晕。
對于UIPanel.LateUpdate的優(yōu)化,主要著眼與UIPanel的布局,其原則如下:
盡可能將動態(tài)UI元素和靜態(tài)UI元素分離到不同的UIPanel中辟灰,從而盡可能將因?yàn)樽儎拥腢I元素引起的沖歐控制在較小的范圍內(nèi)个榕;
盡可能讓動態(tài)UI元素按照同步性進(jìn)行劃分,即運(yùn)動幀率不同的UI元素盡可能分離放在不同的UIPanel中芥喇;
控制同一個UIPanel中動態(tài)UI元素的數(shù)量西采,數(shù)量越多,所創(chuàng)建的Mesh越大继控,從而使得重構(gòu)的開銷曾加械馆。比如戰(zhàn)斗過程中的HUD運(yùn)動協(xié)調(diào)會出現(xiàn)的比較多,此時武通,建議研發(fā)團(tuán)隊將運(yùn)動血條分離成不同的UIPanel霹崎,每組UIPanel下5~10個動態(tài)UI為宜。這種做法冶忱,其本質(zhì)是從概率上盡可能降低單振中UIPanel的重建開銷尾菇。
3加載模塊
加載模塊同樣也是任何游戲項目中所不可缺少的組成成分。與之前兩個模塊不同的是囚枪,加載模塊的性能開銷比較集中派诬,主要出現(xiàn)于場景切換處,且CPU占用峰值均較高链沼。
這里默赂,我們先來說說場景切換時,其性能開銷的主要體現(xiàn)形式括勺。對于目前的Unity版本而言缆八,場景切換時的主要性能開銷主要體現(xiàn)在兩個方面,前一場景的場景卸載和下一場景的場景加載疾捍。下面耀里,我們就具體來說說兩個方面的性能瓶頸:
1場景卸載,對于Unity引擎而言拾氓,場景卸載一般是由引擎自動完成的,即當(dāng)我們調(diào)用類似Application.LoadLevel的API時底哥,引擎即會開始對上一場景進(jìn)行處理咙鞍,其性能開銷主要被以下幾部分占據(jù)。
Destroy
引擎在切換場景時會手機(jī)為表示成DontDestoryOnLoad的GameObject及其Component趾徽,然后進(jìn)行Destroy续滋。同時,代碼中的OnDestory被觸發(fā)執(zhí)行孵奶,這里的性能開銷主要取決于OnDestroy回調(diào)函數(shù)中的代碼邏輯疲酌。
Resources.UnloadUnusedAssets
一般情況下,場景切換過程中,該API會被調(diào)用兩次朗恳,依次為引擎在切換場景是自動調(diào)用湿颅,另一次則為用戶手動調(diào)用(一般出現(xiàn)在場景加載后,用戶調(diào)用它來確保上一場景的資源被卸載干凈)粥诫。在我們測評過的大量項目中油航,該API的CPU開銷主要集中在500ms~3000m之間。其耗時開銷主要取決于場景中Asset和Object的數(shù)量怀浆,數(shù)量越多谊囚,則耗時越慢。
2場景加載
場景加載過程的性能開銷又可細(xì)分成以下幾個部分:
資源加載
資源加載幾乎占據(jù)整個加載過程的90%以上执赡,其加載效率主要取決于資源的加載方式(Resource.Load或AssetBundle加載)镰踏、加載量(紋理、網(wǎng)格沙合、材質(zhì)等資源數(shù)據(jù)的大械煳薄)和資源格式(紋理、音頻格式等)灌诅。不同的加載方式芳来、不同的資源格式,其加載效率可謂千差萬別猜拾。
Instantiate實(shí)例化
在場景加載過程中即舌,往往伴隨著大量的Instantiate實(shí)例化操作。在Instantiate實(shí)例化時挎袜,引擎底層會查看相關(guān)的資源是否已經(jīng)被加載顽聂,如果沒有,則會先加載其相關(guān)資源盯仪,再進(jìn)行實(shí)例化紊搪,這其實(shí)是大家遇到大多數(shù)“Instantiate”實(shí)例化問題的根本原因。
AssetBundle文章中所提倡的資源依賴關(guān)系打包并進(jìn)行預(yù)加載全景,從而來緩解Instantiate實(shí)例化的壓力耀石。
另一方面,Instantiate實(shí)例化的性能開銷還體現(xiàn)在腳本代碼的序列化上爸黄,如果腳本中序列化的信息很多滞伟,則Instantiate實(shí)例化時的時間亦會很長。最直接的例子就是NGUI炕贵,其代碼中存在很多SerializedField標(biāo)識梆奈,從而在實(shí)例化時帶來了較多的代碼序列化開銷。因此称开,在打架增加序列化信息時亩钟,這一點(diǎn)是需要大家時刻關(guān)注的
以上是游戲項目中性能開銷最大的三個模塊乓梨,當(dāng)然,游戲類型的不同清酥、設(shè)計的不同扶镀,其他模塊仍然會有較大的CPU占用。比如ARPG游戲中動畫系統(tǒng)和物理系統(tǒng)总处,音樂休閑類游戲中的音頻系統(tǒng)和例子系統(tǒng)等狈惫。
4代碼效率
邏輯代碼在一個較為復(fù)雜的游戲項目中往往占據(jù)較大的CPU開銷。這種情況在MOBA\ARPG\MMORPG等游戲類型中非常常見鹦马。
在項目優(yōu)化過程中胧谈,我們經(jīng)常會想知道,到底哪些函數(shù)占據(jù)了大量的CPU開銷荸频。同時菱肖,絕大多數(shù)的項目其中性能開銷都遵循著“二八原則”,即80%的性能消耗都集中在20%的函數(shù)上旭从。
189.
[
Unity]你用過哪些插件稳强?
答:
插件功能
插件名稱
界面制作
NGUI
2D游戲制作
2D Toolkit
可視化編程
PlayMaker
插值插件
iTween、HOTween
路徑搜尋
SimplePath
美術(shù)及動畫制作
RageSpline和悦、Smooth Moves
畫面增強(qiáng)
Bitmap2Material退疫、Strumpy Shader Editor
攝像機(jī)管理
Security Camera
資源包
Nature Pack
造路插件
EasyRoads3D
即時遮擋剔除/LOD多細(xì)節(jié)層次
Instant Occlusion Culling
190.
[3D圖形學(xué)]什么是渲染管道?
答:是指在顯示器上為了顯示出圖像而經(jīng)過的一系列必要操作鸽素。
渲染管道中的很多步驟褒繁,都要將幾何物體從一個坐標(biāo)系中變換到另一個坐標(biāo)系中去。
主要有三步:應(yīng)用程序階段馍忽,幾何階段
光柵階段
本地坐標(biāo)->視圖坐標(biāo)->背面裁剪->光照->裁剪->投影->視圖變換->光柵化棒坏。
191.
[3D圖形學(xué)]什么是矢量圖??
答:計算機(jī)中顯示的圖形一般可以分為兩大類——矢量圖和位圖遭笋。矢量圖使用直線和曲線來描述圖形坝冕,這些圖形的元素是一些點(diǎn)、線瓦呼、矩形喂窟、多邊形、圓和弧線等等央串,它們都是通過數(shù)學(xué)公式計算獲得的谎替。例如一幅花的矢量圖形實(shí)際上是由線段形成外框輪廓,由外框的顏色以及外框所封閉的顏色決定顯示出的顏色蹋辅。由于矢量圖形可通過公式計算獲得,所以矢量圖形文件體積一般較小挫掏。矢量圖形最大的優(yōu)點(diǎn)是無論放大侦另、縮小或旋轉(zhuǎn)等不會失真;最大的缺點(diǎn)是難以表現(xiàn)色彩層次豐富的逼真圖像效果。
192.
[3D圖形學(xué)]什么是矩陣褒傅?矩陣運(yùn)算弃锐?
答:矩陣:橫軸排列的二維數(shù)據(jù)表格
矩陣運(yùn)算:
加減
限制條件:行和列必須相同,對應(yīng)相加相減得到結(jié)果
乘法
限制條件:要求左矩陣的行和右矩陣的列必須同殿托,行數(shù)和左矩陣相等霹菊,列數(shù)和右矩陣相等,結(jié)果的第i行第j列支竹,是左矩陣的第i行和右矩陣的第j列逐個相乘并把結(jié)果相加旋廷,得到結(jié)果是結(jié)果
的
第i行第j列。
193.
[3D圖形學(xué)]角度和弧度的轉(zhuǎn)換礼搁。
答:角度和弧度
度和弧度之間的換算? 1弧度 = 180度 /pi(約57.3)
1度=pi/180弧度(約0.017)
194.
[3D圖形學(xué)]矢量標(biāo)量饶碘。
答:矢量有方向如力速度 標(biāo)量只有大小沒有方向如溫度
矢量取模就是只要大小不要方向
單位向量
有方向? 大小為1的向量
矢量的加法:是矢量的幾何和,服從平行四邊形規(guī)則
矢量滿足交換律馒吴,滿足結(jié)合律
在直角坐標(biāo)系中扎运,矢量等于騎在坐標(biāo)軸上投影的矢量之和(二維矢量可以看做三維矢量的特例也就是說,三維成立饮戳,二維也成立)
矢量減法:
大小相等
方向相反
稱為逆矢量豪治。
任意多個矢量首尾相連接組成閉合多邊形,其結(jié)果必為0
矢量的乘法:點(diǎn)積(內(nèi)積扯罐、標(biāo)量積)负拟、叉積(外積)結(jié)果是矢量
點(diǎn)積方法 dot
注:這題要問什么?
195.
[
Unity]動態(tài)加載資源的方式篮赢?
答:
1.Resources
2.AssetBundle
3.WWW
196.
[ Unity]場景中有大量物體及實(shí)時光源齿椅,會對性能帶來影響嗎?應(yīng)該如何解決启泣?
答:實(shí)時光源會對性能有影響涣脚,解決方案有以下幾種:
1使用unity的烘焙系統(tǒng)烘焙替代實(shí)時光源。
2使用三維建模軟件的烘焙系統(tǒng)烘焙代替實(shí)時光源寥茫。
3一般移動端開發(fā)實(shí)時光源只為了提供實(shí)時陰影效果遣蚀,所以設(shè)置實(shí)施光照的有效層。
197.
[ Unity]如何實(shí)現(xiàn)游戲的暫停纱耻、加速和減速芭梯?
答:
Time.timeScale = 0;即可讓游戲暫停弄喘。
Time.timeScale =
1時玖喘,Update、LateUpdate蘑志、FixedUpdate 都按正常的時間來執(zhí)行累奈。
Time.timeScale =
2時贬派,Update和 LateUpdate的執(zhí)行速度是之前的2倍,而FixedUpdate還是按正常時間來執(zhí)行
198.
[ Unity]請描述Prefab的作用澎媒,并描述如何在移動設(shè)備的環(huán)境下恰當(dāng)?shù)氖褂盟?/p>
答:Prefab可以理解為是一個游戲?qū)ο蠹捌浣M件的集臺,作用是使游戲?qū)ο蠹百Y源能夠被重復(fù)使用搞乏。相同的對象可以通過一個預(yù)設(shè)來創(chuàng)建,此過程可理解為實(shí)例化,預(yù)設(shè)可以進(jìn)行批量修改戒努。
199.
[
Unity]請簡述如何在不同分辨率下保持 UI 的一致性请敦?
答:NGUI 很好的解決了這一點(diǎn),屏幕分辨率的自適應(yīng)性储玫,原理就是計算出屏幕的寬高比跟原來的預(yù)設(shè)的屏幕分辨率求出一個對比值侍筛,然后修改攝像機(jī)的 size 。
注:
200.
[
Unity]加載關(guān)卡和異步加載關(guān)卡的方法缘缚?
答:
SceneManager.LoadScene//加載場景
SceneManager.LoadSceneAsync//異步加載場景
201.
[Shader]在unity中勾笆,開發(fā)者可以編寫幾種類型的Shader?
答:1桥滨、表面著色器(surface shaders)
通常情況下用戶都會使用這種Shader,它可以與燈光窝爪、陰影、投影器進(jìn)行交互齐媒。表面著色器的抽象層次比較高,它可以容易地以簡潔方式實(shí)現(xiàn)復(fù)雜的著色器效果蒲每。表面著色器可同時正常工作在前向渲染及延遲渲染模式下。表面著色器以句Cg/HLsL語言進(jìn)行編寫喻括。
2邀杏、頂點(diǎn)和片段著色器(Vertex and fragment Shaders)
如果需要一些表面著色器無法處理的酷炫效果,或者編寫的Shader不需要與燈光進(jìn)行交互,或是想要的只是全屏圖像效果,那么可以使用頂點(diǎn)和片段著色器。這種Shader可以非常靈活地實(shí)現(xiàn)需要的效果,但是需要編寫更多的代碼,并且很難與Unity的渲染管線完美集成唬血。頂點(diǎn)和片段著色器同樣是用Cg/HLsL語言來編寫望蜡。
3、固定功能管線著色器(Fixed Function Shaders)
如果游戲要運(yùn)行在不支持可編程管線的老舊硬件上,那么需要編寫這種Shader了拷恨。固定功能管線著色器可以作為片段或表面著色器的備用選擇,這在當(dāng)硬件無法運(yùn)行那些酷炫Shader的時候,還可以通過固定功能管線著色器來繪制出一些基本的內(nèi)容脖律。固定功能管線著色器完全以ShaderLab語言編寫,類似于微軟的Effects或是Nvidia的CgFX。
202.
[
UI]什么用途的紋理通惩笾叮可以不強(qiáng)制使用2次冪的寬高數(shù)值小泉?
答:UI紋理不需要強(qiáng)制使用2次冪,以NGUI舉例冕杠,NGUI會制作圖集微姊,圖集是2次冪的。
203.
[Unity引擎]unity中碰撞器(Collider)和觸發(fā)器(Trigger)的區(qū)別?
答:
碰撞器(Collider)有碰撞效果分预,IsTrigger=false兢交,可以調(diào)用OnCollisionEnter/Stay/Exit函數(shù)
觸發(fā)器(Trigger)沒有碰撞效果,isTrigger=true笼痹,可以調(diào)用OnTriggerEnter/Stay/Exit函數(shù)
204.
[網(wǎng)絡(luò)]請簡述TCP與UDP的區(qū)別配喳。
答:TCP是基于連接的飘诗,UDP基于無連接的
TCP對系統(tǒng)資源的要求多,UDP較少
UDP程序結(jié)構(gòu)較簡單
TCP是面向流數(shù)據(jù)的界逛,UDP是數(shù)據(jù)報
TCP保證數(shù)據(jù)正確性,UDP可能丟包纺座。
TCP保證數(shù)據(jù)的順序息拜,UDP不保證。
205.
[網(wǎng)絡(luò)]為什么建立連接協(xié)議是三次握手净响,而關(guān)閉連接卻是四次握手呢少欺?
答:這是因?yàn)榉?wù)段的LISTEN狀態(tài)下的SOCKET當(dāng)收到SYN報文的建立請求后,它可以把ACK和SYN(ACK起應(yīng)答作用馋贤,而SYN起同步作用)放在一個報文里來發(fā)送赞别。但關(guān)閉連接時,當(dāng)收到對方的FIN報文通知時配乓,它僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送給你了仿滔;但未必你所有的數(shù)據(jù)都全部發(fā)送給對方了,所以你未必會馬上關(guān)閉SOCKET犹芹,也即你可能還需要發(fā)送一些數(shù)據(jù)給對方之后崎页,再發(fā)送FIN報文給對方來表示你同意現(xiàn)在可以關(guān)閉連接了,所以它這里的ACK報文和FIN報文多數(shù)情況下都是分開發(fā)的腰埂。
206.
[網(wǎng)絡(luò)]為什么TIME_WAIT狀態(tài)還需要等2MSL后才能返回到CLOSED狀態(tài)飒焦?
答:這是因?yàn)殡m然雙反都同意關(guān)閉連接了,而且握手的4個報文也都協(xié)調(diào)和發(fā)送完畢屿笼,案例可以直接回到CLOSED狀態(tài)(就好比從SYN_SEND狀態(tài)到ESTABLISH狀態(tài)那樣)牺荠;但是因?yàn)槲覀儽仨氁亦l(xiāng)網(wǎng)絡(luò)是不可靠的,你無法保證你最后發(fā)送的ACK報文會一定被對方收到驴一,因此對方處于LASK_ACK狀態(tài)下的SOCKET可能會因?yàn)槌瑫r未收到ACK報文休雌,而重發(fā)FIN報文,所以這個TIME_WAIT狀態(tài)的作用就是來重發(fā)可能都是的ACK報文蛔趴。
207.
[Unity引擎]請簡述角色控制器中Move和SimpleMove函數(shù)的區(qū)別挑辆。
答:角色控制器中Move和SimpleMove函數(shù)都是用于實(shí)現(xiàn)角色游戲?qū)ο笠苿拥暮瘮?shù),它們的區(qū)別在于當(dāng)我們在每一幀調(diào)用SimpleMove函數(shù)時孝情,引擎將為該角色控制器對象添加一個重力鱼蝉,而Move函數(shù)則不會添加重力,需要我們通過代碼去實(shí)現(xiàn)重力的效果箫荡。
208.
[Unity引擎]請簡述一下什么是游戲引擎魁亦?
答:游戲引擎是指一些已經(jīng)編寫好的可編輯電腦游戲系統(tǒng)或者一些交互式實(shí)時圖像應(yīng)用程序的核心組件。這些系統(tǒng)為游戲設(shè)計者提供各種編寫游戲所需要的各種工具羔挡,其目的在于讓游戲設(shè)計者能容易和快速地做出游戲程序而不用由零開始洁奈。大部分都支持多種操作系統(tǒng)平臺间唉,如Linux、Mac
OS利术、微軟Windows呈野。游戲引擎包含以下系統(tǒng):渲染引擎(即“渲染器”,含二維圖像引擎和三維圖像引擎)印叁、物理引擎被冒、碰撞檢測系統(tǒng)、音效轮蜕、腳本引擎昨悼、電腦動畫、人工智能跃洛、網(wǎng)絡(luò)引擎以及場景管理率触。
209.
[Unity引擎]請簡述Unity中有哪些特殊文件夾及其作用?
1.Editor
Editor文件夾可以在根目錄下汇竭,也可以在子目錄里葱蝗,只要名子叫Editor就可以。比如目錄:/xxx/xxx/Editor
和 /Editor
是一樣的韩玩,無論多少個叫Editor的文件夾都可以垒玲。Editor下面放的所有資源文件或者腳本文件都不會被打進(jìn)發(fā)布包中,并且腳本也只能在編輯時使用找颓。一般呢會把一些工具類的腳本放在這里合愈,或者是一些編輯時用的DLL。
比如我們現(xiàn)在要做類似技能編輯器击狮,那么編輯器的代碼放在這里是再好不過了佛析,因?yàn)閷?shí)際運(yùn)行時我們只需要編輯器生成的文件,而不需要編輯器的核心代碼彪蓬。
2.Editor Default
Resources
Editor Default
Resources注意中間是有空格的寸莫,它必須放在Project視圖的根目錄下,如果你想放在/xxx/xxx/Editor Default
Resources
這樣是不行的档冬。你可以把編輯器用到的一些資源放在這里膘茎,比如圖片、文本文件酷誓、等等披坏。它和Editor文件夾一樣都不會被打到最終發(fā)布包里,僅僅用于開發(fā)時使用盐数。
3.Gizmos
我覺得這個文件夾其實(shí)沒什么用處棒拂,如下代碼所示它可以在Scene視圖里給某個坐標(biāo)繪制一個icon。它的好處是可以傳一個Vecotor3 作為圖片顯示的位置。
4.Plugins
如果做手機(jī)游戲開發(fā)一般 andoird 或者 ios
要接一些sdk 可以把sdk依賴的庫文件 放在這里帚屉,比如 .so
.jar .a 文件谜诫。這樣打完包以后就會自動把這些文件打在你的包中。
5.Resources
可以在根目錄下攻旦,也可以在子目錄里喻旷,只要名子叫Resources就可以。比如目錄:/xxx/xxx/Resources
和 /Resources
是一樣的牢屋,無論多少個叫Resources的文件夾都可以掰邢。Resources文件夾下的資源不管你用還是不用都會被打包進(jìn).apk或者.ipa
Resource.Load :編輯時和運(yùn)行時都可以通過Resource.Load來直接讀取。
Resources.LoadAssetAtPath()
:它可以讀取Assets目錄下的任意文件夾下的資源伟阔,它可以在編輯時或者編輯器運(yùn)行時用,它但是它不能在真機(jī)上用掰伸,它的路徑是”Assets/xx/xx.xxx” 必須是這種路徑皱炉,并且要帶文件的后綴名。
AssetDatabase.LoadAssetAtPath():它可以讀取Assets目錄下的任意文件夾下的資源狮鸭,它只能在編輯時用合搅。它的路徑是”Assets/xx/xx.xxx” 必須是這種路徑,并且要帶文件的后綴名歧蕉。
我覺得在電腦上開發(fā)的時候盡量來用Resource.Load() 或者
Resources.LoadAssetAtPath()?灾部,假如手機(jī)上選擇一部分資源要打assetbundle,一部分資源Resource.Load().那么在做.apk或者.ipa的時候
現(xiàn)在都是用腳本來自動化打包惯退,在打包之前
可以用AssetDatabase.MoveAsset()把已經(jīng)打包成assetbundle的原始文件從Resources文件夾下移動出去在打包赌髓,這樣打出來的運(yùn)行包就不會包行多余的文件了。打完包以后再把移動出去的文件夾移動回來催跪。
6. StreamingAssets
這個文件夾下的資源也會全都打包在.apk或者.ipa
它和Resources的區(qū)別是锁蠕,Resources會壓縮文件,但是它不會壓縮原封不動的打包進(jìn)去懊蒸。并且它是一個只讀的文件夾荣倾,就是程序運(yùn)行時只能讀不能寫。它在各個平臺下的路徑是不同的骑丸,不過可以用Application.streamingAssetsPath
它會根據(jù)當(dāng)前的平臺選擇對應(yīng)的路徑舌仍。
有些游戲?yàn)榱俗屗械馁Y源全部使用assetbundle,會把一些初始的assetbundle放在StreamingAssets目錄下通危,運(yùn)行程序的時候在把這些assetbundle拷貝在Application.persistentDataPath目錄下铸豁,如果這些assetbundle有更新的話,那么下載到新的assetbundle在把Application.persistentDataPath目錄下原有的覆蓋掉黄鳍。
因?yàn)锳pplication.persistentDataPath目錄是應(yīng)用程序的沙盒目錄推姻,所以打包之前是沒有這個目錄的,直到應(yīng)用程序在手機(jī)上安裝完畢才有這個目錄。
StreamingAssets目錄下的資源都是不壓縮的蝇恶,所以它比較大會占空間俏讹。
http://www.xuanyusong.com/archives/3229