標籤:

[Unity]面試題整理(一)

一:什麼是協同程序?

答:在主線程運行時同時開啟另一段邏輯處理,來協助當前程序的執行。換句話說,開啟協程就是開啟一個可以與程序並行的邏輯。可以用來控制運動、序列以及對象的行為。


二:Unity3d中的碰撞器和觸發器的區別?

答:碰撞器是觸發器的載體,而觸發器只是碰撞器身上的一個屬性。

當Is Trigger=false時,碰撞器根據物理引擎引發碰撞,產生碰撞的效果,可以調用OnCollisionEnter/Stay/Exit函數;

當Is Trigger=true時,碰撞器被物理引擎所忽略,沒有碰撞效果,可以調用OnTriggerEnter/Stay/Exit函數。

如果既要檢測到物體的接觸又不想讓碰撞檢測影響物體移動或要檢測一個物件是否經過空間中的某個區域這時就可以用到觸發器


三:物體發生碰撞的必要條件

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


四:請簡述ArrayList和List<Int>的主要區別

答:

ArrayList存在不安全類型

  • ArrayList會把所有插入其中的數據都當做Object來處理
  • 裝箱拆箱的操作

List是介面,ArrayList是一個實現了該介面的類,可以被實例化


五:請簡述GC(垃圾回收)產生的原因,並描述如何避免?

答:GC回收堆上的內存

避免:

1)減少new產生對象的次數

2)使用公用的對象(靜態成員)

3)將String換為StringBuilder


六:反射的實現原理?

答:審查元數據並收集關於它的類型信息的能力。

實現步驟:

  • 導入using System.Reflection;
  • Assembly.Load("程序集");//載入程序集,返回類型是一個Assembly
  • 得到程序集中所有類的名稱foreach (Type type in assembly.GetTypes())

    {

    string t = type.Name;

    }

  • Type type = assembly.GetType("程序集.類名");//獲取當前類的類型
  • Activator.CreateInstance(type); //創建此類型實例
  • MethodInfo mInfo = type.GetMethod("方法名");//獲取當前方法
  • mInfo.Invoke(null,方法參數);

七:簡述四元數Quaternion的作用,四元數對歐拉角的優點?

答:四元數用於表示旋轉

相對歐拉角的優點:

  • 能進行增量旋轉
  • 避免萬向鎖
  • 給定方位的表達方式有兩種,互為負(歐拉角有無數種表達方式)

八:如何安全的在不同工程間安全地遷移asset數據?三種方法

答:

1.將Assets和Library一起遷移

2.導出包package

3.用unity自帶的assets Server功能


九:OnEnable、Awake、Start運行時的發生順序?哪些可能在同一個對象周期中反覆的發生?

答:Awake–>OnEnable->Start OnEnable在同一周期中可以反覆地發生!


十:MeshRender中material和sharedmaterial的區別?

答:

修改sharedMaterial將改變所有物體使用這個材質的外觀,並且也改變儲存在工程里的材質設置。

不推薦修改由sharedMaterial返回的材質。如果你想修改渲染器的材質,使用material替代。


十一:請簡述ArrayList和List之間的主要區別。


十二:TCP/IP協議棧各個層次及分別的功能

答:網路介面層:這是協議棧的最低層,對應OSI的物理層和數據鏈路層,主要完成數據幀的實際發送和接收。

網路層:處理分組在網路中的活動,例如路由選擇和轉發等,這一層主要包括IP協議、ARP、ICMP協議等。

傳輸層:主要功能是提供應用程序之間的通信,這一層主要是TCP/UDP協議。

應用層:用來處理特定的應用,針對不同的應用提供了不同的協議,例如進行文件傳輸時用到的FTP協議,發送email用到的SMTP等。


十三題:Unity提供了幾種光源,分別是什麼

答:

四種。

平行光:Directional Light

點光源:Point Light

聚光燈:Spot Light

區域光源:Area Light


十四:簡述一下對象池,你覺得在FPS里哪些東西適合使用對象池?

對象池就存放需要被反覆調用資源的一個空間,比如遊戲中要常被大量複製的對象,子彈,敵人,以及任何重複出現的對象。


十五:CharacterController和Rigidbody的區別?

Rigidbody具有完全真實物理的特性,而CharacterController可以說是受限的的Rigidbody,具有一定的物理效果但不是完全真實的。


十六:移動相機動作在哪個函數里,為什麼在這個函數里?

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


十七:簡述prefab的用處

在遊戲運行時實例化,prefab相當於一個模板,對你已經有的素材、腳本、參數做一個默認的配置,以便於以後的修改,同事prefab打包的內容簡化了導出的操作,便於團隊的交流。


十八:請簡述sealed關鍵字用在類聲明時與函數聲明時的作用。

答:類聲明時可防止其他類繼承此類,在方法中聲明則可防止派生類重寫此方法。


十九:請簡述private,public,protected,internal的區別。

public:對任何類和成員都公開,無限制訪問

private:僅對該類公開

protected:對該類和其派生類公開

internal:只能在包含該類的程序集中訪問該類

protected internal:protected + internal


二十:簡述SkinnedMesh的實現原理


二十一:GPU的工作原理

簡而言之,GPU的圖形(處理)流水線完成如下的工作:(並不一定是按照如下順序)

頂點處理:這階段GPU讀取描述3D圖形外觀的頂點數據並根據頂點數據確定3D圖形的形狀及位置關係,建立起3D圖形的骨架。在支持DX8和DX9規格的GPU中,這些工作由硬體實現的Vertex Shader(定點著色器)完成。

光柵化計算:顯示器實際顯示的圖像是由像素組成的,我們需要將上面生成的圖形上的點和線通過一定的演算法轉換到相應的像素點。把一個矢量圖形轉換為一系列像素點的過程就稱為光柵化。例如,一條數學表示的斜線段,最終被轉化成階梯狀的連續像素點。

紋理帖圖:頂點單元生成的多邊形只構成了3D物體的輪廓,而紋理映射(texture mapping)工作完成對多變形表面的帖圖,通俗的說,就是將多邊形的表面貼上相應的圖片,從而生成「真實」的圖形。TMU(Texture mapping unit)即是用來完成此項工作。

像素處理:這階段(在對每個像素進行光柵化處理期間)GPU完成對像素的計算和處理,從而確定每個像素的最終屬性。在支持DX8和DX9規格的GPU中,這些工作由硬體實現的Pixel Shader(像素著色器)完成。

最終輸出:由ROP(光柵化引擎)最終完成像素的輸出,1幀渲染完畢後,被送到顯存幀緩衝區。

總結:GPU的工作通俗的來說就是完成3D圖形的生成,將圖形映射到相應的像素點上,對每個像素進行計算確定最終顏色並完成輸出。


二十二:什麼是渲染管道?

答:是指在顯示器上為了顯示出圖像而經過的一系列必要操作。 渲染管道中的很多步驟,都要將幾何物體從一個坐標系中變換到另一個坐標系中去。

主要步驟有:

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


二十三:如何優化內存?

答:有很多種方式,例如

1.壓縮自帶類庫;

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

3.釋放AssetBundle佔用的資源;

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

5.使用光照貼圖,使用多層次細節(LOD),使用著色器(Shader),使用預設(Prefab)。


二十四:動態載入資源的方式?

1.Resources.Load();

2.AssetBundle Unity5.1版本後可以選擇使用Git: github.com/applexiaohao


二十五:你用過哪些插件?

二十六: 使用Unity3d實現2d遊戲,有幾種方式?

答:

1.使用本身的GUI、UGUI

2.把攝像機的Projection(投影)值調為Orthographic(正交投影),不考慮z軸;

3.使用2d插件,如:2DToolKit、NGUI


二十七:在物體發生碰撞的整個過程中,有幾個階段,分別列出對應的函數 三個階段

答:

  • OnCollisionEnter
  • OnCollisionStay
  • OnCollisionExit

二十八:Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來

答:

  • rigidbody.AddForce
  • rigidbody.AddForceAtPosition

二十九:什麼叫做鏈條關節?

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


三十:物體自身旋轉使用的函數?

答: Transform.Rotate()

三十一:Unity3d提供了一個用於保存和讀取數據的類(PlayerPrefs),請列出保存和讀取整形數據的函數

答:

  • PlayerPrefs.SetInt()
  • PlayerPrefs.GetInt()

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

答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy


三十三:物理更新一般放在哪個系統函數里?

答:

FixedUpdate,每固定幀繪製時執行一次,和Update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate調用次數就會跟著下降。

  • FixedUpdate比較適用於物理引擎的計算,因為是跟每幀渲染有關。
  • Update就比較適合做控制。

三十四:在場景中放置多個Camera並同時處於活動狀態會發生什麼?

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


三十五:如何銷毀一個UnityEngine.Object及其子類?

答: 使用Destroy()方法;


推薦閱讀:

針對中小遊戲的Unity3D插件推薦
遊戲性能優化(1)-why & benchmark
星游視野:如果你接手了一款糟糕的遊戲……
關於語言選擇 - Golang

TAG:遊戲開發 |