Unity部分面試問題整理(持續更新)

 

面向對象三大特性:

繼承:繼承,指可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需編寫原來的類的情況下對這些功能進行擴展。通過繼承創建的新類成爲“子類”或“派生類”,被繼承的類稱爲“基類”、“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。要實現繼承,可以通過“繼承”和組合來實現。繼承概念的實現方式有兩類:實現繼承與接口繼承。實現繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱,但是子類必須提供實現的能力。在某些OOP語言中,一個子類可以集成多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。

封裝:封裝,就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。一個類就是一個封裝了數據以及操作這些數據的代碼的邏輯實體。在一個對象內部,某些代碼或某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據進行了不同級別的保護,以防止程序中無關的部分意外地改變或錯誤地使用了對象的私有部分。

多態:多態,是指一個類實例的相同方法在不同情形下有不同表現形式。多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味着,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。

C#的值類型:

值類型有兩種:值類型和引用類型。所有值類型都是隱式地從System.ValueType類繼承而來,而System.ValueType則是從object類繼承而來。其中System.ValueType本身不是一個值類型,它是一個被所有值類型自動繼承的類類型。

每個值類型都隱式地聲明瞭一個公共無參的實例構造函數,所有每個值類型都有對應的默認值。

  1. 對於所有簡單類型,默認值的每一位都是零:
    1. sbyte,byte,short,ushort,int,uint,long和ulong的默認值都爲零。
    2. char的默認值爲’\x0000’
    3. Float的默認值爲0.0f
    4. double的默認值爲0.0d
    5. decimal的默認值爲0.0m
    6. bool的默認值爲false
  1. 枚舉類型E的默認值爲轉換到類型E的0
  2. 對於結構類型,其默認值是將所有值類型變量設置爲默認值,並把所有引用類型變量設置爲null
  3. 可空值類型的默認值是一個HasValue屬性爲false,並且Value屬性未定義的實例。通常這也稱爲可空值類型的null值。

一般C#中的值類型有:結構類型裏的簡單類型:bool(邏輯),數類型(包含整數和浮點數和decimal),整數包含:sbyte,byte,short,ushort,int,uint,long,ulong,char,浮點數包含:float,double;除了結構類型枚舉類型也是值類型。

C#的引用類型:

  1. object
  2. dynamic
  3. string
  4. 接口
  5. 數組
  6. 委託

C#裝箱拆箱:

裝箱轉換讓一個值類型可以隱式地轉換到引用類型。它們有:

  1. 從任何值類型到object類型。
  2. 從任何值類型到System.ValueType類型。
  3. 從任何非空值值類型到任何值類型實現的接口類型。
  4. 從任何可空值類型到任何可空值類型的基礎類型實現的接口類型。
  5. 從任何枚舉類型到System.Enum類型。
  6. 從任何基礎類型爲枚舉類型的可空值類型到System.Enum類型。

拆箱轉換即把上文裝箱轉換倒過來。

 

簡述對象池,並說明對象池的作用:

對象池是存放需要反覆調用資源的遊戲對象的空間,當一個對象被大量地生成並很快地銷燬時會很費時間並且會造成性能的損耗,於是這時候就可以使用對象池把不用的對象保存起來,當下次要生成的時候在池裏查找是否有可用的對象,如果有的話直接取出,如果沒有的話則重新創建,是一種典型的空間換時間的一種提高性能的方法。

 

如何在Unity的不同工程之間遷移數據:

  1. 將Asset目錄和Library目錄 一起遷移。
  2. 導出包,即export Package
  3. 用Unity自帶的assets Server功能。

其中Library文件夾的作用:

 

Unity腳本的生命週期:

Awake->OnEnable->Start->Update->FixedUpdate->LateUpdate->OnGUI->OnDisable->OnDestroy

 

Unity中LOD是什麼,它的優缺點是:

LOD(Level Of Detail)多層次細節,

 

在遊戲開發裏使用腳本語言的目的:

  雖然腳本語言相對C++等語言來說較慢並且需要佔據更大的內存的,但其開發起來很快並且對設計師很友好,於是我們在遊戲開發的過程中可以通過腳本語言來開發可以讓設計師直接修改的內容,讓設計師不用經過程序員就可以直接修改內容,而且一些經常需

要迭代的又不需要太強調性能的功能就可以使用腳本語言來進行開發。

 

 

 

String與StringBuilder的區別:

 

String是不可變對象,我們不能修改String的值,在對String進行連接等操作時,修改的是String指向的內存地址,若有多個值相同的String類型值,代表着都指向同一個內存地址。

StringBuidler是可變對象,可以在字符串連接的時候在對原來的字符串進行修改,但StringBuilder對象創建代價較大,所以若字符串的連接次數較少,還是使用String,這樣可節省一些性能,只有有大量的或不可預知次數的字符串連接操作時才使用StringBuilder,但在連接操作小於等於100次的時候,兩者幾乎看不出性能差異。

 

 

AssetBundle加載方式: 

  1.  從本地加載
  2. 從內存加載
  3.  下載後放在緩存中備用
  4. 從服務器下載

 

 

 

 

跑酷類型遊戲的實現:

 

一、地鐵跑酷類

 此類型爲直線型,玩家需要躲避路線上隨機出現的障礙物,每個障礙物都是需要可碰撞的,直接撞上那就會死,有些是可以通過跳躍等方式跳上障礙物從而避免死亡或產生更多有樂趣的玩法等。

 所以此類遊戲就有幾個關鍵點:首先是路徑生成,路徑生成可以在玩家到路徑中途的時候生成下下段路徑等,也可根據時間生成路徑等,多種多樣,其次是生成障礙物,障礙物可在路徑上的特定範圍的位置隨機生成,這個生成直接在路徑生成時就生成好即可,第三就是人物的動畫控制,這個使用Unity的Mecanim(3D動畫系統)結合有限狀態機與單例模式就可以了。

二、神廟逃亡類

  此類型爲轉彎型,玩家撞到牆壁就是個死,同樣是需要路徑生成,但這個路徑生成是在路的盡頭,在左,中,右三個位置進行生成,生成後將生成的路徑(prefab)旋轉一定角度即可,其次是人物的左右控制,可以在路徑的快盡頭部分設立一個隱藏的trigger,當觸碰到這個trigger以後纔可以進行左右滑動。

 

關於這裏的路徑生成,我這裏有兩種思路,一種是到了觸發點需要生成的時候就instantiate等人物過去以後就Destroy掉,但這樣做會造成性能上的浪費。第二種是使用對象池,在一開始就根據名字將遊戲對象生成好(使用字典),到了觸發點則通知遊戲對象令其改變位置(隨機地),障礙物的生成同理。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章