1. 程式人生 > >自己總結unity的一些面試題

自己總結unity的一些面試題

1.GameObject和transform.Find的區別。

GameObject通過名字或者路徑來查詢遊戲物件:GameObject.Find("a")

(1)無法查詢隱藏物件。在查詢路徑上任意一個父物體隱藏都查不到

(2)如果查詢不在最上層,就需要根據路徑查詢,但路徑查詢是把雙刃劍

優點1:解決查詢中可能出現的重名問題

優點2:如果有完全的路徑,減少查詢範圍,減少查詢時間

缺點:結構或路徑調整後,容易影響到物體的查詢,需要重新定位查詢路徑

(3)使用方便但效率低下。

此查詢相當於遞迴遍歷查詢,雖然操作方便,但效率低下,建議在start中查詢物件並儲存引用,切忌在update中動態查詢。

transform.Find

(1)可以查詢隱藏物件

(2)支援路徑查詢

(3)查詢隱藏物件的前提是transform所在的根節點必須可見,即active=true

**其他查詢:

GameObject.FindWithTag

GameObject.FindGameObjectsWithTag

**隱藏根節點也可查詢:使用Resouces.FindObjectsOfTypeAll

2.物體自身旋轉使用的函式是Transform.Rotate;圍繞一個物體旋轉使用的函式是Transform.RotateAround

3.unity中使用LitJSON,將物件轉化成字串使用JsonMapper.ToJson();將字串轉換成物件使用JsonMapper.ToObject()

4.簡述一下什麼是GC,GC的流程

GC:垃圾回收器

流程:標記,計劃和清理,引用更新和壓縮

5.unity3d從喚醒到銷燬有一段生命流程,請列出系統呼叫的幾個重要方法

Awake->OnEnable->Start->Update->FixUpdate->LateUpdate->OnGUI->Reset->OnDisable->OnDestroy

6.請簡述值型別和引用型別的區別

值型別都是存在棧中;引用型別存放在堆中,並會把地址存放在棧中。如果為在另一個方法中呼叫值型別,並不會改變原方法中值型別的值;如果在另一個方法中呼叫引用型別的值,則會將引用型別的值改變。

值型別:byte,int,short,long,char,float,double,bool,列舉:enum,結構體:struct

引用型別:類,介面,委託,object,string

7.碰撞器和觸發器

碰撞器和觸發器都必須先引用collider元件,觸發器的方法:OnCollisionEnter,OnCollisionStay,OnCollisionExit;碰撞器:OnTriggerEnter,OnTriggerStay,OnTriggerExit

碰撞器是觸發器的載體,觸發器是碰撞器的一個元件,如過選用了isTrigger=true,則不再碰撞,如果一個是觸發器,一個是碰撞器,則會呼叫觸發器的方法OnTriggerEnter,執行觸發效果,而不碰撞

8.什麼情況下指令碼前面的對號不顯示

當指令碼中沒有如下函式時:Start,Update,FixUpdate,LateUpdate,OnGUI,OnEnable,OnDisable

9.Update,FixUpdate,LateUpdate的區別和含義

Update:更新,與當前平臺的幀數有關,每一幀被呼叫

FixUpdate:固定更新,每一幀被呼叫,是真實時間

LateUpdate:每一幀被呼叫,是在Update呼叫後呼叫

10.協同程式:即主程式執行的同時開啟另一段邏輯處理,來協同當前程式的執行

其類似執行緒,但不是;用yield return返回,yield return 0表示等待一幀,可以在協同程式中再開啟協程,巢狀;yield return new WaitForFixUpdate等待下一幀的開始。

11.再NavMeshAgent元件中表示最大加速度的是Acceleration

12.已知一個數據類,沒有繼承MonoBehavior,現在我們需要再其他指令碼中呼叫次資料類中的內容,需要新增什麼特性?       Serializable

13.再List集合中想要移出某個索引位置的元素,採用list.RemoveAt

14.射線檢測碰撞物體的原理是什麼?

射線是3D世界中一個點向另一個方向發射的一條無終點的線,在發射軌跡中與其他物體發生碰撞時,它將停止發射。

15.如何讓已存在的GameObject在場景載入之後不被解除安裝掉?

gameobject.DontDestroyOnLoad()

16.請說明transform.parent和transform.SetParent的區別

parent可以get和set;SetParent只能set

17.unity提供了4種光源,平行光Derectional Light;點光源Point Light;區域光源Area Light;聚光源Spot Light

18.物理更新放在FixUpdate中比較合適,按照固定時間執行,預設0.02S

19.獲取的命令時GetComponent,增加是AddComponent,Destroy刪除

20.請簡述AnimatorController中的Has Exit Time的作用是什麼。

當我們勾選了此項,在動畫轉換時會等待當前動畫播放完畢後才會才會轉換到下一個動畫,如果當前動畫時迴圈動畫會等待本次播放完畢轉換,所以對需要立即轉換動畫的情況下一定要取消勾選此項;

還有一種情況時,當前動畫播放完畢後會自動轉換到箭頭所指的下一條狀態(沒有其它條件時),此時必須勾選此項,否則動畫播放完畢後會卡在最後一幀,如果是迴圈動畫,則會一直迴圈播放。

21.連結串列和陣列的區別

二者都屬於同一種資料結構

從邏輯結構上來看:

1.陣列申請的是一塊連續的記憶體空間,編譯階段就確定了空間大小,是不允許改變的,不能適應資料動態的增減的情況。當資料增加時,可能會會超出原先定義的陣列個數,造成資料越界;當資料減少時,造成資源浪費。

2.連結串列動態地進行儲存分配,現用現申請,可以適應資料動態增減的情況,且可以方便地插入刪除資料項。(陣列中插入和刪除資料項時,需要移動其他的資料項,非常繁瑣)連結串列必須根據next指標找到下個元素

從記憶體儲存上來看:

1.陣列從棧中分配空間,對於程式設計師方便快速,但是自由度小,陣列可以根據下標直接儲存資料。如果陣列中需要增加一個元素,需要移動大量元素,在記憶體中空出一個元素的空間,然後將要增加的元素放入其中。同樣的道理,如果想要刪除一個元素,需要移動大量的元素去填掉被移動的元素。如果需要快速訪問資料,很少或不插入或刪除元素,應使用陣列。

2.連結串列從堆中分配空間,自由度大但是申請管理比較麻煩,連結串列是物理上非連續的記憶體空間,對於訪問資料,需要從頭遍歷整個連結串列直到找到要訪問的資料,沒有陣列有效,但是在新增和刪除資料方面,只要知道操作位置的指標,很方便實現增刪,較陣列比較靈活youxiaolv。

從上面可以看出,如果經常訪問陣列,而很少增加和刪除資料,可以用陣列;如果經常增加和刪除資料,用連結串列。

22.用sealed修飾的類有什麼特點?

無法作為其他類的父類,不能含有虛方法和抽象方法;當sealed修飾方法時,該方法不能被子類重寫。

23.MVC模式,M,V,C分別代表什麼?

MVC是model-view-controller的縮寫,模型-檢視-控制器

M是數操作資料邏輯的部分,V是顯示的應用模型資料或互動介面,C是程式的檢視和操作邏輯的協調者。

24.類和結構體的區別

1.類是引用型別,結構體是值型別。

2.結構體和類初始化都使用了new,但一個是分配在堆上,一個在棧上。

3.結構體是隱式的sealed,不能被繼承,也不能從另一個類或結構體繼承;類可以。

當處理數量小的場合使用結構體比較好;對於大量的邏輯物件,使用類比較好。