1. 程式人生 > >關於Unity3D的一些筆試題(3)

關於Unity3D的一些筆試題(3)

攝像機
1.移動攝像機的動作放在哪個系統函式中,為什麼放在這個函式中?

LateUpdate,在每幀執行完畢呼叫,它是在所有Update結束後才調,比較適合用於命令指令碼的執行。官網上例子是攝像機的跟隨,都是在所有Update操作完才跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現。

2.一個場景放置多個camera並同時處於活動狀態,會發生什麼

答:遊戲介面可以看到很多攝像機的混合。可以用depth(深度),Layer(層)+ Culling Mask,enable = false/true來控制


射線
射線是一個點向另外一個點發生的一條線,一旦與其他模型發生碰撞,他將停止發射。
注意這條件是邏輯上的,介面上看不到。
一般使用射線判斷是否發射至某個遊戲物件上或者獲得滑鼠點選的遊戲物件等。
1:Raycast碰撞的物體。
1:RaycastAll碰撞的所有物體。


動畫
1.請描述遊戲動畫有哪幾種,以及其原理?
主要有關節動畫、骨骼動畫、單一網格模型動畫(關鍵幀動畫)。
a.關節動畫:把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連線成一 個整體的動畫,角色比較靈活,Quake2中使用這種動畫;
b.骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,有關節相連,可做相對運動,面板作為單一網格蒙在骨骼之外,決定角色的外觀;
c.單一網格模型動畫由一個 完整的網格模型構成,在動畫序列的關鍵幀裡記錄各個頂點的原位置及其改變數,然後插值運算實現動畫效果,角色動畫較真實。


2.動畫層(Animation Layers)的作用是什麼?
動畫層作為一個具有層級動畫編輯概念的工具,可以用來製作和處理任何型別的動畫


3.寫出Animation的五個方法
AddClip 新增剪輯、Blend 混合、Play 播放、Stop 停止、Sample 取樣


碰撞

1.Unity3d中的碰撞器和觸發器的區別?

碰撞器有碰撞的效果,IsTrigger=false,可以呼叫OnCollisionEnter\/Stay\/Exit函式;
觸發器沒有碰撞效果,IsTrigger=true,可以呼叫OnTriggerEnter\/Stay\/Exit函式。


2.碰撞檢測需要物體具備什麼屬性?

能檢測碰撞發生的方式有兩種,一種是利用碰撞器,另一種則是利用觸發器
【Physics.Overlapsphere相交球檢測碰撞,碰撞檢測需要包圍盒】


3.在物體發生碰撞的整個過程中,有幾個階段,分別列出對應的函式

三個階段 1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionExit

什麼是協同程式?
在主執行緒執行時同時開啟另一段邏輯處理,來協助當前程式的執行。
換句話說,開啟協程就是開啟一個執行緒。可以用來控制運動、序列以及物件的行為。


1.UGUI的三種渲染模式,以及他們的作用?

(1)Screen Space-Overlay(螢幕控制元件-覆蓋模式)的畫布會填滿整個螢幕空間,並將畫布下面的所有的UI元素置於螢幕的最上層,或者說畫布的畫面永遠“覆蓋”其他普通的3D畫面,如果螢幕尺寸被改變,畫布將自動改變尺寸來匹配螢幕

(2)Screen Space-Camera(螢幕空間-攝影機模式)和Screen Space-Overlay模式類似,畫布也是填滿整個螢幕空間,如果螢幕尺寸改變,畫布也會自動改變尺寸來匹配螢幕。所不同的是,在該模式下,畫布會被放置到攝影機前方。在這種渲染模式下,畫布看起來 繪製在一個與攝影機固定距離的平面上。所有的UI元素都由該攝影機渲染,因此攝影機的設定會影響到UI畫面。在此模式下,UI元素是由perspective也就是視角設定的,視角廣度由Filed of View設定。

(3)World Space即世界控制元件模式。在此模式下,畫布被視為與場景中其他普通遊戲物件性質相同的類似於一張面片(Plane)的遊戲物體。畫布的尺寸可以通過RectTransform設定,所有的UI元素可能位於普通3D物體的前面或者後面顯示。當UI為場景的一部分時,可以使用這個模式。  它有一個單獨的引數Event Camera,用來指定接受事件的攝像機,可以通過畫布上的aphicRaycaster元件發射射線產生事件。


2.ref引數和out引數是什麼,分別有什麼作用?

ref是傳遞引數的地址,out是返回值,兩者有一定的相同之處,不過也有不同點。
使用ref前必須對變數賦值,out不用。
out的函式會清空變數,即使變數已經賦值也不行,退出函式時所有out引用的變數都要賦值,ref引用的可以修改,也可以不修改。 


3.transform.localposition和transform.position有什麼區別?

transform.localposition是自身座標 ,transform.position是世界座標
TransformPoint
function TransformPoint (position : Vector3) : Vector3
function TransformPoint (x : float, y : float, z : float) : Vector3

把一個點從自身相對座標轉換到世界座標

4.GameObject.Find和Trandform.Find有什麼區別 ?

GameObject.Find通過名字或路徑查詢遊戲物件。
(1).無法查詢隱藏物件 
隱藏物件包括查詢路徑的任何一個父節點隱藏(active=false)
(2).如果查詢不在最上層,建議合理使用路徑查詢,路徑查詢是把雙刃劍
優點1:解決查詢中可能出現的重名問題。 
優點2:如果有完全的路徑,減少查詢範圍,減少查詢時間。
缺點: 路徑或結構調整後,容易影響到程式中的查詢,需要重新定位查詢路徑。
(3).如果路徑查詢中的任何一個父節點active=false,這個物件都將查詢不到。
(4).使用方便但效率低下 
此查詢相當於遞迴遍歷查詢,雖使用方便但效率堪憂,建議在Start()函式中查詢物件並儲存引用,切忌在Update()中動態查詢。
Transform.Find
(1).可以查詢隱藏物件 
(2).支援路徑查詢 
(3).查詢隱藏物件的前提是transform所在的根節點必須可見,即active=true


5.值型別和引用型別的區別?

(1).值型別的資料儲存在記憶體的棧中;引用型別的資料儲存在記憶體的堆中,
    而記憶體單元中只存放堆中物件的地址。
(2).值型別存取速度快,引用型別存取速度慢。
(3).值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用
(4).值型別繼承自System.ValueType,引用型別繼承自System.Object
(5).棧的記憶體分配是自動釋放;而堆在.NET中會有GC來釋放       
(6).值型別的變數直接存放實際的資料,而引用型別的變數存放的則是資料的地址,即物件的引用。
(7).值型別變數直接把變數的值儲存在堆疊中,引用型別的變數把實際資料的地址儲存在堆疊中,而實際
資料則儲存在堆中。注意,堆和堆疊是兩個不同的概念,在記憶體中的儲存位置也不相同,堆一般用於儲存
可變長度的資料,如字串型別;而堆疊則用於儲存固定長度的資料,如整型型別的資料int(每個int變數
佔用四個位元組)。由資料儲存的位置可以得知,當把一個值變數賦給另一個值變數時,會在堆疊中儲存兩
個完全相同的值;而把一個引用變數賦給另一個引用變數,則會在堆疊中儲存對同一個堆位置的兩個引用
,即在堆疊中儲存的是同一個堆的地址。在進行資料操作時,對於值型別,由於每個變數都有自己的值,
因此對一個變數的操作不會影響到其它變數;對於引用型別的變數,對一個變數的資料進行操作就是對這
個變數在堆中的資料進行操作,如果兩個引用型別的變數引用同一個物件,實際含義就是它們在堆疊中保
存的堆的地址相同,因此對一個變數的操作就會影響到引用同一個物件的另一個變數。


6.C#String型別比StringBuilder型別的優勢是什麼?

如果是處理字串的話,用string中的方法每次都需要建立一個新的字串物件並且分配新的記憶體地址,而stringBuilder是在原來的記憶體裡對字串進行修改,所以在字串處理方面還是建議用stringBuilder這樣比較節約記憶體。但是string 類的方法和功能仍然還是比stringBuilder類要強。


7.燈光有那四種類型列舉出來?

Point Lights 點光源丶Spot Lights 聚光燈丶Directional Lights 方向光源 丶 ambient light 環境光丶 Area Light,俗稱面燈
U3D中有四種類型的燈光:PointLight,Spotlight,DirectionalLight,AreaLight,AmbientLight。其中,AmbientLight不是獨立的燈光元素,而是位於渲染設定中,可對場景中的背光進行色彩調節(通常是冷色系),用於模擬環境反射光(多為天光)。方向光常用於模擬陽光,燈光的所在位置不影響照明效果,因為它是基於朝向的。


8.裝箱和拆箱的概念以及過程?

裝箱就是值型別到引用型別的轉化過程。首先會在託管堆上為新的引用型別變數分配記憶體空間,然後將值型別變數拷貝到託管堆上新分配的物件記憶體中,最後返回新分配的物件記憶體地址。
裝箱操作是可逆的,所以還有拆箱操作。拆箱操作獲取指向物件中包含值型別部分的指標,然後由程式設計師手動將其對應的值拷貝給值型別變數。


9.UGUI和NGUI分別是怎樣控制深度的?

NGUI的深度就是一個指定的數值,數值越大越靠前

UGUI控制顯示順序的深度不是值,而是位置。只要通過管理UI控制元件的位置,就可以很好的管理UI的顯示順序。


10.如何定義和使用一個協同程式,以及對協同程式的理解?