Unity面試題部分高頻題目整理匯集
來(lái)源:
奇酷教育 發(fā)表于:
大的游戲公司很看重個(gè)人基礎(chǔ)、綜合能力;小公司看你實(shí)際工作能力,看你的Demo。
數(shù)據(jù)結(jié)構(gòu)和算法很重要,圖形學(xué)也很重要!
大的游戲公司很看重個(gè)人基礎(chǔ)、綜合能力;
小公司看你實(shí)際工作能力,看你的Demo。
1. 請(qǐng)簡(jiǎn)述值類型與引用類型的區(qū)別
答:區(qū)別:
1)值類型存儲(chǔ)在內(nèi)存棧中,引用類型數(shù)據(jù)存儲(chǔ)在內(nèi)存堆中,而內(nèi)存單元中存放的是堆中存放的地址。
2)值類型存取快,引用類型存取慢。
3)值類型表示實(shí)際數(shù)據(jù),引用類型表示指向存儲(chǔ)在內(nèi)存堆中的數(shù)據(jù)的指針和引用。
4)棧的內(nèi)存是自動(dòng)釋放的,堆內(nèi)存是.NET中會(huì)由GC來(lái)自動(dòng)釋放。
5)值類型繼承自System.ValueType,引用類型繼承自System.Object。
可參考
2.C#中所有引用類型的基類是什么
答:引用類型的基類是System.Object 值類型的基類是
同時(shí),值類型也隱式繼承自
3.請(qǐng)簡(jiǎn)述ArrayList和List的主要區(qū)別
答:ArrayList存在不安全類型‘(ArrayList會(huì)把所有插入其中的數(shù)據(jù)都當(dāng)做Object來(lái)處理
裝箱拆箱的操作(費(fèi)時(shí)
List是接口,ArrayList是一個(gè)實(shí)現(xiàn)了該接口的類,可以被實(shí)例化。
4.請(qǐng)簡(jiǎn)述GC(垃圾回收)產(chǎn)生的原因,并描述如何避免?
答:GC回收堆上的內(nèi)存
避免:1)減少new產(chǎn)生對(duì)象的次數(shù)
2)使用公用的對(duì)象(靜態(tài)成員
3)將String換為
5.請(qǐng)描述Interface與抽象類之間的不同
答:抽象類表示該類中可能已經(jīng)有一些方法的具體定義,但接口就是公公只能定義各個(gè)方法的界面 ,不能具體的實(shí)現(xiàn)代碼在成員方法中。
類是子類用來(lái)繼承的,當(dāng)父類已經(jīng)有實(shí)際功能的方法時(shí)該方法在子類中可以不必實(shí)現(xiàn),直接引用父類的方法,子類也可以重寫該父類的方法。
實(shí)現(xiàn)接口的時(shí)候必須要實(shí)現(xiàn)接口中所有的方法,不能遺漏任何一個(gè)。
參考
6.下列代碼在運(yùn)行中會(huì)產(chǎn)生幾個(gè)臨時(shí)對(duì)象?
string a = new string("abc");
答:其實(shí)在C#中第一行是會(huì)出錯(cuò)的(Java中倒是可行)。應(yīng)該這樣初始化:
7.下列代碼在運(yùn)行中會(huì)發(fā)生什么問(wèn)題?如何避免?
答:會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,因?yàn)閒oreach是只讀的。不能一邊遍歷一邊修改。
8.請(qǐng)簡(jiǎn)述關(guān)鍵字Sealed用在類聲明和函數(shù)聲明時(shí)的作用
答:類聲明時(shí)可防止其他類繼承此類,在方法中聲明則可防止派生類重寫此方法。
9.請(qǐng)簡(jiǎn)述private,public,protected,internal的區(qū)別
答:
public:對(duì)任何類和成員都公開(kāi),無(wú)限制訪問(wèn)
private:僅對(duì)該類公開(kāi)
protected:對(duì)該類和其派生類公開(kāi)
internal:只能在包含該類的程序集中訪問(wèn)該類
protected internal:
10.反射的實(shí)現(xiàn)原理?
答:審查元數(shù)據(jù)并收集關(guān)于它的類型信息的能力。
參考
反射個(gè)人認(rèn)為,就是得到程序集中的屬性和方法。
實(shí)現(xiàn)步驟:
1)導(dǎo)入
2)Assembly.Load("程序集")加載程序集,返回類型是一個(gè)
得到程序集中所有類的名稱
4)Type type = assembly.GetType("程序集.類名");獲取當(dāng)前類的類型
5)Activator.CreateInstance(type); 創(chuàng)建此類型實(shí)例
6)MethodInfo mInfo = type.GetMethod("方法名");獲取當(dāng)前方法
7)mInfo.Invoke(null,方法參數(shù)
11. .Net與Mono的關(guān)系?
答:Mono官網(wǎng)主頁(yè)
mono是.net的一個(gè)開(kāi)源跨平臺(tái)工具,就類似java虛擬機(jī),java本身不是跨平臺(tái)語(yǔ)言,但運(yùn)行在虛擬機(jī)上就能夠?qū)崿F(xiàn)了跨平臺(tái)。.net只能在windows下運(yùn)行,mono可以實(shí)現(xiàn)跨平臺(tái)跑,
可以運(yùn)行于linux,Unix,Mac OS等。
12.簡(jiǎn)述unity3d支持的作為腳本的語(yǔ)言的名稱
答:
Unity的腳本語(yǔ)言基于Mono的.Net平臺(tái)上運(yùn)行,可以使用.NET庫(kù),這也為XML、數(shù)據(jù)庫(kù)、正則表達(dá)式等問(wèn)題提供了很好的解決方案。
Unity里的腳本都會(huì)經(jīng)過(guò)編譯,他們的運(yùn)行速度也很快。這三種語(yǔ)言實(shí)際上的功能和運(yùn)行速度是一樣的,區(qū)別主要體現(xiàn)在語(yǔ)言特性上。
JavaScript:和網(wǎng)頁(yè)中常用的JavaScript不一樣,它編譯后的運(yùn)行速度很快,語(yǔ)法方面也會(huì)有不少區(qū)別。
Boo:可以看做是Python語(yǔ)言的變種,又糅合了Ruby和C#的特性,它是靜態(tài)類型語(yǔ)言
13.Unity3D是否支持寫成多線程程序?如果支持的話需要注意什么?
答:參考
僅能從主線程中訪問(wèn)Unity3D的組件,對(duì)象和Unity3D系統(tǒng)調(diào)用
支持:如果同時(shí)你要處理很多事情或者與Unity的對(duì)象互動(dòng)小可以用thread,否則使用coroutine。
注意:C#中有l(wèi)ock這個(gè)關(guān)鍵字,以確保只有一個(gè)線程可以在特定時(shí)間內(nèi)訪問(wèn)特定的對(duì)象
14.Unity3D的協(xié)程和C#線程之間的區(qū)別是什么?
答:
多線程程序同時(shí)運(yùn)行多個(gè)線程 ,而在任一指定時(shí)刻只有一個(gè)協(xié)程在運(yùn)行,并且這個(gè)正在運(yùn)行的協(xié)同程序只在必要時(shí)才被掛起。
除主線程之外的線程無(wú)法訪問(wèn)Unity3D的對(duì)象、組件、方法。
Unity3d沒(méi)有多線程的概念,不過(guò)unity也給我們提供了StartCoroutine(協(xié)同程序)和LoadLevelAsync(異步加載關(guān)卡)后臺(tái)加載場(chǎng)景的方法。 StartCoroutine為什么叫協(xié)同程序呢,所謂協(xié)同,就是當(dāng)你在StartCoroutine的函數(shù)體里處理一段代碼時(shí),利用yield語(yǔ)句等待執(zhí)行結(jié)果,這期間不影響主程序的繼續(xù)執(zhí)行,可以協(xié)同工作。而LoadLevelAsync則允許你在后臺(tái)加載新資源和場(chǎng)景,所以再利用協(xié)同,你就可以前臺(tái)用loading條或動(dòng)畫提示玩家游戲未卡死,同時(shí)后臺(tái)協(xié)同處理加載的事宜asynchronous[e ?? s ?? kr ? n ? s] .synchronous同步。
15.U3D中用于記錄節(jié)點(diǎn)空間幾何信息的組件名稱,及其父類名稱
答:Transform 父類是
16.簡(jiǎn)述四元數(shù)的作用,四元數(shù)對(duì)歐拉角的優(yōu)點(diǎn)?
答:四元數(shù)用于表示旋轉(zhuǎn)
相對(duì)歐拉角的優(yōu)點(diǎn):
1)能進(jìn)行增量旋轉(zhuǎn)
2)避免萬(wàn)向鎖
3)給定方位的表達(dá)方式有兩種,互為負(fù)(歐拉角有無(wú)數(shù)種表達(dá)方式
17.向量的點(diǎn)乘、叉乘以及歸一化的意義?
1)點(diǎn)乘描述了兩個(gè)向量的相似程度,結(jié)果越大兩向量越相似,還可表示投影
2)叉乘得到的向量垂直于原來(lái)的兩個(gè)向量
3)標(biāo)準(zhǔn)化向量:用在只關(guān)系方向,不關(guān)心大小的時(shí)候
18.矩陣相乘的意義及注意點(diǎn)
用于表示線性變換:旋轉(zhuǎn)、縮放、投影、平移、仿射
注意矩陣的蠕變:誤差的積累
19.為何大家都在移動(dòng)設(shè)備上尋求U3D原生GUI的替代方案
不美觀,OnGUI很耗費(fèi)時(shí)間,使用不方便
20.請(qǐng)簡(jiǎn)述如何在不同分辨率下保持UI的一致性
NGUI很好的解決了這一點(diǎn),屏幕分辨率的自適應(yīng)性,原理就是計(jì)算出屏幕的寬高比跟原來(lái)的預(yù)設(shè)的屏幕分辨率求出一個(gè)對(duì)比值,然后修改攝像機(jī)的size。
原生GUI http://unity3d.9ria.com/?
21.為什么dynamic font在unicode環(huán)境下優(yōu)于
Unicode是國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案。
使用動(dòng)態(tài)字體時(shí),Unity將不會(huì)預(yù)先生成一個(gè)與所有字體的字符紋理。當(dāng)需要支持亞洲語(yǔ)言或者較大的字體的時(shí)候,若使用正常紋理,則字體的紋理將非常大。
22.Render的作用?描述MeshRender和SkinnedMeshRender的關(guān)系與不同
A renderer is what makes an object appear on the screen。
23.簡(jiǎn)述SkinnedMesh的實(shí)現(xiàn)原理
24.在場(chǎng)景中放置多個(gè)Camera并同時(shí)處于活動(dòng)狀態(tài)會(huì)發(fā)生什么?
答:游戲界面可以看到很多攝像機(jī)的混合
25.Prefab的作用?如何在移動(dòng)環(huán)境的設(shè)備下恰當(dāng)?shù)厥褂盟?/div>
答:Prefab在實(shí)例化的時(shí)候用到,主要用于經(jīng)常會(huì)用到的物體,屬性方便修改
26.如何銷毀一個(gè)UnityEngine.Object及其子類
答:
27.為什么Unity3D中會(huì)發(fā)生在組件上出現(xiàn)數(shù)據(jù)丟失的情況?
答:組件上綁定的對(duì)象被刪除了
28.如何安全的在不同工程間安全地遷移asset數(shù)據(jù)?三種方法
答:
將Assets目錄和Library目錄一起遷移
導(dǎo)出包
用unity自帶的assets Server功能
29.MeshCollider和其他Collider的一個(gè)主要不同點(diǎn)?
答:Convex?
30.當(dāng)一個(gè)細(xì)小的高速物體撞向另一個(gè)較大的物體時(shí),會(huì)出現(xiàn)什么情況?如何避免?
穿透(碰撞檢測(cè)失敗
31.OnEnable、Awake、Start運(yùn)行時(shí)的發(fā)生順序?哪些可能在同一個(gè)對(duì)象周期中反復(fù)的發(fā)生?
答:Awake -》OnEnable-》
OnEnable在同一周期中可以反復(fù)地發(fā)生
32.請(qǐng)簡(jiǎn)述OnBecameVisible及OnBecameInvisible的發(fā)生時(shí)機(jī),以及這一對(duì)回調(diào)函數(shù)的意義?
答:當(dāng)物體是否可見(jiàn)切換之時(shí)??梢杂糜谥恍枰谖矬w可見(jiàn)時(shí)才進(jìn)行的計(jì)算。
33.Unity3D如何獲知場(chǎng)景中需要加載的數(shù)據(jù)?
題目是獲取的意思?
34.MeshRender中material和sharedmaterial的區(qū)別?
修改sharedMaterial將改變所有物體使用這個(gè)材質(zhì)的外觀,并且也改變儲(chǔ)存在工程里的材質(zhì)設(shè)置。
不推薦修改由sharedMaterial返回的材質(zhì)。如果你想修改渲染器的材質(zhì),使用material替代。