Unity常見面試題(二)


111.

[動畫系統]如何將其他類型的動畫轉換成關鍵幀動畫?

動畫->點緩存->關鍵幀

112.

[動畫]Unity引擎Mecanim動畫系統功能優點?

答:

l? 簡單化對類人角色動畫設計與功能實現的工作流程。

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

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

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

l? 人形動畫骨骼動畫可重復使用。

113.

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

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

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

注:

114.

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

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

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

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

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

注:

115.

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

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

MeshCollider有Mesh屬性

116.

[碰撞]Unity3d中的碰撞器和觸發器的區別?

答:

碰撞器物體不能互相進入到對方內部,觸發器可以。

觸發器角色控制器可以使用,碰撞器中不能使用。

觸發器沒有物理屬性了,碰撞器可以有力存在。

碰撞器調用OnCollisionEnter/Stay/Exit函數,觸發器調用OnTriggerEnter/Stay/Exit函數。

117.

[碰撞]物體發生碰撞的必要條件。

答:兩個物體都必須帶有碰撞器(Collider),其中一個物體還必須帶有Rigidbody剛體。

注:動的物體,你希望發生碰撞效果的物體要帶能接受物理引擎的操作,最常見的就是掛載Rigidbody組件。

118.

[碰撞]CharacterController和Rigidbody的區別?

答:CharacterController自帶膠囊碰撞器,里面包含有剛體的屬性;

Rigidbody就是剛體,使物體帶有剛體的特征。

注:

119.

[碰撞]當一個細小的高速物體撞向另一個較大的物體時,會出現什么情況?如何避免?

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

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

Detection修改為Continuous

Dynamic

注:

120.

[碰撞]在unity3d中物體發生碰撞的整個過程中,有幾個階段,分別列出對應的階段函數?

答:

主要是三個階段:

1.Collider.OnCollisionEnter 進入碰撞,當collider/rigidbody開始觸動另一個rigidbody/collider時OnCollisionEnter被調用。

2.Collider.OnCollisionStay

逗留碰撞,每個collider/rigidbody觸動rigidbody/collider,將在每幀調用OnCollisionStay。通俗的說,一個碰撞器或剛體觸動另一個剛體或碰撞器,在每幀都會調用OnCollisionStay,直到它們之間離開不接觸。

3.Collider.OnCollisionExit 退出碰撞,當 collider/rigidbody停止觸動另一個

rigidbody/collider時,OnCollisionExit被調用。

121.

[動畫]一個簡單的游戲,怪物會走動\攻擊\死亡,游戲角色會走動,跳躍\攻擊\格擋\死亡,還會接受玩家從輸入端輸入的指令,NPC會走動,他們彼此之間可以互相通信.請畫出以上三種角色的UML圖示.

答:

122.

[動畫]請描述游戲動畫有哪幾種,以及其原理?

答:主要有關節動畫、單一網格模型動畫(關鍵幀動畫)、骨骼動畫。

1.關節動畫:把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連接成一個整體的動畫,角色比較靈活,Quake2中使用這種動畫。

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

3.骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,有關節相連,可做相對運動,皮膚作為單一網格蒙在骨骼之外,決定角色的外觀,皮膚網格每一個頂點都會受到骨骼的影響,從而實現完美的動畫。

123.

[動畫]反向旋轉動畫的方法是什么?

答:反轉動畫,將動畫的播放速度調到-1。

124.

[動畫]寫出Animation的五個方法。

答:AddClip?添加剪輯、Blend?混合、Play?播放、Stop?停止、Sample?采樣?、CrossFade淡入淡出切換動畫、IsPlaying是否正在播放某個動畫

125.

[動畫]動畫層(AnimationState?Layers)的作用是什么?

答:動畫層作為一個具有層級動畫編輯概念的工具,可以用來制作和處理任何類型的動畫。202,203題

126.

[動畫]Itween插件的作用是什么,Itween作用于世界坐標還是局部坐標,請列舉出3個其常用方法?

答:ITween是補間動畫的一個插件,主要作用就是給出開始、結束的值、時間,此插件實現各種動畫,晃動,旋轉,移動,褪色,上色,音量控制等等。

方法:??? 1.MoveTo??物體移動

2.ColorTo:隨著時間改變對象的顏色組

3.LookTo:隨時間旋轉物體讓其臉部朝向所提供的Vector3或Transform位置

127.

[動畫]什么是法線貼圖?、CG動畫??

答:

法線貼圖:是一種特殊的紋理,可以應用在3D表面,讓低模呈現出更明顯的凹凸效果。一

般應用在CG動畫、美術效果要求較高的單機游戲

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

128.

[線程和協程]Unity3D是否支持寫成多線程程序?如果支持的話需要注意什么?(?)

答:Unity支持多線程,如果同時要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。

注意:1.雖然支持多線程,但是僅能從主線程中訪問Unity3D的組件,對象和Unity3D系統調用,所以如果使用的話需要把組件中的數值傳到開啟的新線程中。

2.C#中有lock這個關鍵字,以確保只有一個線程可以在特定時間內訪問特定的對象

129.

[線程和協程]Unity3D的協程和C#線程之間的區別是什么?

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

130.

[線程和協程]什么是協同程序?

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

131.

[3D數學]四元數是什么?主要作用什么?對歐拉角的優點是什么?

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

作用:四元數用于表示旋轉

優點:

1)能進行增量旋轉

2)避免萬向鎖

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

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

四元數由4個數組成,旋轉矩陣需要9個數

兩個四元數之間更容易插值

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

與旋轉矩陣類似,兩個四元組相乘可表示兩次旋轉

132.

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

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

133.

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

答:正交和透視。

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

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

134.

[預制件]Prefab的作用?如何在移動環境的設備下恰當地使用它?

答:Prefab是預制件(預制物),一般當游戲中需要頻繁創建一個物體時,使用預制物可以節省內存,方便創建,方便對游戲物體進行操作,方便對屬性進行修改。

135.

[預制件]unity當需要頻繁創建一個物體對象時,怎樣減少內存?

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

136.

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

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

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

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

137.

[ Shader]MeshRender中material和shader的區別?

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

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

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

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

2.頂點和片元著色器

3.固定功能著色器

138.

[ Shader]alpha?blend工作原理

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

139.

[ Shader]光照貼圖?的優勢是什么?

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

2.可以降低游戲內存消耗

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

140.

[ Shader]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幾個過程。

141.

[ Shader] Unity3d提供了幾種光源,分別是什么?

答:4種,Directionl light ,Point Light ,Spot Light,Area Light

平行光:Directional Light

點光源:Point Light

聚光燈:Spot Light

區域光源:Area Light

142.

[Unity]物理更新一般在哪個系統函數里?

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

143.

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

答:Awake –>OnEnable->Start

OnEnable在同一周期中可以反復地發生

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

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

但Start可以作為協程,達到在同一周期調用多次的效果。不過實質上依然是調用一次。

144.

[Unity]接上題,在上題當中假設有一物體,一個腳本掛了兩次,請指出Awake的執行順序。

答:ExcutionOrder有關,不設定順序的時候初始化Start的順序不確定。

145.

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

答:

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

作用

備注

Editor

Reset

重置為默認值。

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

Initialization

Awake

OnEnable

Start

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

Start僅在Update方法第一次被調用前調用。

Physics

FixedUpdate

處理Rigidbody時,需要用FixedUpdate代替Update。例如:給剛體加一個作用力時,你必須應用作用力在FixedUpdate里的固定幀,而不是Update中的幀。(兩者幀長不同)

如果固定時間步長小于實際幀更新時間,那么每一幀物理周期將會可能發生不止一次。

yield WaitForFixedUpdate

Internal physics update

OnTriggerXXX

OnCollisionXXX

Input events

OnMouseXXX

Game logic

Update

如果一個協成之前已經yield了,但是現在由于恢復了,那么將執行剩下的部分。

yield null

yield WaitForSeconds

yield WWW

yield StartCoroutine

Internal animation update

LateUpdate

Scene rendering

OnWillRenderObject

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

OnPreCull

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

只有腳本被附加到相機上時才會調用這個函數。

OnBecameVisible

OnBecameInvisible

OnPreRender

在相機渲染場景之前被調用。

只有腳本被附加到相機并被啟用時才會調用這個函數。

OnRenderObject

OnPostRender

在相機完成場景渲染之后被調用。

只有該腳本附于相機并啟用時才會調用這個函數。OnPostRender可以是一個協同程序。

OnRenderImage

Gizmo rendering

OnDrawGizmos

只在編輯模式下調用

GUI

renderingOnGUI

在每一幀更新時調用多次

End of frame

yield WaitForEndOfFrame

Pausing

OnApplicationPause

在程序檢測到暫停時,會在幀的結尾處被調用。

Disable/enable

OnDisable

在腳本是失效時被調用,被銷毀時也會被調用。如果再啟用的話,OnEnable會再一次被調用。

Decommissioning

OnDestroy

OnApplicationQuit

146.

[Unity]物理更新一般放在哪個系統函數里?

答:FixedUpdate因為不受到計算機幀頻的影響,所以適合于做物理方面的更新。

147.

[Unity]移動攝像機的動作放在哪個系統函數中,為什么放在這個函數中?

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

148.

[Unity]請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回調函數的意義?

答:當物體是否可見切換之時??梢杂糜谥恍枰谖矬w可見時才進行的計算。

當renderer(渲染器)在任何相機上都不可見時調用:OnBecameInvisible

當renderer(渲染器)在任何相機上可見時調用:OnBecameVisible

149.

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

答:PlayerPrefs.SetInt()

PlayerPrefs.GetInt()

150.

[動畫]動畫狀態是動畫狀態機的基本構件。每種狀態包含的可能性有哪兩種?

答:單獨的動畫狀態,混合樹。

151.

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

答:

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

若權重值為1則此層動畫將與整個動畫融合

若權重值為0則此層動畫與整個動畫完全不融合

152.

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

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

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);

}

答:判斷當前播放的動畫名字若是默認層的Idle,并且沒有在進行動畫切換,則設置hit動畫參數為false。

154.

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

areaMask等于幾?

答案:9

155.

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

答:動畫事件。

156.

[動畫]Mecanim動畫系統中2DBlendTree與1DBlendTree的區別?

答:

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

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

157.

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

答:

public Camera myCamera;

myCamera.WorldToScreenPoint(hit);

158.

[Unity]Unity中的尋路系統屬于那種尋路方式?

答:網格尋路。

159.

[Unity]動態加載資源的方式?區別是什么?

答:

1.Resources.Load();

2.AssetBundle

區別:

Resources資源的加載是動態加載內部的,AssetBundle 是動態加載外部的。

Resources是動態內部調用,Resources在編輯環境下是project窗口的一個文件夾,調用里面的資源,可以用Resources類,比如Resources.Load,打包后這個文件夾是不存在的,會統一生成Assets資源。

AssetBundle 是外部調用,要用AssetBundle 首先要先把資源打包為.assetbundle文件,再動態的去加載這個文件,本地或者網絡服務器都可以。

WWW讀取文件

160.

[Unity]以下哪個函數在游戲進入新場景后會被馬上調用?

答:?????? MonoBehaviour.OnLevelWasLoaded

161.

[Unity]如何銷毀一個UnityEngine.Object及其子類

答:Destory

162.

[Unity]獲取、增加、刪除組件的命令分別是什么?

答:獲?。篏etComponent

增加:AddComponent

沒有刪除組件只有讓組件不生效:enable

163.

[Unity]Application.loadLevel命令是什么?//過時了

答:加載關卡?。

UnityEngine.SceneManagement名稱空間下

SceneManager.LoadScene//加載場景

SceneManager.LoadSceneAsync//異步加載場景

164.

[Unity]調試記錄到控制臺的命令是什么?

答:?Debug.Log();

165.

[Unity]LayerMask.NameToLayer()這個方法有什么作用?

答:層索引。射線。

166.

[Unity]localPosition與Position的使用區別?

答:

localPosition:自身位置,相對于父級物體的變換的位置,局部坐標其實就是自身的坐標。

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

167.

[Unity]物體自身旋轉使用的函數?

答:Transform.Rotate()。

168.

[Unity]現有物體A和物體B,使物體A圍繞B旋轉并保持物體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中用于記錄節點空間幾何信息的組件名稱,及其父類名稱。

答:Transform 父類是 Component

170.

[物理引擎]<憤怒的小鳥>給予初速度以后,怎么讓小鳥受到重力和空氣阻力的影響而繪制拋物線軌跡,說出具體的計算方法。

答:添加剛體使小鳥模擬受到重力和空氣阻力影響。不添加剛體的話寫受力分析。

設橫軸為方向的加速度為ax,垂直軸為ay。

小鳥的Vx,Vy

Vx=Vx+t*ax;(Vx>=0)

Vy=Vy+t*ay;

171.

[物理引擎]Material和Physic?Material區別?

答:PhysicMaterial?物理材質:主要是控制物體的摩擦,彈力等物理屬性。

Material材質:主要是控制一個物體的顏色,質感等顯示。

172.

[物理引擎]Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來。

答:rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函數中。

173.

[物理引擎]什么叫做鏈條關節?

答:Hinge Joint,可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內部相互移動而不產生作用力,但是達到固定距離后就會產生拉力。

174.

[自動尋路]什么是導航網格(?NavMesh)?

答:?Unity內一種用于實現自動尋路的網格。

175.

[

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

答: JavaScript,C#,Boo

176.

[3D數學]向量的點乘、叉乘以及歸一化的意義?

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

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

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

177.

[3D數學]矩陣相乘的意義及注意點?

答:用于表示線性變換:旋轉、縮放、投影、平移、仿射。

注意:矩陣的蠕變:誤差的積累。

178.

[Unity引擎]為什么dynamic font在unicode環境下優于static font?

答:Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。

使用動態字體時,Unity將不會預先生成一個與所有字體的字符紋理。當需要支持亞洲語言或者較大的字體的時候,若使用正常紋理,則字體的紋理將非常大。

179.

[Unity引擎]Render的作用?描述MeshRender和SkinnedMeshRender的關系與不同。

答:render是渲染器,渲染器可以使物體顯示在屏幕上。

MeshRender是網格渲染,SkinnedMeshRender是蒙皮網格渲染器

180.

[Unity引擎]簡述SkinnedMesh的實現原理。

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

181.

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

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

2)導出包。

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

182.

[

Unity引擎]Lod是什么,優缺點是什么?

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

優點:可根據距離動態的選擇渲染不同細節的模型

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

注:精簡文字描述。

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

優點:可根據距離動態的選擇渲染不同細節的模型

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

183.

[

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

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

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

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

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

184.

[

Unity]MipMap是什么,作用?

答:MipMapping:在三維計算機圖形的貼圖渲染中有常用的技術,為加快渲染進度和減少圖像鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的文件,這樣的貼圖被稱為MipMap。

185.

[

Unity]Mecanim系統中,Body?Mask的作用是?

答:指定身體的某一部分是否參與渲染

186.

[

Unity]Unity連接數據庫。

答:需要得到Mono.Data.Sqlite.dll?文件與System.Data.dll文件。

187.

[ Unity]如何優化內存?

答:1.壓縮自帶類庫;

2.將暫時不用的以后還需要使用的物體隱藏起來而不是直接Destroy掉;

3.釋放AssetBundle占用的資源;

4.降低模型的片面數,降低模型的骨骼數量,降低貼圖的大??;

5.使用光照貼圖;

6.使用多層次細節(LOD);

7.使用著色器(Shader);

8.使用預設(Prefab)等。

解析:內存開銷無外乎三大部分:1.資源內存占用;2.引擎模塊自身內存占用;3.托管堆內存占用

資源內存占用。

在一個較為復雜的大型項目中,資源的內存占用往往占據了總體內存的70%以上。因此,資源使用是否恰當直接決定了項目的內存占用情況。一般來說,一款游戲項目的資源主要可以分為以下幾種:紋理(Texture),網絡(Mesh),動畫片段(AnimationClip)、音頻片段(AudioClip)、材質(Material)、著色器(shader)、字體資源(Font)以及文本資源(TextAsset)等等。其中,紋理,網格、動畫片段和音頻片段則容易造成較大內存開銷的資源。

紋理

紋理資源可以說是幾乎所有游戲項目中占據最大內存開銷的資源。一個6萬片的場景,網格資源最大才不過10MB,但一個2048*2048的紋理,可能直接就達到16MB,因此,項目中紋理資源的使用是否恰當會及大地印象項目的內存占用。

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

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

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

色階問題

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

ETC1不支持透明通道問題

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

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

紋理尺寸

一般來說,紋理尺寸越大,占用內存越大。

Mipmap功能

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

Read&Write

一般情況下,文理資源“Read&Write”功能在Unity引擎中是默認關閉的。但是,我們仍然在項目深度優化時發現了不少項目的紋理資源會開啟該選項。對此,我們建議壓發團隊密切關注文理資源中該選項的使用,因為開啟該選項將會使文理內存增大一倍。

網格

網格資源在比較復雜的游戲中,往往占據較高的內存。對于網格資源來說,它在使用時應該注意那方面呢?

1)

Normal\Color和Tangent(切線)

在我們深度優化過的大量項目中,Mesh資源的數據經常會含有大量的Color數據,Normal數據和Tangent數據。這些數據的存在將大幅增加Mesh資源的文件體積和內存占用。其中Color數據和Normal數據主要為3DMax、Maya等建模軟件導出時設計所生成,而Tangent一般為導入引擎時生成。

更為麻煩的是,如果項目對Mesh進行DrawCallBatching操作的話,那么狠有可能進一步增加總體內存的占用。正因如此,我們在UWA測評報告中為每個Mesh展示了其Normal,Color和Tangent屬性的具體使用情況,研發團隊可以直接針對每種屬性進行排序查看,直接定位出現冗余數據的資源。一般來說這些數據主要為Shader所用,來生成較為酷炫的效果。所以,建議研發團隊針對項目中的網格資源進行詳細檢測,查看該模型的渲染Shader中是否需要這些數據進行渲染。

動畫片段

音頻片段

引擎模塊自身內存占用。

托管堆內存占用

188.

[

Unity]如何優化CPU?

答:

解析:CPU方面

就目前Unity移動游戲而言,CPU方面的性能開銷主要可歸結為兩大類:引擎模塊性能開銷和自身代碼性能開銷。其中,引擎模塊中又可細致劃分為渲染模塊、動畫模塊、物理模塊、UI模塊、粒子系統、加載模塊和GC調用等等。

通過大量的性能測評數據,我們發現渲染模塊、UI模塊加載模塊,往往占用了CPU性能開銷的Top3。

1.渲染模塊

1降低DrawCall

降低DrawCall的方法則主要是減少渲染物體的材質種類,并通過DrawCallBatching來減少其數量。Unity文檔對DrawCallBatching的原理和注意事項非常詳盡,感興趣的朋友可以直接查看Unity官方文登。

但是,需要注意的是游戲性能并非DrawCall越小越好。這是因為,決定渲染模塊心梗的除了DrawCall之外,還有用于傳輸渲染數據的總先帶寬。當我們使用DrawCallBatching將同種的材質和網絡模型拼合在儀器室,可能會造成同一時間需要傳輸的數據(Texture、VB/IB等)大大增加,以至于造成堵塞。在資源無法計時傳輸過去的情況下,GPU只能等待,從而反倒降低了游戲的運行幀率。

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

2簡化資源

簡化資源師非常行之有效的優化手段。在大量的移動游戲中,其渲染資源其實是過量的。過量的過量的網絡資源、不合規的紋理資源等等。

關于渲染模塊在CPU方面的優化方法還有很多,比如LOD、Occlusion Culling和Culling Distance等等。

2 UI模塊

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

在NGUI優化方面,UIPanel.LateUpdate為性能優化的重中之重。

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

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

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

控制同一個UIPanel中動態UI元素的數量,數量越多,所創建的Mesh越大,從而使得重構的開銷曾加。比如戰斗過程中的HUD運動協調會出現的比較多,此時,建議研發團隊將運動血條分離成不同的UIPanel,每組UIPanel下5~10個動態UI為宜。這種做法,其本質是從概率上盡可能降低單振中UIPanel的重建開銷。

3加載模塊

加載模塊同樣也是任何游戲項目中所不可缺少的組成成分。與之前兩個模塊不同的是,加載模塊的性能開銷比較集中,主要出現于場景切換處,且CPU占用峰值均較高。

這里,我們先來說說場景切換時,其性能開銷的主要體現形式。對于目前的Unity版本而言,場景切換時的主要性能開銷主要體現在兩個方面,前一場景的場景卸載和下一場景的場景加載。下面,我們就具體來說說兩個方面的性能瓶頸:

1場景卸載,對于Unity引擎而言,場景卸載一般是由引擎自動完成的,即當我們調用類似Application.LoadLevel的API時,引擎即會開始對上一場景進行處理,其性能開銷主要被以下幾部分占據。

Destroy

引擎在切換場景時會手機為表示成DontDestoryOnLoad的GameObject及其Component,然后進行Destroy。同時,代碼中的OnDestory被觸發執行,這里的性能開銷主要取決于OnDestroy回調函數中的代碼邏輯。

Resources.UnloadUnusedAssets

一般情況下,場景切換過程中,該API會被調用兩次,依次為引擎在切換場景是自動調用,另一次則為用戶手動調用(一般出現在場景加載后,用戶調用它來確保上一場景的資源被卸載干凈)。在我們測評過的大量項目中,該API的CPU開銷主要集中在500ms~3000m之間。其耗時開銷主要取決于場景中Asset和Object的數量,數量越多,則耗時越慢。

2場景加載

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

資源加載

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

Instantiate實例化

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

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

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

以上是游戲項目中性能開銷最大的三個模塊,當然,游戲類型的不同、設計的不同,其他模塊仍然會有較大的CPU占用。比如ARPG游戲中動畫系統和物理系統,音樂休閑類游戲中的音頻系統和例子系統等。

4代碼效率

邏輯代碼在一個較為復雜的游戲項目中往往占據較大的CPU開銷。這種情況在MOBA\ARPG\MMORPG等游戲類型中非常常見。

在項目優化過程中,我們經常會想知道,到底哪些函數占據了大量的CPU開銷。同時,絕大多數的項目其中性能開銷都遵循著“二八原則”,即80%的性能消耗都集中在20%的函數上。

189.

[

Unity]你用過哪些插件?

答:

插件功能

插件名稱

界面制作

NGUI

2D游戲制作

2D Toolkit

可視化編程

PlayMaker

插值插件

iTween、HOTween

路徑搜尋

SimplePath

美術及動畫制作

RageSpline、Smooth Moves

畫面增強

Bitmap2Material、Strumpy Shader Editor

攝像機管理

Security Camera

資源包

Nature Pack

造路插件

EasyRoads3D

即時遮擋剔除/LOD多細節層次

Instant Occlusion Culling

190.

[3D圖形學]什么是渲染管道?

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

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

主要有三步:應用程序階段,幾何階段

光柵階段

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

191.

[3D圖形學]什么是矢量圖??

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

192.

[3D圖形學]什么是矩陣?矩陣運算?

答:矩陣:橫軸排列的二維數據表格

矩陣運算:

加減

限制條件:行和列必須相同,對應相加相減得到結果

乘法

限制條件:要求左矩陣的行和右矩陣的列必須同,行數和左矩陣相等,列數和右矩陣相等,結果的第i行第j列,是左矩陣的第i行和右矩陣的第j列逐個相乘并把結果相加,得到結果是結果

第i行第j列。

193.

[3D圖形學]角度和弧度的轉換。

答:角度和弧度

度和弧度之間的換算? 1弧度 = 180度 /pi(約57.3)

1度=pi/180弧度(約0.017)

194.

[3D圖形學]矢量標量。

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

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

單位向量

有方向? 大小為1的向量

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

矢量滿足交換律,滿足結合律

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

矢量減法:

大小相等

方向相反

稱為逆矢量。

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

矢量的乘法:點積(內積、標量積)、叉積(外積)結果是矢量

點積方法 dot

注:這題要問什么?

195.

[

Unity]動態加載資源的方式?

答:

1.Resources

2.AssetBundle

3.WWW

196.

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

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

1使用unity的烘焙系統烘焙替代實時光源。

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

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

197.

[ Unity]如何實現游戲的暫停、加速和減速?

答:

Time.timeScale = 0;即可讓游戲暫停。

Time.timeScale =

1時,Update、LateUpdate、FixedUpdate 都按正常的時間來執行。

Time.timeScale =

2時,Update和 LateUpdate的執行速度是之前的2倍,而FixedUpdate還是按正常時間來執行

198.

[ Unity]請描述Prefab的作用,并描述如何在移動設備的環境下恰當的使用它?

答:Prefab可以理解為是一個游戲對象及其組件的集臺,作用是使游戲對象及資源能夠被重復使用。相同的對象可以通過一個預設來創建,此過程可理解為實例化,預設可以進行批量修改。

199.

[

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

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

注:

200.

[

Unity]加載關卡和異步加載關卡的方法?

答:

SceneManager.LoadScene//加載場景

SceneManager.LoadSceneAsync//異步加載場景

201.

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

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

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

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

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

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

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

202.

[

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

答:UI紋理不需要強制使用2次冪,以NGUI舉例,NGUI會制作圖集,圖集是2次冪的。

203.

[Unity引擎]unity中碰撞器(Collider)和觸發器(Trigger)的區別?

答:

碰撞器(Collider)有碰撞效果,IsTrigger=false,可以調用OnCollisionEnter/Stay/Exit函數

觸發器(Trigger)沒有碰撞效果,isTrigger=true,可以調用OnTriggerEnter/Stay/Exit函數

204.

[網絡]請簡述TCP與UDP的區別。

答:TCP是基于連接的,UDP基于無連接的

TCP對系統資源的要求多,UDP較少

UDP程序結構較簡單

TCP是面向流數據的,UDP是數據報

TCP保證數據正確性,UDP可能丟包。

TCP保證數據的順序,UDP不保證。

205.

[網絡]為什么建立連接協議是三次握手,而關閉連接卻是四次握手呢?

答:這是因為服務段的LISTEN狀態下的SOCKET當收到SYN報文的建立請求后,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文里來發送。但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你未必會馬上關閉SOCKET,也即你可能還需要發送一些數據給對方之后,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這里的ACK報文和FIN報文多數情況下都是分開發的。

206.

[網絡]為什么TIME_WAIT狀態還需要等2MSL后才能返回到CLOSED狀態?

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

207.

[Unity引擎]請簡述角色控制器中Move和SimpleMove函數的區別。

答:角色控制器中Move和SimpleMove函數都是用于實現角色游戲對象移動的函數,它們的區別在于當我們在每一幀調用SimpleMove函數時,引擎將為該角色控制器對象添加一個重力,而Move函數則不會添加重力,需要我們通過代碼去實現重力的效果。

208.

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

答:游戲引擎是指一些已經編寫好的可編輯電腦游戲系統或者一些交互式實時圖像應用程序的核心組件。這些系統為游戲設計者提供各種編寫游戲所需要的各種工具,其目的在于讓游戲設計者能容易和快速地做出游戲程序而不用由零開始。大部分都支持多種操作系統平臺,如Linux、Mac

OS、微軟Windows。游戲引擎包含以下系統:渲染引擎(即“渲染器”,含二維圖像引擎和三維圖像引擎)、物理引擎、碰撞檢測系統、音效、腳本引擎、電腦動畫、人工智能、網絡引擎以及場景管理。

209.

[Unity引擎]請簡述Unity中有哪些特殊文件夾及其作用?

1.Editor

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

和 /Editor

是一樣的,無論多少個叫Editor的文件夾都可以。Editor下面放的所有資源文件或者腳本文件都不會被打進發布包中,并且腳本也只能在編輯時使用。一般呢會把一些工具類的腳本放在這里,或者是一些編輯時用的DLL。

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

2.Editor Default

Resources

Editor Default

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

Resources

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

3.Gizmos

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

4.Plugins

如果做手機游戲開發一般 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” 必須是這種路徑,并且要帶文件的后綴名。

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

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

現在都是用腳本來自動化打包,在打包之前

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

6. StreamingAssets

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

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

它會根據當前的平臺選擇對應的路徑。

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

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容

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