Unity面試題以及算法數(shù)據(jù)結(jié)構(gòu)(2020)


1.請(qǐng)簡(jiǎn)述值類型和引用類型的區(qū)別?
?????????值類型包括:數(shù)值類型,結(jié)構(gòu)體,bool型,用戶定義的結(jié)構(gòu)體,枚舉,可空類型。
?????????引用類型包括:數(shù)組,用戶定義的類、接口、委托,object,字符串,null類型,類。
2.C#中所有引用的基類是什么?
? ? ? ? 所有引用的基類是Object,包名是System
3.請(qǐng)簡(jiǎn)述ArrayList和List<Int>它們有什么區(qū)別?
??????ArrayList 是一個(gè)數(shù)組,繼承實(shí)現(xiàn)了List基類,是比較傳統(tǒng)使用的程序數(shù)組變量,存在拆箱裝箱操作,比較耗時(shí)。
? ? ? ? ? List<int>是調(diào)用List<T>,用了C#的泛型特性
4.簡(jiǎn)述四元數(shù)的作用,四元數(shù)對(duì)歐拉角的優(yōu)點(diǎn)?
???????四元素用于表示旋轉(zhuǎn)
? ? ? ? ?1)增量旋轉(zhuǎn)
?????????2)避免萬向鎖
? ? ? ? ?3)給定方位的表達(dá)式有2種,互為正負(fù)(歐拉角有多種
5.position和LocalPosition的區(qū)別?
? ? ? ? ?1)position是根據(jù)世界原點(diǎn)為中心點(diǎn)
? ? ? ? ? 2)localPosition是根據(jù)父節(jié)點(diǎn)為中心點(diǎn),如果?沒有父節(jié)點(diǎn)。localPosition和position沒有區(qū)別
??????????3)選中一個(gè)物體左上角Global和Local切換看物體世界坐標(biāo)軸和本地坐標(biāo)軸
????????? 4)transform組件下的Position屬性是一個(gè)先對(duì)于父對(duì)象的局部坐標(biāo),當(dāng)然,如果沒有父對(duì)象,其屬性框里顯示的自然也是世界坐標(biāo)了。如果有父對(duì)象,那么在unity編輯器顯示的值是這個(gè)transform以上一級(jí)父對(duì)象為基準(zhǔn)的坐標(biāo)。
6.RebderTexture是什么,他有什么作用?
????????是一種特殊的Textrue的類型,渲染紋理(鏡頭的模糊效果,后視鏡)
7.談?wù)勀闼赖腢nity內(nèi)存優(yōu)化方法?
??????方法有很多種:
????????????????????? ?壓縮自帶類庫(kù)
? ? ? ? ? ? ? ? ? ? ? ?將暫時(shí)不用的以后還需要的物體隱藏起來而不是直接Destroy掉(對(duì)象池)
? ? ? ? ? ? ? ? ? ? ? ?釋放AssetBundle占用的資源
? ? ? ? ? ? ? ? ? ? ? ?降低模型的片面數(shù),降低模型的骨骼數(shù)量,降低貼圖的大小
???????????????????????使用光照貼圖,使用多層細(xì)節(jié)(LOD),使用著色器(shader),使用預(yù)設(shè)(Prafab)
? ? ? ? ? ? ? ? ? ? ? ?代碼中少產(chǎn)生臨時(shí)變量
8.什么是DrawCall?如何降低DrawCall?
???????在unity中,每次引擎準(zhǔn)備數(shù)據(jù)并通知GPU的過程稱為一次DrawCall
? ? ? ? ? ?DrawCall越高對(duì)顯卡消耗就越大,降低DrawCall的方法:
? ? ? ? ???Dynamic Batching
? ? ? ? ? ?static Batching? 靜態(tài)批處理
? ? ? ? ? ?高級(jí)特性Shader降低為統(tǒng)一的低級(jí)特性的Shader
????????????具體詳細(xì)內(nèi)容可以看大佬總結(jié):https://blog.csdn.net/yupu56/article/details/50177935?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
9.如何安全的在不同工程間安全的遷移Asset數(shù)據(jù)?
???????三種方法:
? ? ? ? ? ? ? ? ? ?將Assets目錄和Library目錄一起遷移
? ? ? ? ? ? ? ? ? ? 導(dǎo)出包 exprot Package
? ? ? ? ? ? ? ? ? ? ?用unity自帶的assets Server功能
10.向量的點(diǎn)乘,叉乘以及歸一化的意義是什么?
????????點(diǎn)乘描述了兩個(gè)向量的相似程度,結(jié)果越大兩個(gè)向量越相似,可表示投影
????????????叉乘得到的向量垂直于原來的兩個(gè)向量
????????????標(biāo)準(zhǔn)化向量用在關(guān)系的方向,不關(guān)心大小的時(shí)候
11.不同的手機(jī)設(shè)備尺寸分辨率都不一樣,該如何進(jìn)行適配
????????NGUI很好的解決了這一點(diǎn),屏幕分辨率的自適應(yīng),原理就是計(jì)算出屏幕的寬高比
????????????跟原來的預(yù)設(shè)的屏幕分辨率求出一個(gè)對(duì)比值,然后修改相機(jī)的size
????????????UGUI通過錨點(diǎn)和中心點(diǎn)和分辨率也可以解決這個(gè)問題
12.unity中的碰撞器和觸發(fā)器的區(qū)別?
????????一個(gè)有碰撞效果(碰撞器),一個(gè)沒有碰撞效果(觸發(fā)器)
13.動(dòng)態(tài)加載資源的方式有哪些?
????????????Resources和AssetBundle的方式加載資源
14.請(qǐng)簡(jiǎn)述一個(gè)對(duì)象池,你覺得在FPS里哪些東西適合使用對(duì)象池?
????????對(duì)象池就是存放需要被反復(fù)調(diào)用資源的一個(gè)空間,當(dāng)一個(gè)對(duì)象會(huì)大量生成的時(shí)候,
如果每次都銷毀創(chuàng)建會(huì)很浪費(fèi)時(shí)間,通過對(duì)象池把暫時(shí)不用的對(duì)象放到一個(gè)池子中
(也就是一個(gè)集合),當(dāng)下次要重新生成這個(gè)對(duì)象的時(shí)候先去池子中查找一下是否
有可用的對(duì)象,如果有的話就直接拿出來使用,不需要再創(chuàng)建,如果池子中沒有可
用的對(duì)象,才會(huì)需要重新創(chuàng)建,利用空間換時(shí)間來達(dá)到游戲的高速運(yùn)行的效果,
在FPS游戲中要常被大量復(fù)制的對(duì)象包括,子彈,敵人,粒子 等
15.請(qǐng)簡(jiǎn)述private,public,protected,internal的區(qū)別?
????????public:對(duì)任何類和成員都公開,無限制訪問
????????????private:僅對(duì)該類公開
????????????protected:保護(hù)修飾符,對(duì)該類和其派生類公開
????????????internal:只能在包含該類的程序集中訪問
16.Unity3D腳本從喚醒到銷毀有著一套比較完整的生命周期,請(qǐng)列出系統(tǒng)自帶的幾個(gè)重要的方法?
????????Awake——>OnEnable——>Start——>Update——>FixedUpdate——>
LateUpdate——>OnGUI——>OnDisable——>OnDestroy
17.物理更新一般放在哪一個(gè)系統(tǒng)函數(shù)里?
????????FixedUpdate沒固定幀繪制時(shí)執(zhí)行一次,和Update不同的是FixedUpdate是渲染幀執(zhí)行,如果你的渲染效率低下的時(shí)候FixedUpdate調(diào)用次數(shù)就會(huì)跟著下降。FixedUpdate比較使用于物理引擎計(jì)算,因?yàn)槭歉繋秩居嘘P(guān)。Update就比較適合做控制。
18.在場(chǎng)景中放置多個(gè)Camera并同時(shí)處于活動(dòng)狀態(tài)會(huì)發(fā)生什么?
????????游戲界面可以看到很多相機(jī)的混合
19.Readonly和Const的區(qū)別是什么?請(qǐng)簡(jiǎn)單描述
????????readonly只讀字段可以不設(shè)置初始值,而const常量就不行必須在創(chuàng)建時(shí)設(shè)置初始值
????????????readonly可以在構(gòu)造方法中進(jìn)行賦值,而const常量就不可以
20.C#中的排序方式有哪些?
????????冒泡排序,選擇排序,插入排序,快速排序,希爾排序,歸并排序
21.C#中反射的實(shí)現(xiàn)原理?
????????審查元數(shù)據(jù)并收集關(guān)于它的類型信息的能力。實(shí)現(xiàn)原理:在運(yùn)行時(shí)根據(jù)程序集及其中的類型得到元數(shù)據(jù)
22.C#中四種訪問修飾符是哪些?各有什么區(qū)別?
屬性修飾符:
????????Serializable:按值將對(duì)象封送到遠(yuǎn)程服務(wù)器。
????????STATread:是單線程套間的意思,是一種線程模型。
????????MATAThread:是多線程套間的意思,也是一種線程模型。
存取修飾符:
????????public:存取不受限制。
????????private:只有包含該成員的類可以存取。
????????internal:只有當(dāng)前工程可以存取。
????????protected:只有包含該成員的類以及派生類可以存取。
類修飾符:
????????abstract:抽象類。指示一個(gè)類只能作為其它類的基類。
????????sealed:密封類。指示一個(gè)類不能被繼承。理所當(dāng)然,密封類不能同時(shí)又是抽象類,因?yàn)槌橄罂偸窍M焕^承的。
成員修飾符:
????????abstract:指示該方法或?qū)傩詻]有實(shí)現(xiàn)。
????????sealed:密封方法??梢苑乐乖谂缮愔袑?duì)該方法的override(重載)。不是類的每個(gè)成員方法都可以作為密封方法密封方法,必須對(duì)基類的虛方法進(jìn)行重載,提供具體的實(shí)現(xiàn)方法。所以,在方法的聲明中,sealed修飾符總是和override修飾符同時(shí)使用。
????????delegate:委托。用來定義一個(gè)函數(shù)指針。C#中的事件驅(qū)動(dòng)是基于delegate + event的。
????????const:指定該成員的值只讀不允許修改。
????????event:聲明一個(gè)事件。
????????extern:指示方法在外部實(shí)現(xiàn)。
????????override:重寫。對(duì)由基類繼承成員的新實(shí)現(xiàn)。????
????????readonly:指示一個(gè)域只能在聲明時(shí)以及相同類的內(nèi)部被賦值。
????????static:指示一個(gè)成員屬于類型本身,而不是屬于特定的對(duì)象。即在定義后可不經(jīng)實(shí)例化,就可使用。
????????virtual:指示一個(gè)方法或存取器的實(shí)現(xiàn)可以在繼承類中被覆蓋。
????????new:在派生類中隱藏指定的基類成員,從而實(shí)現(xiàn)重寫的功能。 若要隱藏繼承類的成員,請(qǐng)使用相同名稱在派生類中聲明該成員,并用 new 修飾符修飾它。
23.Heap與Stack有何區(qū)別?
?????????heap是堆,stack是棧。
????????stack的空間由操作系統(tǒng)自動(dòng)分配和釋放,heap的空間是手動(dòng)申請(qǐng)和釋放的,heap常用new關(guān)鍵字來分配。
????????stack空間有限,heap的空間是很大的自由區(qū)。
24.值類型和引用類型有何區(qū)別?
????????1)值類型的數(shù)據(jù)存儲(chǔ)在內(nèi)存的棧中;引用類型的數(shù)據(jù)存儲(chǔ)在內(nèi)存的堆中,而內(nèi)存單元中只存放堆中對(duì)象的地址。
????????2)值類型存取速度快,引用類型存取速度慢。
????????3)值類型表示實(shí)際數(shù)據(jù),引用類型表示指向存儲(chǔ)在內(nèi)存堆中的數(shù)據(jù)的指針或引用
????????4)值類型繼承自System.ValueType,引用類型繼承自System.Object
????????5)棧的內(nèi)存分配是自動(dòng)釋放;而堆在.NET中會(huì)有GC來釋放
????????6)值類型的變量直接存放實(shí)際的數(shù)據(jù),而引用類型的變量存放的則是數(shù)據(jù)的地址,即對(duì)象的引用。
