Unity常見面試題(二)


111.

[動畫系統(tǒng)]如何將其他類型的動畫轉(zhuǎn)換成關(guān)鍵幀動畫?

動畫->點緩存->關(guān)鍵幀

112.

[動畫]Unity引擎Mecanim動畫系統(tǒng)功能優(yōu)點?

答:

l? 簡單化對類人角色動畫設(shè)計與功能實現(xiàn)的工作流程。

l? Mecanim動畫系統(tǒng)使用一個可視化編程工具來管理動畫之間復(fù)雜的交互。

l? 對完成綁定骨骼的類人角色,能夠?qū)ι眢w不同的地方使用不同的邏輯進行動畫控制。

l? 可以在角色動畫播放過程中添加動畫事件。

l? 人形動畫骨骼動畫可重復(fù)使用。

113.

[UI]請簡述NGUI中Panel和Anchor的作用?。

答:Panel是一個容器,它將包含所有UI小部件,并負責(zé)將所包含的部件組合。

Anchor是NGUI中屏幕分辨率的自適應(yīng)性,來適應(yīng)不同的分辨率的屏幕顯示。

注:

114.

[碰撞]怎么判斷兩個平面是否相交?不能用碰撞體,說出計算方法。

答:以平面任意兩點,取兩平面法向量,鏈接兩點線段,線段是否與法向量的夾角來判斷是否平行。

法向量如果平行,看線段與法向量的夾角,如果平行則兩平面重合,判斷邊界是否相交。

如果平行,且有夾角,說明不重合兩平面平行,一定不相交。

如果法向量不平行,將該線段的在兩平面投影方向上的射線判斷與平面的邊界條件,如果兩條射線的交點都在邊界內(nèi),則相交,否則不相交。

注:

115.

[碰撞]MeshCollider和其他Collider的一個主要不同點?

答:MeshCollider是網(wǎng)格碰撞器,對于復(fù)雜網(wǎng)狀模型上的碰撞檢測,比其他的碰撞檢測精確的多,但是相對其他的碰撞檢測計算也增多了,所以一般使用網(wǎng)格碰撞也不會在面數(shù)比較高的模型上添加,而會做出兩個模型,一個超簡模能表示物體的形狀用于做碰撞檢測,一個用于顯示。

MeshCollider有Mesh屬性

116.

[碰撞]Unity3d中的碰撞器和觸發(fā)器的區(qū)別?

答:

碰撞器物體不能互相進入到對方內(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)一個細小的高速物體撞向另一個較大的物體時,會出現(xiàn)什么情況?如何避免?

答:穿透(碰撞檢測失?。?。將物體移動放在FixedUpdate中,盡量使用物理引擎自己的移動方法。

避免的方法:把剛體的實時碰撞檢測打開Collision

Detection修改為Continuous

Dynamic

注:

120.

[碰撞]在unity3d中物體發(fā)生碰撞的整個過程中,有幾個階段,分別列出對應(yīng)的階段函數(shù)?

答:

主要是三個階段:

1.Collider.OnCollisionEnter 進入碰撞,當(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é)動畫:把角色分成若干獨立部分,一個部分對應(yīng)一個網(wǎng)格模型,部分的動畫連接成一個整體的動畫,角色比較靈活,Quake2中使用這種動畫。

2.單一網(wǎng)格模型動畫由一個完整的網(wǎng)格模型構(gòu)成,在動畫序列的關(guān)鍵幀里記錄各個頂點的原位置及其改變量,然后插值運算實現(xiàn)動畫效果,角色動畫較真實。

3.骨骼動畫,廣泛應(yīng)用的動畫方式,集成了以上兩個方式的優(yōu)點,骨骼按角色特點組成一定的層次結(jié)構(gòu),有關(guān)節(jié)相連,可做相對運動,皮膚作為單一網(wǎng)格蒙在骨骼之外,決定角色的外觀,皮膚網(wǎng)格每一個頂點都會受到骨骼的影響,從而實現(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作用于世界坐標還是局部坐標,請列舉出3個其常用方法?

答:ITween是補間動畫的一個插件,主要作用就是給出開始、結(jié)束的值、時間,此插件實現(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ù)效果要求較高的單機游戲

CG動畫:游戲中的CG動畫其實是用3D模擬引擎制作的游戲短片,一般畫面效果比較真實。

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ū)別是什么?

答:多線程程序同時運行多個線程,除主線程之外的線程無法訪問Unity3D的對象、組件、方法,而在任一指定時刻只有一個協(xié)程在運行。

130.

[線程和協(xié)程]什么是協(xié)同程序?

答:在主線程運行時同時開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。使用戶可以編寫更靈活的程序來控制運動、序列以及對象的行為。

131.

[3D數(shù)學(xué)]四元數(shù)是什么?主要作用什么?對歐拉角的優(yōu)點是什么?

答:所謂四元數(shù),就是把4個實數(shù)組合起來的東西。4個元素中,一個是實部,其余3個是虛部

作用:四元數(shù)用于表示旋轉(zhuǎn)

優(yōu)點:

1)能進行增量旋轉(zhuǎn)

2)避免萬向鎖

3)給定方位的表達方式有兩種,互為負(歐拉角有無數(shù)種表達方式)

四元數(shù)不會有歐拉角存在的?gimbal?lock?問題[萬向節(jié)死鎖]

四元數(shù)由4個數(shù)組成,旋轉(zhuǎn)矩陣需要9個數(shù)

兩個四元數(shù)之間更容易插值

四元數(shù)、矩陣在多次運算后會積攢誤差,需要分別對其做規(guī)范化(normalize)和正交化?(orthogonalize),對四元數(shù)規(guī)范化更容易

與旋轉(zhuǎn)矩陣類似,兩個四元組相乘可表示兩次旋轉(zhuǎn)

132.

[攝像機]在場景中放置多個Camera并同時處于活動狀態(tài)會發(fā)生什么?

答:游戲界面可以看到很多攝像機的混合。

133.

[攝像機]Unity攝像機有幾種工作方式,分別是什么?

答:正交和透視。

正交無法看到一個物體距離自己有多遠,或者遠近的變化,物體也不會隨著距離而收縮,所以一般做2D游戲或者是UI時會使用正交攝像機。

透視一般看物體會隨著距離有大小的變化,一般3D游戲里經(jīng)常使用這種攝像機。

134.

[預(yù)制件]Prefab的作用?如何在移動環(huán)境的設(shè)備下恰當(dāng)?shù)厥褂盟?/p>

答:Prefab是預(yù)制件(預(yù)制物),一般當(dāng)游戲中需要頻繁創(chuàng)建一個物體時,使用預(yù)制物可以節(jié)省內(nèi)存,方便創(chuàng)建,方便對游戲物體進行操作,方便對屬性進行修改。

135.

[預(yù)制件]unity當(dāng)需要頻繁創(chuàng)建一個物體對象時,怎樣減少內(nèi)存?

答:動態(tài)加載再實例化,如果自己不主動清理內(nèi)存的話,再次加載不會增加內(nèi)存的,會自動去取之前已經(jīng)加載好的assets,如果這一個assets你都嫌多的話,那你只能減資源了,比如,模型面數(shù),紋理尺寸等

136.

[ Shader]寫出光照計算中的diffuse的計算公式

答:實際光照強度l=環(huán)境光(lambient)+漫反射光(Idiffuse)+鏡面高光(lspecular)

環(huán)境光:lambient=環(huán)境光強度(Aintensity)*環(huán)境光顏色(Acolor)

漫反射光:ldiffuse=鏡面光照強度(Dintensity)*鏡面光顏色(Scolor)*(光的反射向量(R).觀察者向量(V))^鏡面光指數(shù)(n)

137.

[ Shader]MeshRender中material和shader的區(qū)別?

答:MeshRender是模型渲染的組件,有此組件物體才能顯示出來

Material是材質(zhì)球,實際就是shader的實例,并進行賦值,貼圖、紋理、顏色等。

Shader是著色器,實際上是一段程序,還可以用來實現(xiàn)一些僅靠貼圖不容易實現(xiàn)的效果,如玻璃。

Shader大致分為:1.表面著色器

2.頂點和片元著色器

3.固定功能著色器

138.

[ Shader]alpha?blend工作原理

答:Alpha?Blend是?實現(xiàn)透明效果,Color = 原顏色*alpha/255+目標色*(255-alpha)/255

139.

[ Shader]光照貼圖?的優(yōu)勢是什么?

答:1.使用光照貼圖比使用實時光源渲染要快

2.可以降低游戲內(nèi)存消耗

3.多個物體可以使用同一張光照貼圖

140.

[ Shader]Vertex?Shader是什么,怎么計算?

答:頂點著色器:頂點著色器是一段執(zhí)行在GPU上的程序,用來取代fixed?pipeline中的

transformation和lighting,Vertex?Shader主要操作頂點。

Vertex?Shader對輸入頂點完成了從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

點光源:Point Light

聚光燈:Spot Light

區(qū)域光源:Area Light

142.

[Unity]物理更新一般在哪個系統(tǒng)函數(shù)里?

答:FixedUpdate,每固定幀繪制時執(zhí)行一次,和Update不同的是FixedUpdate是渲染幀執(zhí)行,如果你的渲染效率低下的時候FixedUpdate調(diào)用次數(shù)就會跟著下降。FixedUpdate比較適用于物理引擎的計算,因為是跟每幀渲染有關(guān)。Update就比較適合做控制。

143.

[Unity]OnEnable、Awake、Start運行時的發(fā)生順序?哪些可能在同一個對象周期中反復(fù)的發(fā)生?

答:Awake –>OnEnable->Start

OnEnable在同一周期中可以反復(fù)地發(fā)生

Awake用于在游戲開始之前初始化變量或游戲狀態(tài)。在腳本整個生命周期內(nèi)它僅被調(diào)用一次.Awake在所有對象被初始化之后調(diào)用,所以你可以安全的與其他對象對話或用諸如GameObject.FindWithTag這樣的函數(shù)搜索它們。每個游戲物體上的Awke以隨機的順序被調(diào)用。因此,你應(yīng)該用Awake來設(shè)置腳本間的引用,并用Start來傳遞信息。

Start在腳本的生命周期中只被調(diào)用一次。它和Awake的不同是Start只在腳本實例被啟用時調(diào)用。你可以按需調(diào)整延遲初始化代碼。Awake總是在Start之前執(zhí)行。這允許你協(xié)調(diào)初始化順序。

但Start可以作為協(xié)程,達到在同一周期調(diào)用多次的效果。不過實質(zhì)上依然是調(diào)用一次。

144.

[Unity]接上題,在上題當(dāng)中假設(shè)有一物體,一個腳本掛了兩次,請指出Awake的執(zhí)行順序。

答:ExcutionOrder有關(guān),不設(shè)定順序的時候初始化Start的順序不確定。

145.

[Unity]Unity3d腳本從喚醒到銷毀有著一套比較完整的生命周期,請列出系統(tǒng)自帶的幾個重要的方法。

答:

方法名(按腳本聲明周期排列)

作用

備注

Editor

Reset

重置為默認值。

在用戶點擊見識版面的Reset按鈕或者首次添加該組件時被調(diào)用。此方法只在編輯模式下被調(diào)用。

Initialization

Awake

OnEnable

Start

Start在behaviour的生命周期中只被調(diào)用一次。它和Awake的不同是Start只在腳本實例被啟用時調(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中的幀。(兩者幀長不同)

如果固定時間步長小于實際幀更新時間,那么每一幀物理周期將會可能發(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

如果對象可見每個相機都會調(diào)用它。此函數(shù)在消隱過程中被調(diào)用,在渲染所有被消隱的物體之前被調(diào)用。你可以用它來創(chuàng)建具有依賴性的紋理并且只有在被渲染的物體可見時才更新這個紋理。舉例來講,它已用于水組件中。

OnPreCull

消隱決定哪個物體對于相機來說是可見的.OnPreCull僅是在這個過程被調(diào)用。

只有腳本被附加到相機上時才會調(diào)用這個函數(shù)。

OnBecameVisible

OnBecameInvisible

OnPreRender

在相機渲染場景之前被調(diào)用。

只有腳本被附加到相機并被啟用時才會調(diào)用這個函數(shù)。

OnRenderObject

OnPostRender

在相機完成場景渲染之后被調(diào)用。

只有該腳本附于相機并啟用時才會調(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因為不受到計算機幀頻的影響,所以適合于做物理方面的更新。

147.

[Unity]移動攝像機的動作放在哪個系統(tǒng)函數(shù)中,為什么放在這個函數(shù)中?

答:LateUpdate,它是在Update結(jié)束后才調(diào)用。一般來說攝像機的跟隨,都是在所有Update操作完成后進行的,以免出現(xiàn)攝像機已經(jīng)推進了,但是還有角色未刷新的空幀出現(xiàn)。

148.

[Unity]請簡述OnBecameVisible及OnBecameInvisible的發(fā)生時機,以及這一對回調(diào)函數(shù)的意義?

答:當(dāng)物體是否可見切換之時。可以用于只需要在物體可見時才進行的計算。

當(dāng)renderer(渲染器)在任何相機上都不可見時調(diào)用:OnBecameInvisible

當(dāng)renderer(渲染器)在任何相機上可見時調(diào)用:OnBecameVisible

149.

[Unity]Unity3d提供了一個用于保存和讀取數(shù)據(jù)的類(PlayerPrefs),請列出保存和讀取整形數(shù)據(jù)的函數(shù)。

答:PlayerPrefs.SetInt()

PlayerPrefs.GetInt()

150.

[動畫]動畫狀態(tài)是動畫狀態(tài)機的基本構(gòu)件。每種狀態(tài)包含的可能性有哪兩種?

答:單獨的動畫狀態(tài),混合樹。

151.

[動畫]簡述一下動畫層中權(quán)重(Weight )的概念

答:

動畫層中的權(quán)重是指某個動畫層在整個動畫中的影響,Weight的取值范圍為(0~1)

若權(quán)重值為1則此層動畫將與整個動畫融合

若權(quán)重值為0則此層動畫與整個動畫完全不融合

152.

[動畫]簡述一下Mecanim動畫層中動畫層的作用?

答:使用動畫層來管理身體不同部分的復(fù)雜狀態(tài)機。比如:你可以使用下半身(動畫)層來管理走動/跑動;使用上半身(動畫)層來控制攻擊/揮手動作。

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)前播放的動畫名字若是默認層的Idle,并且沒有在進行動畫切換,則設(shè)置hit動畫參數(shù)為false。

154.

[動畫]若想讓尋路的物體在Walkable跟Red層可以尋路GetComponent().

areaMask等于幾?

答案:9

155.

[動畫]若想實現(xiàn)敵人攻擊動畫播放一半的時候角色減血,可用Mecanim動畫系統(tǒng)中的哪個功能處理比較好?

答:動畫事件。

156.

[動畫]Mecanim動畫系統(tǒng)中2DBlendTree與1DBlendTree的區(qū)別?

答:

1D是使用一個動畫參數(shù)來控制blend tree中幾個動畫判斷的融合,

2D是使用兩個動畫參數(shù)來控制blend tree中幾個動畫判斷的融合。

157.

[物理引擎]如何實現(xiàn)把射線碰到的點(hit)轉(zhuǎn)為非主攝像機的屏幕坐標?

答:

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ù)在游戲進入新場景后會被馬上調(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:自身位置,相對于父級物體的變換的位置,局部坐標其實就是自身的坐標。

Position:在世界坐標transform的位置,世界坐標是不會變的,一直以世界坐標軸的XYZ為標準。

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é)點空間幾何信息的組件名稱,及其父類名稱。

答: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)生作用力,但是達到固定距離后就會產(chǎn)生拉力。

174.

[自動尋路]什么是導(dǎo)航網(wǎng)格(?NavMesh)?

答:?Unity內(nèi)一種用于實現(xiàn)自動尋路的網(wǎng)格。

175.

[

Unity]簡述Unity3D支持的作為腳本的語言的名稱。

答: JavaScript,C#,Boo

176.

[3D數(shù)學(xué)]向量的點乘、叉乘以及歸一化的意義?

答:1)點乘計算兩個向量之間的夾角,還可表示某一方向的投影。

2)叉乘得到的是法向量。

3)標準化向量:用在只關(guān)系方向,不關(guān)心大小的時候。

177.

[3D數(shù)學(xué)]矩陣相乘的意義及注意點?

答:用于表示線性變換:旋轉(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的實現(xiàn)原理。

答:骨骼蒙皮動畫,模型本身是靜態(tài)的,是因為通過蒙皮,使模型每個點都有Skin數(shù)據(jù),Skin數(shù)據(jù)包括頂點受到哪些骨骼影響以及這些骨骼影響頂點的權(quán)重值,還有動畫數(shù)據(jù),有了Skin數(shù)據(jù)的模型就可以根據(jù)動畫數(shù)據(jù)進行顯示動畫了。

181.

[Unity引擎]如何安全的在不同工程間安全地遷移asset數(shù)據(jù)?三種方法。

答:1)將Assets目錄和Library目錄一起遷移。

2)導(dǎo)出包。

3)用unity自帶的assets Server功能。

182.

[

Unity引擎]Lod是什么,優(yōu)缺點是什么?

答:LOD是Level?of?detail簡稱,意為多層次細節(jié),是最常用的游戲優(yōu)化技術(shù),LOD技術(shù)指根據(jù)物體模型的幾點在顯示環(huán)境中所處的位置和重要性,決定物體渲染的資源分配,降低非重要物體的面數(shù)和細節(jié)度,從而獲得高效率的渲染運算。

優(yōu)點:可根據(jù)距離動態(tài)的選擇渲染不同細節(jié)的模型

缺點:增加美工工作量,增大了游戲的容量。

注:精簡文字描述。

答:LOD(Level?of?detail)多層次細節(jié),是最常用的游戲優(yōu)化技術(shù),LOD技術(shù)指根據(jù)物體模型的幾點在顯示環(huán)境中所處的位置和重要性,決定物體渲染的資源分配,降低非重要物體的面數(shù)和細節(jié)度,從而獲得高效率的渲染運算。

優(yōu)點:可根據(jù)距離動態(tài)的選擇渲染不同細節(jié)的模型

缺點:增加美工工作量,增大了游戲的容量。

183.

[

Unity]兩種陰影判斷的方法、工作原理。

答:自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面

工作原理:利用背面剔除的方法求出,即假設(shè)視點在點光源的位置。

投射陰影:因不透明物體遮擋光線使得場景中位于該物體后面的物體或區(qū)域收不到光照照射而形成的陰影。

工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,保存這些陰影多邊形信息,然后在按視點位置對場景進行相應(yīng)處理得到所要求的視圖(利用空間換時間,每次只需依據(jù)視點位置進行一次陰影計算即可,省去了一次消隱過程)若是動態(tài)光源此方法就無效了。

184.

[

Unity]MipMap是什么,作用?

答:MipMapping:在三維計算機圖形的貼圖渲染中有常用的技術(shù),為加快渲染進度和減少圖像鋸齒,貼圖被處理成由一系列被預(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.使用多層次細節(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的紋理,可能直接就達到16MB,因此,項目中紋理資源的使用是否恰當(dāng)會及大地印象項目的內(nèi)存占用。

那么,紋理資源再使用時應(yīng)該注意哪些地方呢?

紋理格式。紋理格式是研發(fā)團隊最需要關(guān)注的紋理屬性。因為它不僅影響紋理的內(nèi)粗你占用,同時還決定了紋理的加載效率。一般來說,我們建議開發(fā)團隊盡可能根據(jù)硬件的種類選擇硬件支持的紋理格式比如Android平臺的ETC、iOS平臺的PVRTC、WindowsPC上的DXT等等。因此,我們在UWA測評報告中,將紋理格式進行了羅列,一邊開發(fā)團隊進行快速查找,一步定位。

在使用硬件支持的紋理格式時,你可能會遇到以下幾個問題:

色階問題

由于ETC、PVRTC等格式均為有損壓縮,因此,當(dāng)紋理色差范圍跨度較大時,均不可避免地造成不同程度的階梯狀的色階問題。因此,很多研發(fā)團隊使用RGBA32/ARGB32格式來實現(xiàn)更好的效果。但是,這種做法將造成很大的內(nèi)存占用。比如,同樣一張1024*1024的紋理,如果不開啟Mipmap,并且為PVRTC格式,則其內(nèi)存占用為512KB,而如果轉(zhuǎn)換為RGBA32位,則很可能占用更達到4MB。所以,研發(fā)團隊在使用RGBA32或ARGB32格式的紋理時,一定要慎重考慮,更為明智的選擇是盡量減少紋理的色差范圍,時期盡可能使用硬件支持的壓縮格式進行存儲。

ETC1不支持透明通道問題

在Android平臺上,對于使用OpenGLES2.0的設(shè)備,其紋理格式僅能支持ETC1格式,該格式有個較為嚴重的問題,即不支持Alpha透明通道,使得透明貼圖無法直接通過ETC1格式來進行存儲。對此。我們建議研發(fā)團隊將透明貼圖盡可能分成兩張,即一張RGB24位紋理記錄原始紋理的顏色部分和一張Alpha8紋理記錄原始紋理的透明通道部分。然后,將這輛張貼圖分別轉(zhuǎn)化為ETC1格式的紋理,并通過特定的Shader來進行渲染,從而來達到支持透明貼圖的效果。該種方法不僅可以極大程度上逼近RGBA透明貼圖的渲染效果,同時還可以降低紋理的內(nèi)存占用,是我們非常推薦的使用方式。

當(dāng)然,目前已經(jīng)有越來越多的設(shè)備支持了OpenGLES3.0這樣Android平臺上你可以進一步使用ETC2甚至ASTC,這些紋理格式均為支持透明通道且壓縮比更為理想的紋理格式。如果你的游戲適合人群為中高端設(shè)備用戶,那么不妨直接使用這兩種格式來作為主要存儲格式。

紋理尺寸

一般來說,紋理尺寸越大,占用內(nèi)存越大。

Mipmap功能

Mipmap旨在有效降低渲染帶寬的壓力,提升游戲的渲染效率。但是,開啟Mipmap會有將紋理內(nèi)存提升1.33倍。對于具有較大縱深感的3D游戲來說,3D場景模型和角色我們一般是建議開啟Mipmap功能的,但很多2DUI紋理就不必要了。

Read&Write

一般情況下,文理資源“Read&Write”功能在Unity引擎中是默認關(guān)閉的。但是,我們?nèi)匀辉陧椖可疃葍?yōu)化時發(fā)現(xiàn)了不少項目的紋理資源會開啟該選項。對此,我們建議壓發(fā)團隊密切關(guā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進行DrawCallBatching操作的話,那么狠有可能進一步增加總體內(nèi)存的占用。正因如此,我們在UWA測評報告中為每個Mesh展示了其Normal,Color和Tangent屬性的具體使用情況,研發(fā)團隊可以直接針對每種屬性進行排序查看,直接定位出現(xiàn)冗余數(shù)據(jù)的資源。一般來說這些數(shù)據(jù)主要為Shader所用,來生成較為酷炫的效果。所以,建議研發(fā)團隊針對項目中的網(wǎng)格資源進行詳細檢測,查看該模型的渲染Shader中是否需要這些數(shù)據(jù)進行渲染。

動畫片段

音頻片段

引擎模塊自身內(nèi)存占用。

托管堆內(nèi)存占用

188.

[

Unity]如何優(yōu)化CPU?

答:

解析:CPU方面

就目前Unity移動游戲而言,CPU方面的性能開銷主要可歸結(jié)為兩大類:引擎模塊性能開銷和自身代碼性能開銷。其中,引擎模塊中又可細致劃分為渲染模塊、動畫模塊、物理模塊、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越小越好。這是因為,決定渲染模塊心梗的除了DrawCall之外,還有用于傳輸渲染數(shù)據(jù)的總先帶寬。當(dāng)我們使用DrawCallBatching將同種的材質(zhì)和網(wǎng)絡(luò)模型拼合在儀器室,可能會造成同一時間需要傳輸?shù)臄?shù)據(jù)(Texture、VB/IB等)大大增加,以至于造成堵塞。在資源無法計時傳輸過去的情況下,GPU只能等待,從而反倒降低了游戲的運行幀率。

DrawCall和總線帶寬是天平的兩端,我們需要做的是盡可能維持天平的平衡,任何一邊過高或過低,對性能來說都是無益的。

2簡化資源

簡化資源師非常行之有效的優(yōu)化手段。在大量的移動游戲中,其渲染資源其實是過量的。過量的過量的網(wǎng)絡(luò)資源、不合規(guī)的紋理資源等等。

關(guān)于渲染模塊在CPU方面的優(yōu)化方法還有很多,比如LOD、Occlusion Culling和Culling Distance等等。

2 UI模塊

UI模塊同樣也是幾乎所有的游戲項目中必備的模塊。一個性能優(yōu)異的UI模塊可以將游戲的用戶體驗再抬高一個檔次。

在NGUI優(yōu)化方面,UIPanel.LateUpdate為性能優(yōu)化的重中之重。

對于UIPanel.LateUpdate的優(yōu)化,主要著眼與UIPanel的布局,其原則如下:

盡可能將動態(tài)UI元素和靜態(tài)UI元素分離到不同的UIPanel中,從而盡可能將因為變動的UI元素引起的沖歐控制在較小的范圍內(nèi);

盡可能讓動態(tài)UI元素按照同步性進行劃分,即運動幀率不同的UI元素盡可能分離放在不同的UIPanel中;

控制同一個UIPanel中動態(tài)UI元素的數(shù)量,數(shù)量越多,所創(chuàng)建的Mesh越大,從而使得重構(gòu)的開銷曾加。比如戰(zhàn)斗過程中的HUD運動協(xié)調(diào)會出現(xiàn)的比較多,此時,建議研發(fā)團隊將運動血條分離成不同的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ù)。

Destroy

引擎在切換場景時會手機為表示成DontDestoryOnLoad的GameObject及其Component,然后進行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場景加載

場景加載過程的性能開銷又可細分成以下幾個部分:

資源加載

資源加載幾乎占據(jù)整個加載過程的90%以上,其加載效率主要取決于資源的加載方式(Resource.Load或AssetBundle加載)、加載量(紋理、網(wǎng)格、材質(zhì)等資源數(shù)據(jù)的大小)和資源格式(紋理、音頻格式等)。不同的加載方式、不同的資源格式,其加載效率可謂千差萬別。

Instantiate實例化

在場景加載過程中,往往伴隨著大量的Instantiate實例化操作。在Instantiate實例化時,引擎底層會查看相關(guān)的資源是否已經(jīng)被加載,如果沒有,則會先加載其相關(guān)資源,再進行實例化,這其實是大家遇到大多數(shù)“Instantiate”實例化問題的根本原因。

AssetBundle文章中所提倡的資源依賴關(guān)系打包并進行預(yù)加載,從而來緩解Instantiate實例化的壓力。

另一方面,Instantiate實例化的性能開銷還體現(xiàn)在腳本代碼的序列化上,如果腳本中序列化的信息很多,則Instantiate實例化時的時間亦會很長。最直接的例子就是NGUI,其代碼中存在很多SerializedField標識,從而在實例化時帶來了較多的代碼序列化開銷。因此,在打架增加序列化信息時,這一點是需要大家時刻關(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

畫面增強

Bitmap2Material、Strumpy Shader Editor

攝像機管理

Security Camera

資源包

Nature Pack

造路插件

EasyRoads3D

即時遮擋剔除/LOD多細節(jié)層次

Instant Occlusion Culling

190.

[3D圖形學(xué)]什么是渲染管道?

答:是指在顯示器上為了顯示出圖像而經(jīng)過的一系列必要操作。

渲染管道中的很多步驟,都要將幾何物體從一個坐標系中變換到另一個坐標系中去。

主要有三步:應(yīng)用程序階段,幾何階段

光柵階段

本地坐標->視圖坐標->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。

191.

[3D圖形學(xué)]什么是矢量圖??

答:計算機中顯示的圖形一般可以分為兩大類——矢量圖和位圖。矢量圖使用直線和曲線來描述圖形,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數(shù)學(xué)公式計算獲得的。例如一幅花的矢量圖形實際上是由線段形成外框輪廓,由外框的顏色以及外框所封閉的顏色決定顯示出的顏色。由于矢量圖形可通過公式計算獲得,所以矢量圖形文件體積一般較小。矢量圖形最大的優(yōu)點是無論放大、縮小或旋轉(zhuǎn)等不會失真;最大的缺點是難以表現(xiàn)色彩層次豐富的逼真圖像效果。

192.

[3D圖形學(xué)]什么是矩陣?矩陣運算?

答:矩陣:橫軸排列的二維數(shù)據(jù)表格

矩陣運算:

加減

限制條件:行和列必須相同,對應(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é)]矢量標量。

答:矢量有方向如力速度 標量只有大小沒有方向如溫度

矢量取模就是只要大小不要方向

單位向量

有方向? 大小為1的向量

矢量的加法:是矢量的幾何和,服從平行四邊形規(guī)則

矢量滿足交換律,滿足結(jié)合律

在直角坐標系中,矢量等于騎在坐標軸上投影的矢量之和(二維矢量可以看做三維矢量的特例也就是說,三維成立,二維也成立)

矢量減法:

大小相等

方向相反

稱為逆矢量。

任意多個矢量首尾相連接組成閉合多邊形,其結(jié)果必為0

矢量的乘法:點積(內(nèi)積、標量積)、叉積(外積)結(jié)果是矢量

點積方法 dot

注:這題要問什么?

195.

[

Unity]動態(tài)加載資源的方式?

答:

1.Resources

2.AssetBundle

3.WWW

196.

[ Unity]場景中有大量物體及實時光源,會對性能帶來影響嗎?應(yīng)該如何解決?

答:實時光源會對性能有影響,解決方案有以下幾種:

1使用unity的烘焙系統(tǒng)烘焙替代實時光源。

2使用三維建模軟件的烘焙系統(tǒng)烘焙代替實時光源。

3一般移動端開發(fā)實時光源只為了提供實時陰影效果,所以設(shè)置實施光照的有效層。

197.

[ Unity]如何實現(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)建,此過程可理解為實例化,預(yù)設(shè)可以進行批量修改。

199.

[

Unity]請簡述如何在不同分辨率下保持 UI 的一致性?

答:NGUI 很好的解決了這一點,屏幕分辨率的自適應(yīng)性,原理就是計算出屏幕的寬高比跟原來的預(yù)設(shè)的屏幕分辨率求出一個對比值,然后修改攝像機的 size 。

注:

200.

[

Unity]加載關(guān)卡和異步加載關(guān)卡的方法?

答:

SceneManager.LoadScene//加載場景

SceneManager.LoadSceneAsync//異步加載場景

201.

[Shader]在unity中,開發(fā)者可以編寫幾種類型的Shader?

答:1、表面著色器(surface shaders)

通常情況下用戶都會使用這種Shader,它可以與燈光、陰影、投影器進行交互。表面著色器的抽象層次比較高,它可以容易地以簡潔方式實現(xiàn)復(fù)雜的著色器效果。表面著色器可同時正常工作在前向渲染及延遲渲染模式下。表面著色器以句Cg/HLsL語言進行編寫。

2、頂點和片段著色器(Vertex and fragment Shaders)

如果需要一些表面著色器無法處理的酷炫效果,或者編寫的Shader不需要與燈光進行交互,或是想要的只是全屏圖像效果,那么可以使用頂點和片段著色器。這種Shader可以非常靈活地實現(xiàn)需要的效果,但是需要編寫更多的代碼,并且很難與Unity的渲染管線完美集成。頂點和片段著色器同樣是用Cg/HLsL語言來編寫。

3、固定功能管線著色器(Fixed Function Shaders)

如果游戲要運行在不支持可編程管線的老舊硬件上,那么需要編寫這種Shader了。固定功能管線著色器可以作為片段或表面著色器的備用選擇,這在當(dāng)硬件無法運行那些酷炫Shader的時候,還可以通過固定功能管線著色器來繪制出一些基本的內(nèi)容。固定功能管線著色器完全以ShaderLab語言編寫,類似于微軟的Effects或是Nvidia的CgFX。

202.

[

UI]什么用途的紋理通??梢圆粡娭剖褂?次冪的寬高數(shù)值?

答:UI紋理不需要強制使用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)閉連接卻是四次握手呢?

答:這是因為服務(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)?

答:這是因為雖然雙反都同意關(guān)閉連接了,而且握手的4個報文也都協(xié)調(diào)和發(fā)送完畢,案例可以直接回到CLOSED狀態(tài)(就好比從SYN_SEND狀態(tài)到ESTABLISH狀態(tài)那樣);但是因為我們必須要家鄉(xiāng)網(wǎng)絡(luò)是不可靠的,你無法保證你最后發(fā)送的ACK報文會一定被對方收到,因此對方處于LASK_ACK狀態(tài)下的SOCKET可能會因為超時未收到ACK報文,而重發(fā)FIN報文,所以這個TIME_WAIT狀態(tài)的作用就是來重發(fā)可能都是的ACK報文。

207.

[Unity引擎]請簡述角色控制器中Move和SimpleMove函數(shù)的區(qū)別。

答:角色控制器中Move和SimpleMove函數(shù)都是用于實現(xiàn)角色游戲?qū)ο笠苿拥暮瘮?shù),它們的區(qū)別在于當(dāng)我們在每一幀調(diào)用SimpleMove函數(shù)時,引擎將為該角色控制器對象添加一個重力,而Move函數(shù)則不會添加重力,需要我們通過代碼去實現(xiàn)重力的效果。

208.

[Unity引擎]請簡述一下什么是游戲引擎?

答:游戲引擎是指一些已經(jīng)編寫好的可編輯電腦游戲系統(tǒng)或者一些交互式實時圖像應(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下面放的所有資源文件或者腳本文件都不會被打進發(fā)布包中,并且腳本也只能在編輯時使用。一般呢會把一些工具類的腳本放在這里,或者是一些編輯時用的DLL。

比如我們現(xiàn)在要做類似技能編輯器,那么編輯器的代碼放在這里是再好不過了,因為實際運行時我們只需要編輯器生成的文件,而不需要編輯器的核心代碼。

2.Editor Default

Resources

Editor Default

Resources注意中間是有空格的,它必須放在Project視圖的根目錄下,如果你想放在/xxx/xxx/Editor Default

Resources

這樣是不行的。你可以把編輯器用到的一些資源放在這里,比如圖片、文本文件、等等。它和Editor文件夾一樣都不會被打到最終發(fā)布包里,僅僅用于開發(fā)時使用。

3.Gizmos

我覺得這個文件夾其實沒什么用處,如下代碼所示它可以在Scene視圖里給某個坐標繪制一個icon。它的好處是可以傳一個Vecotor3 作為圖片顯示的位置。

4.Plugins

如果做手機游戲開發(fā)一般 andoird 或者 ios

要接一些sdk 可以把sdk依賴的庫文件 放在這里,比如 .so

.jar .a 文件。這樣打完包以后就會自動把這些文件打在你的包中。

5.Resources

可以在根目錄下,也可以在子目錄里,只要名子叫Resources就可以。比如目錄:/xxx/xxx/Resources

和 /Resources

是一樣的,無論多少個叫Resources的文件夾都可以。Resources文件夾下的資源不管你用還是不用都會被打包進.apk或者.ipa

Resource.Load :編輯時和運行時都可以通過Resource.Load來直接讀取。

Resources.LoadAssetAtPath()

:它可以讀取Assets目錄下的任意文件夾下的資源,它可以在編輯時或者編輯器運行時用,它但是它不能在真機上用,它的路徑是”Assets/xx/xx.xxx” 必須是這種路徑,并且要帶文件的后綴名。

AssetDatabase.LoadAssetAtPath():它可以讀取Assets目錄下的任意文件夾下的資源,它只能在編輯時用。它的路徑是”Assets/xx/xx.xxx” 必須是這種路徑,并且要帶文件的后綴名。

我覺得在電腦上開發(fā)的時候盡量來用Resource.Load() 或者

Resources.LoadAssetAtPath()?,假如手機上選擇一部分資源要打assetbundle,一部分資源Resource.Load().那么在做.apk或者.ipa的時候

現(xiàn)在都是用腳本來自動化打包,在打包之前

可以用AssetDatabase.MoveAsset()把已經(jīng)打包成assetbundle的原始文件從Resources文件夾下移動出去在打包,這樣打出來的運行包就不會包行多余的文件了。打完包以后再把移動出去的文件夾移動回來。

6. StreamingAssets

這個文件夾下的資源也會全都打包在.apk或者.ipa

它和Resources的區(qū)別是,Resources會壓縮文件,但是它不會壓縮原封不動的打包進去。并且它是一個只讀的文件夾,就是程序運行時只能讀不能寫。它在各個平臺下的路徑是不同的,不過可以用Application.streamingAssetsPath

它會根據(jù)當(dāng)前的平臺選擇對應(yīng)的路徑。

有些游戲為了讓所有的資源全部使用assetbundle,會把一些初始的assetbundle放在StreamingAssets目錄下,運行程序的時候在把這些assetbundle拷貝在Application.persistentDataPath目錄下,如果這些assetbundle有更新的話,那么下載到新的assetbundle在把Application.persistentDataPath目錄下原有的覆蓋掉。

因為Application.persistentDataPath目錄是應(yīng)用程序的沙盒目錄,所以打包之前是沒有這個目錄的,直到應(yīng)用程序在手機上安裝完畢才有這個目錄。

StreamingAssets目錄下的資源都是不壓縮的,所以它比較大會占空間。

http://www.xuanyusong.com/archives/3229

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Unity技術(shù)面試題 一:什么是協(xié)同程序? 答:在主線程運行時同時開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。換句話...
    沐冉閱讀 3,028評論 1 19
  • [Unity]技術(shù)學(xué)習(xí)路線圖(長期更新) Unity技術(shù)面試題 一:什么是協(xié)同程序?答:在主線程運行時同時開啟另一...
    肖浩唄閱讀 23,863評論 15 244
  • 一:什么是協(xié)同程序? 答:在主線程運行時同時開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。換句話說,開啟協(xié)程就是開啟一...
    好怕怕閱讀 4,038評論 2 23
  • 這個是我剛剛整理出的Unity面試題,為了幫助大家面試,同時幫助大家更好地復(fù)習(xí)Unity知識點,如果大家發(fā)現(xiàn)有什么...
    編程小火雞閱讀 3,999評論 2 34
  • 今天看簡書,說到看英文原著的若干好處,自是有些許共鳴的,雖說完完整整地讀完沒幾本,從中學(xué)到現(xiàn)在,也大多只是在英語課...
    JasonStar1閱讀 296評論 0 2

友情鏈接更多精彩內(nèi)容