C#問題
1.在類的構(gòu)造函數(shù)前加上static會報什么錯?為什么?
答:在構(gòu)造函數(shù)如果有public修飾的靜態(tài)構(gòu)造函數(shù)時會報:“靜態(tài)構(gòu)造函數(shù)中不允許出現(xiàn)訪問修飾符”,如果什么修飾符都不加的話不會報錯,靜態(tài)構(gòu)造函數(shù)一般是起初始化作用。
2.C# StringBuilder類型比string類型的優(yōu)勢是什么?
答:StringBuilde的優(yōu)勢在于拼接,string的優(yōu)勢在于對字符串做一些處理,在使用過程中看具體的需求。
3.C# 函數(shù)Func(string a, string b)用Lambda表達式怎么寫?
答:(a,b)=>{}
4.數(shù)列1,1,2,3,5,8,13...第n位數(shù)是多少?用C#遞歸算法實現(xiàn)
答:
5. 請簡述值類型與引用類型的區(qū)別
答:區(qū)別:
1.值類型存儲在內(nèi)存棧中,引用類型數(shù)據(jù)存儲在內(nèi)存堆中,而內(nèi)存單元中存放的是堆中
存放的地址。
2.值類型存取快,引用類型存取慢。
3.值類型表示實際數(shù)據(jù),引用類型表示指向存儲在內(nèi)存堆中的數(shù)據(jù)的指針和引用。
4.棧的內(nèi)存是自動釋放的,堆內(nèi)存是.NET中會由GC來自動釋放。
5.值類型繼承自System.ValueType,引用類型繼承自System.Object。
6. 請簡述ArrayList和List<>的主要區(qū)別
答:ArrayList是非泛型列表,存儲數(shù)據(jù)時把所有的數(shù)據(jù)都當(dāng)成object類型存儲,存在裝箱問題,取出來使用的時候存在拆箱問題,裝箱拆箱會使性能變差,而且存在數(shù)據(jù)安全問題,但是優(yōu)點在于可以讓值類型和引用類型互相轉(zhuǎn)換。
List是泛型列表,在使用的時候才去定義數(shù)據(jù)類型,泛型避免了拆箱裝箱的問題,存入讀取速度較快,類型也更安全。
7. 請簡述GC(垃圾回收)產(chǎn)生的原因,并描述如何避免?
答:GC回收堆上的內(nèi)存
避免:1)減少new產(chǎn)生對象的次數(shù)
2)使用公用的對象(靜態(tài)成員)
3)如果字符串拼接多的將String換為StringBuilder
8. 請描述Interface與抽象類之間的不同
答:語法不同處:1.抽象類中可以有字段,接口沒有。
2.抽象類中可以有實現(xiàn)成員,接口只能包含抽象成員。
3.抽象類中所有成員修飾符都可以使用,接口中所有的成員都是對外的,所以不需要修飾符修飾。
用法不同處:1.抽象類是概念的抽象,接口關(guān)注于行為。
2.抽象類的子類與父類的關(guān)系是泛化關(guān)系,耦合度較高,而實現(xiàn)類和接口之間是實現(xiàn)的關(guān)系,耦合度比泛化低。
3.一個類只能繼承一個類,但是可以實現(xiàn)多個接口。
9.下列代碼在運行中會產(chǎn)生幾個臨時對象?
string a = new string("abc");
a = (a.ToUpper() + "123").Substring(0, 2);
答:第一行是會出錯的。應(yīng)該這樣初始化:
string b = new string(new char[]{'a','b','c'});
3個臨時對象
10.下列代碼在運行中會發(fā)生什么問題?如何避免?
List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });
foreach (int item in ls)
{
Console.WriteLine(item * item);
ls.Remove(item);
}
答:會產(chǎn)生運行時錯誤,因為foreach是只讀的。不能一邊遍歷一邊修改。
使用foreach時候不要對內(nèi)容進行修改,如果要修改可以使用for
11.請簡述關(guān)鍵字Sealed用在類聲明和函數(shù)聲明時的作用
答:Sealed訪問修飾符用于類時,該類是密封類,可防止其他類繼承此類。
在方法中使用時則可防止派生類重寫此方法。
12.請簡述private,public,protected,internal的區(qū)別
答:public:對任何類和成員都公開,無限制訪問
private:僅對該類公開
protected:對該類和其派生類公開
internal:只能在包含該類的程序集中訪問該類
protected internal:protected + internal
13.反射的實現(xiàn)原理?
答:審查元數(shù)據(jù)并收集關(guān)于它的類型信息的能力。
14.Net與Mono的關(guān)系?
答:mono是.net的一個開源跨平臺工具。.net只能在windows下運行,mono可以實現(xiàn)跨平臺,可以運行于linux,Unix,Mac OS等。
15.請說出4種面向?qū)ο蟮脑O(shè)計原則,并分別簡述它們的含義。
答:1) 單一職責(zé)原則:一個類,最好只做一件事,只有一個引起它的變化.
2) 開放-封閉原則:對于擴展是開放的,對于更改是封閉的
3) 里氏替換原則:子類必須能夠替換其基類
4) 依賴倒置原則:依賴于抽象
5) 接口隔離原則 :使用多個小的專門的接口,而不要使用一個大的總接口。
16. Hashtable是無序的嗎?
答:電腦沒有絕對的無序,hashtable是通過哈希碼讓開發(fā)者感覺無序
17.請簡述ArrayList和List的主要區(qū)別?
ArrayList存在不安全類型(ArrayList會把所有插入其中的數(shù)據(jù)都當(dāng)做Object來處理),裝箱拆箱的操作(費時),List是泛型類,功能跟ArrayList相似,但不存在ArrayList所說的問題
18.簡述一下對象池,你覺得在FPS里哪些東西適合使用對象池
對象池就存放需要被反復(fù)調(diào)用資源的一個空間,當(dāng)一個對象回大量生成的時候如果每次都銷毀創(chuàng)建會很費時間,通過對象池把暫時不用的對象放到一個池中(也就是一個集合),當(dāng)下次要重新生成這個對象的時候先去池中查找一下是否有可用的對象,如果有的話就直接拿出來使用,不需要再創(chuàng)建,如果池中沒有可用的對象,才需要重新創(chuàng)建,利用空間換時間來達到游戲的高速運行效果,在FPS游戲中要常被大量復(fù)制的對象包括子彈,敵人,粒子等
19.結(jié)構(gòu)體和類有何區(qū)別?
結(jié)構(gòu)體是一種值類型,而類是引用類型。(值類型、引用類型是根據(jù)數(shù)據(jù)存儲的角度來分的)就是值類型用于存儲數(shù)據(jù)的值,引用類型用于存儲對實際數(shù)據(jù)的引用。那么結(jié)構(gòu)體就是當(dāng)成值來使用的,類則通過引用來對實際數(shù)據(jù)操作
20.C#的委托是什么?有何用處?
委托類似于一種安全的指針引用,在使用它時是當(dāng)做類來看待而不是一個方法,相當(dāng)于對一組方法的列表的引用。用處:使用委托使程序員可以將方法引用封裝在委托對象內(nèi)。然后可以將該委托對象傳遞給可調(diào)用所引用方法的代碼,而不必在編譯時知道將調(diào)用哪個方法。與C或C++中的函數(shù)指針不同,委托是面向?qū)ο?,而且是類型安全的?/p>
21.請簡述sealed關(guān)鍵字用在類聲明時與函數(shù)聲明時的作用
sealed修飾的類為密封類,類聲明時可防止其他類繼承此類,在方法中聲明則可防止派生類重寫此方法。
22.C#中的排序方式有哪些?
雞尾酒算法,選擇排序,冒泡排序(兩層for循環(huán)就是冒泡,另外理解雞尾酒算法也就是定向冒泡排序),快速排序,插入排序,希爾排序,歸并排序(可以百度學(xué)一下)
23.請簡述GC(垃圾回收)產(chǎn)生的原因,并描述如何避免?
GC回收堆上的內(nèi)存
避免:1.減少new產(chǎn)生對象的次數(shù)
2.使用公用的對象(靜態(tài)成員)
3.將String換為StringBuilder
24.反射的實現(xiàn)原理?
審查元數(shù)據(jù)并收集關(guān)于它的類型信息的能力。實現(xiàn)原理:在運行時根據(jù)程序集及其中的類型得到元數(shù)據(jù)。下面是實現(xiàn)步驟:
導(dǎo)入using System.Reflection;
Assembly.Load(“程序集”)加載程序集,返回類型是一個Assembly
得到程序集中所有類的名稱
foreach (Type type in assembly.GetTypes()) { string t = type.Name; }
- Type type = assembly.GetType(“程序集.類名”);獲取當(dāng)前類的類型
Activator.CreateInstance(type); 創(chuàng)建此類型實例
MethodInfo mInfo = type.GetMethod(“方法名”);獲取當(dāng)前方法
m.Info.Invoke(null,方法參數(shù));
Unity問題
UI
1.NGUI Button怎樣接受用戶點擊并調(diào)用函數(shù),具體方法名稱是什么?
答:
1.直接監(jiān)聽事件:在按鈕上綁定一個帶有OnClick腳本,但這種方法不太好用,也不靈活。
2.ButtonScript:在按鈕上添加BoxCollider,在添加ButtonScript腳本,把要調(diào)用的方法放到場景中一個物體上,一般放在攝像機上,因為攝像機一直存在,然后把這個方法添加到ButtonScript腳本里寫好的委托里面,所以可以添加多個方法,一旦點擊就觸發(fā)事件。
2.請簡述NGUI中Panel和Anchor的作用
答:Panel是一個容器,它將包含所有UI小部件,并負(fù)責(zé)將所包含的部件組合優(yōu)化,以減少繪制命令的調(diào)用。
Anchor是NGUI中屏幕分辨率的自適應(yīng)性,來適應(yīng)不同的分辨率的屏幕顯示。
3.為何大家都在移動設(shè)備上尋求U3D原生GUI的替代方案
答:1.不美觀
2.OnGUI很耗費時間
3.使用不方便
- drawcall很高
4.使用原生GUI創(chuàng)建一個可以拖動的窗口命令是什么?
答:GUI.DragWindow()
4.動態(tài)加載資源的方式?他們之間的區(qū)別
1.Resources.Load();
2.AssetBundle
5.使用Unity3d實現(xiàn)2d游戲,有幾種方式?
答:1.使用本身的GUI
2.把攝像機的Projection(投影)值調(diào)為Orthographic(正交投影),不考慮z軸
3.使用2d插件,如:2DToolKit
碰撞
6.怎么判斷兩個平面是否相交?不能用碰撞體,說出計算方法
答:在兩個平面上分別取一個向量,然后看是否相交
7.MeshCollider和其他Collider的一個主要不同點?
答:MeshCollider是網(wǎng)格碰撞器,對于復(fù)雜網(wǎng)狀模型上的碰撞檢測,比其他的碰撞檢測精確的多,但是相對其他的碰撞檢測計算也增多了,所以一般使用網(wǎng)格碰撞也不會在面數(shù)比較高的模型上添加,而會做出兩個模型,一個超簡模能表示物體的形狀用于做碰撞檢測,一個用于顯示。
8.Unity3d中的碰撞器和觸發(fā)器的區(qū)別?
答:1.碰撞器物體不能互相進入到對方內(nèi)部,觸發(fā)器可以
2.觸發(fā)器角色控制器可以使用,碰撞器中不能使用
3.觸發(fā)器沒有物理屬性了,碰撞器可以有力存在
4.碰撞器調(diào)用OnCollisionEnter/Stay/Exit函數(shù),觸發(fā)器調(diào)用OnTriggerEnter/Stay/Exit函數(shù)
9.物體發(fā)生碰撞的必要條件
答:兩個物體都必須帶有碰撞器(Collider),其中一個物體還必須帶有Rigidbody剛體。
CharacterController和Rigidbody的區(qū)別?
CharacterController自帶膠囊碰撞器,里面包含有剛體的屬性;
Rigidbody就是剛體,使物體帶有剛體的特征。
10.當(dāng)一個細小的高速物體撞向另一個較大的物體時,會出現(xiàn)什么情況?如何避免?
答:穿透(碰撞檢測失?。?/p>
避免的方法:把剛體的實時碰撞檢測打開Collision Detection修改為Continuous Dynamic
在unity3d中物體發(fā)生碰撞的整個過程中,有幾個階段,分別列出對應(yīng)的階段函數(shù)
主要是三個階段:1.Collider.OnCollisionEnter 進入碰撞, OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider. 當(dāng)collider/rigidbody開始觸動另一個rigidbody/collider時OnCollisionEnter被調(diào)用。 2.Collider.OnCollisionStay 逗留碰撞, OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider. 每個collider/rigidbody觸動rigidbody/collider,將在每幀調(diào)用OnCollisionStay。通俗的說, 一個碰撞器或剛體觸動另一個剛體或碰撞器,在每幀都會調(diào)用OnCollisionStay,直到它們之間離開不接觸。 3.Collider.OnCollisionExit 退出碰撞, OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider. 當(dāng) collider/rigidbody停止觸動另一個 rigidbody/collider時,OnCollisionExit被調(diào)用。
11.CharacterController和Rigidbody的區(qū)別
Rigidbody具有完全真實物理的特性,Unity中物理系統(tǒng)最基本的一個組件,包含了常用的物理特性,而CharacterController可以說是受限的的Rigidbody,具有一定的物理效果但不是完全真實的,是Unity為了使開發(fā)者能方便的開發(fā)第一人稱視角的游戲而封裝的一個組件
12.簡述prefab的用處
在游戲運行時實例化,prefab相當(dāng)于一個模板,對你已經(jīng)有的素材、腳本、參數(shù)做一個默認(rèn)的配置,以便于以后的修改,同時prefab打包的內(nèi)容簡化了導(dǎo)出的操作,便于團隊的交流。
動畫
11.一個簡單的游戲,怪物會走動\攻擊\死亡,游戲角色會走動,跳躍\攻擊\格擋\死亡,還會接受玩家從輸入端輸入的指令,NPC會走動,他們彼此之間可以互相通信.請畫出以上三種角色的UML圖示.
答:
12.請描述游戲動畫有哪幾種,以及其原理?
答:主要有關(guān)節(jié)動畫、單一網(wǎng)格模型動畫(關(guān)鍵幀動畫)、骨骼動畫。
1.關(guān)節(jié)動畫:把角色分成若干獨立部分,一個部分對應(yīng)一個網(wǎng)格模型,部分的動畫連接成一個整體的動畫,角色比較靈活,Quake2中使用這種動畫。
2.單一網(wǎng)格模型動畫由一個完整的網(wǎng)格模型構(gòu)成,在動畫序列的關(guān)鍵幀里記錄各個頂點的原位置及其改變量,然后插值運算實現(xiàn)動畫效果,角色動畫較真實。
3.骨骼動畫,廣泛應(yīng)用的動畫方式,集成了以上兩個方式的優(yōu)點,骨骼按角色特點組成一定的層次結(jié)構(gòu),有關(guān)節(jié)相連,可做相對運動,皮膚作為單一網(wǎng)格蒙在骨骼之外,決定角色的外觀,皮膚網(wǎng)格每一個頂點都會受到骨骼的影響,從而實現(xiàn)完美的動畫。
13.反向旋轉(zhuǎn)動畫的方法是什么?
答: 反轉(zhuǎn)動畫,將動畫的速度調(diào)到-1。
14.寫出Animation的五個方法
答:AddClip 添加剪輯、Blend 混合、Play 播放、Stop 停止、Sample 采樣 、CrossFade淡入淡出切換動畫、IsPlaying是否正在播放某個動畫
15.動畫層(AnimationState Layers)的作用是什么?
答:動畫層作為一個具有層級動畫編輯概念的工具,可以用來制作和處理任何類型的動畫
16.Itween插件的作用是什么,Itween作用于世界坐標(biāo)還是局部坐標(biāo),請列舉出3個其常用方法?
答:ITween是補間動畫的一個插件,主要作用就是給出開始、結(jié)束的值、時間,此插件實現(xiàn)各種動畫,晃動,旋轉(zhuǎn),移動,褪色,上色,音量控制等等。
方法:1.MoveTo 物體移動
2.ColorTo:隨著時間改變對象的顏色組
3.LookTo:隨時間旋轉(zhuǎn)物體讓其臉部朝向所提供的Vector3或Transform位置
17.法線貼圖 、CG動畫 ?
答:法線貼圖:是一種特殊的紋理,可以應(yīng)用在3D表面,讓低模呈現(xiàn)出更明顯的凹凸效果。一般應(yīng)用在CG動畫、美術(shù)效果要求較高的單機游戲
CG動畫:游戲中的CG動畫其實是用3D模擬引擎制作的游戲短片,一般畫面效果比較真實。
線程和協(xié)程
18.Unity3D是否支持寫成多線程程序?如果支持的話需要注意什么?
答:Unity支持多線程,如果同時要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。
注意:1.雖然支持多線程,但是僅能從主線程中訪問Unity3D的組件,對象和Unity3D系統(tǒng)調(diào)用,所以如果使用的話需要把組件中的數(shù)值傳到開啟的新線程中。
2.C#中有l(wèi)ock這個關(guān)鍵字,以確保只有一個線程可以在特定時間內(nèi)訪問特定的對象
19.Unity3D的協(xié)程和C#線程之間的區(qū)別是什么?
答:多線程程序同時運行多個線程,除主線程之外的線程無法訪問Unity3D的對象、組件、方法,而在任一指定時刻只有一個協(xié)程在運行。
20.什么是協(xié)同程序?
答:在主線程運行時同時開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。換句話說,開啟協(xié)程就是開啟一個線程??梢杂脕砜刂七\動、序列以及對象的行為。
四元數(shù)
21.四元數(shù)是什么?主要作用什么?對歐拉角的優(yōu)點是什么?
答:所謂四元數(shù),就是把4個實數(shù)組合起來的東西。4個元素中,一個是實部,其余3個是虛部
作用:四元數(shù)用于表示旋轉(zhuǎn)
優(yōu)點:
1)能進行增量旋轉(zhuǎn)
2)避免萬向鎖
3)給定方位的表達方式有兩種,互為負(fù)(歐拉角有無數(shù)種表達方式)
四元數(shù)不會有歐拉角存在的 gimbal lock 問題[萬向節(jié)死鎖]
四元數(shù)由4個數(shù)組成,旋轉(zhuǎn)矩陣需要9個數(shù)
兩個四元數(shù)之間更容易插值
四元數(shù)、矩陣在多次運算后會積攢誤差,需要分別對其做規(guī)范化(normalize)和正交化 (orthogonalize),對四元數(shù)規(guī)范化更容易
與旋轉(zhuǎn)矩陣類似,兩個四元組相乘可表示兩次旋轉(zhuǎn)
攝像機
22.在場景中放置多個Camera并同時處于活動狀態(tài)會發(fā)生什么?
答:游戲界面可以看到很多攝像機的混合
23.Unity攝像機有幾種工作方式,分別是什么?
答:正交和透視
正交無法看到一個物體距離自己有多遠,或者遠近的變化,物體也不會隨著距離而收縮,所以一般做2D游戲或者是UI時會使用正交攝像機。
透視一般看物體會隨著距離有大小的變化,一般3D游戲里經(jīng)常使用這種攝像機。
預(yù)制物
24.Prefab的作用?如何在移動環(huán)境的設(shè)備下恰當(dāng)?shù)厥褂盟?/h3>
答:Prefab是預(yù)制物,一般當(dāng)游戲中需要頻繁創(chuàng)建一個物體時,使用預(yù)制物可以節(jié)省內(nèi)存,方便創(chuàng)建,方便對游戲物體進行操作,方便對屬性進行修改。
unity 當(dāng)需要頻繁創(chuàng)建一個物體對象時,怎樣減少內(nèi)存
答:動態(tài)加載再實例化,如果自己不主動清理內(nèi)存的話,再次加載不會增加內(nèi)存的,會自動去取之前已經(jīng)加載好的assets,如果這一個assets你都嫌多的話,那你只能減資源了,比如,模型面數(shù),紋理尺寸等
Shader
25.出光照計算中的diffuse的計算公式
答:實際光照強度l=環(huán)境光(lambient)+漫反射光(Idiffuse)+鏡面高光(lspecular)
環(huán)境光:lambient=環(huán)境光強度(Aintensity)*環(huán)境光顏色(Acolor)
漫反射光:ldiffuse=鏡面光照強度(Dintensity)*鏡面光顏色(Scolor)*(光的反射向量(R).觀察者向量(V))^鏡面光指數(shù)(n)
26.MeshRender中material和shader的區(qū)別?
答:MeshRender是模型渲染的組件,有此組件物體才能顯示出來
Material是材質(zhì)球,實際就是shader的實例,并進行賦值,貼圖、紋理、顏色等。
Shader是著色器,實際上是一段程序,還可以用來實現(xiàn)一些僅靠貼圖不容易實現(xiàn)的效果,如玻璃。
Shader大致分為:1.表面著色器
2.頂點和片元著色器
3.固定功能著色器
27.alpha blend工作原理
答:Alpha Blend是 實現(xiàn)透明效果,Color = 原顏色alpha/255+目標(biāo)色(255-alpha)/255
28.光照貼圖 的優(yōu)勢是什么?
答:1.使用光照貼圖比使用實時光源渲染要快
2.可以降低游戲內(nèi)存消耗
3.多個物體可以使用同一張光照貼圖
29.Vertex Shader是什么,怎么計算?
答:頂點著色器:頂點著色器是一段執(zhí)行在GPU上的程序,用來取代fixed pipeline中的
transformation和lighting,Vertex Shader主要操作頂點。
Vertex Shader對輸入頂點完成了從local space到homogeneous space(齊次空間)的變換過程,homogeneous space即projection space的下一個space。在這其間共有world transformation, view transformation和projection transformation及l(fā)ighting幾個過程。
.unity3d提供了幾種光源,分別是什么
答:4種,Directionl light ,Point Light ,Spot Light,Area Light
Unity系統(tǒng)API
物理更新一般在哪個系統(tǒng)函數(shù)里?
答:FixedUpdate,每固定幀繪制時執(zhí)行一次,和update不同的是FixedUpdate是渲染幀執(zhí)行,如果你的渲染效率低下的時候FixedUpdate調(diào)用次數(shù)就會跟著下降。FixedUpdate比較適用于物理引擎的計算,因為是跟每幀渲染有關(guān)。Update就比較適合做控制。
30.OnEnable、Awake、Start運行時的發(fā)生順序?哪些可能在同一個對象周期中反復(fù)的發(fā)生?
答:Awake –>OnEnable->Start
OnEnable在同一周期中可以反復(fù)地發(fā)生
31.Unity3d腳本從喚醒到銷毀有著一套比較完整的生命周期,請列出系統(tǒng)自帶的幾個重要的方法。
答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
32.物理更新一般放在哪個系統(tǒng)函數(shù)里?
答:FixedUpdate因為不受到計算機幀頻的影響,所以比較適合于做物理方面的更新。
33.移動攝像機的動作放在哪個系統(tǒng)函數(shù)中,為什么放在這個函數(shù)中?
答:LateUpdate,在每幀執(zhí)行完畢調(diào)用,它是在所有Update結(jié)束后才調(diào),比較適合用于命令腳本的執(zhí)行。官網(wǎng)上例子是攝像機的跟隨,都是在所有Update操作完才跟進攝像機,不然就有可能出現(xiàn)攝像機已經(jīng)推進了,但是視角里還未有角色的空幀出現(xiàn)。
34.請簡述OnBecameVisible及OnBecameInvisible的發(fā)生時機,以及這一對回調(diào)函數(shù)的意義?
答:
當(dāng)物體是否可見切換之時??梢杂糜谥恍枰谖矬w可見時才進行的計算。
當(dāng)renderer(渲染器)在任何相機上都不可見時調(diào)用:OnBecameInvisible 當(dāng)renderer(渲染器)在任何相機上可見時調(diào)用:OnBecameVisible
35.Unity3d提供了一個用于保存和讀取數(shù)據(jù)的類(PlayerPrefs),請列出保存和讀取整形數(shù)據(jù)的函數(shù)
答:PlayerPrefs.SetInt()
PlayerPrefs.GetInt()
36.動態(tài)加載資源的方式?區(qū)別是什么?
答:1.Resources.Load();
2.AssetBundle
區(qū)別:
Resources是動態(tài)內(nèi)部調(diào)用,Resources在編輯環(huán)境下是project窗口的一個文件夾,調(diào)用里面的資源,可以用Resources類,比如Resources.Load,打包后這個文件夾是不存在的,會統(tǒng)一生成assets資源,AssetBundle 是外部調(diào)用,要用AssetBundle 首先要先把資源打包為.assetbundle文件,再動態(tài)的去加載這個文件,本地或者網(wǎng)絡(luò)服務(wù)器都可以。 簡單說,Resources資源的加載是動態(tài)加載內(nèi)部的,AssetBundle 是動態(tài)加載外部的
37.以下哪個函數(shù)在游戲進入新場景后會被馬上調(diào)用?
答:MonoBehaviour.OnLevelWasLoaded
38.如何銷毀一個UnityEngine.Object及其子類對象
答:Destory
39.獲取、增加、刪除組件的命令分別是什么?
答:獲?。篏etComponent
增加:AddComponent
沒有刪除組件只有讓組件不生效:enable
40.Application.loadLevel命令是什么?
答:加載關(guān)卡
41.調(diào)試記錄到控制臺的命令是什么?
答: Debug.Log();
42.LayerMask.NameToLayer()這個方法有什么作用?
答:層索引
43.localPosition與Position的使用區(qū)別?
答:localPosition:自身位置,相對于父級的變換的位置,局部坐標(biāo)其實就是自身的坐標(biāo),會隨著物體的旋轉(zhuǎn)而變化的。
Position:在世界坐標(biāo)transform的位置,世界坐標(biāo)是不會變的,一直以世界坐標(biāo)軸的XYZ為標(biāo)準(zhǔn)。
44.物體自身旋轉(zhuǎn)使用的函數(shù)?
答:Transform.Rotate()
45.物體圍繞某點旋轉(zhuǎn)使用的函數(shù)?
答:Transform.RotateAround()
46.U3D中用于記錄節(jié)點空間幾何信息的組件名稱,及其父類名稱
答:Transform 父類是 Component
47.寫一個計時器工具,從整點開始計時,格式為:00:00:00
答:
int scend;
int minte;
int hour;
void Start()
{
scend=0;
minte=0;
hour=0;
}
void Update()
{
If(scend<60)
{
Scend+=time.deltime;
}
Else
{
Scend-=60;
Minte+=1;
}
If(minte>=60)
{
Minte-=60;
Hour+=1;
}
}
物理引擎
48.<憤怒的小鳥>給予初速度以后,怎么讓小鳥受到重力和空氣阻力的影響而繪制拋物線軌跡,說出具體的計算方法.
答:添加剛體使小鳥模擬受到重力影響。
49.實現(xiàn)吊機吊物體的功能
50.上機題:用鼠標(biāo)實現(xiàn)在場景中拖動物體,用鼠標(biāo)滾輪實現(xiàn)縮放(用一個Cube即可)。
答:在場景中添加一個Plan,Camera,Directional Light,Cube。添加兩個腳本scrollerScirpt(掛在Camera),CubeDragScript(掛在Cube上)。
1.鼠標(biāo)滾輪實現(xiàn)縮放:將攝像機的鏡頭拉近或者拉遠,調(diào)整攝像機的視角就可以實現(xiàn),主要實現(xiàn)代碼如下:
2.鼠標(biāo)實現(xiàn)在場景中拖動物體:
解決思路就是將世界坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo),然后計算物體與鼠標(biāo)之間移動量,循環(huán)鼠標(biāo)被按下操作,得到鼠標(biāo)的當(dāng)前位置,加上計算好的移動量,將新的坐標(biāo)賦值給物理就行了。主要是開啟一個協(xié)同程序(Corountine)來處理
51.Material和Physic Material區(qū)別?
答:PhysicMaterial 物理材質(zhì):主要是控制物體的摩擦,彈力等物理屬性。
Material材質(zhì):主要是控制一個物體的顏色,質(zhì)感等顯示。
52.CharacterController和Rigidbody的區(qū)別?
答:CharacterController自帶膠囊碰撞器,里面包含有剛體的屬性;
Rigidbody就是剛體,使物體帶有剛體的特征。
53.Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來
答:rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函數(shù)中。
54.什么叫做鏈條關(guān)節(jié)?
答:Hinge Joint,可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內(nèi)部相互移動而不產(chǎn)生作用力,但是達到固定距離后就會產(chǎn)生拉力。
55.什么是導(dǎo)航網(wǎng)格( NavMesh)?
答: Unity內(nèi)一種用于實現(xiàn)自動尋路的網(wǎng)格
56.Unity3d提供了幾種光源類型,分別是哪幾種?
答:四種。
平行光:Directional Light
點光源:Point Light
聚光燈:Spot Light
區(qū)域光源:Area Light
Unity引擎問題
57.簡述Unity3D支持的作為腳本的語言的名稱
答:Unity的腳本語言基于Mono的.Net平臺上運行,可以使用.NET庫,這也為XML、數(shù)據(jù)庫、正則表達式等問題提供了很好的解決方案。
Unity里的腳本都會經(jīng)過編譯,他們的運行速度也很快。這三種語言實際上的功能和運行速度是一樣的,區(qū)別主要體現(xiàn)在語言特性上。
JavaScript
C#
Boo
目前已經(jīng)取消了其他兩種的語言,只剩下C#
58.向量的點乘、叉乘以及歸一化的意義?
答:1)點乘計算兩個向量之間的夾角,還可表示某一方向的投影
2)叉乘得到的是法向量
3)標(biāo)準(zhǔn)化向量:用在只關(guān)系方向,不關(guān)心大小的時候
59.矩陣相乘的意義及注意點?
答:用于表示線性變換:旋轉(zhuǎn)、縮放、投影、平移、仿射
注意:矩陣的蠕變:誤差的積累
60.為什么dynamic font在unicode環(huán)境下優(yōu)于static font?
答:Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。
使用動態(tài)字體時,Unity將不會預(yù)先生成一個與所有字體的字符紋理。當(dāng)需要支持亞洲語言或者較大的字體的時候,若使用正常紋理,則字體的紋理將非常大。
61.Render的作用?描述MeshRender和SkinnedMeshRender的關(guān)系與不同
答:render是渲染器,渲染器可以使物體顯示在屏幕上。
MeshRender是網(wǎng)格渲染,SkinnedMeshRender是蒙皮網(wǎng)格渲染器
62.簡述SkinnedMesh的實現(xiàn)原理(這是模型相關(guān)的)
答:骨骼蒙皮動畫,模型本身是靜態(tài)的,是因為通過蒙皮,使模型每個點都有Skin數(shù)據(jù),Skin數(shù)據(jù)包括頂點受到哪些骨骼影響以及這些骨骼影響頂點的權(quán)重值,還有動畫數(shù)據(jù),有了Skin數(shù)據(jù)的模型就可以根據(jù)動畫數(shù)據(jù)進行顯示動畫了。
63.為什么Unity3D中會發(fā)生在組件上出現(xiàn)數(shù)據(jù)丟失的情況?
答:組件上綁定的對象被刪除了
64.如何安全的在不同工程間安全地遷移asset數(shù)據(jù)?三種方法
答:
1)將Assets目錄和Library目錄一起遷移
2)導(dǎo)出資源包
3)用unity自帶的assets Server功能(了解就行)
65.Lod是什么,優(yōu)缺點是什么?
答:LOD是Level of detail簡稱,意為多層次細節(jié),是最常用的游戲優(yōu)化技術(shù),LOD技術(shù)指根據(jù)物體模型的幾點在顯示環(huán)境中所處的位置和重要性,決定物體渲染的資源分配,降低非重要物體的面數(shù)和細節(jié)度,從而獲得高效率的渲染運算。
優(yōu)點:可根據(jù)距離動態(tài)的選擇渲染不同細節(jié)的模型
缺點:增加美工工作量,增大了游戲的容量。
66.兩種陰影判斷的方法、工作原理。
答:自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出,即假設(shè)視點在點光源的位置。
投射陰影:因不透明物體遮擋光線使得場景中位于該物體后面的物體或區(qū)域收不到光照照射而形成的陰影。
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,保存這些陰影多邊形信息,然后在按視點位置對場景進行相應(yīng)處理得到所要求的師徒(利用空間換時間,每次只需依據(jù)視點位置進行一次陰影計算即可,省去了一次消隱過程)若是動態(tài)光源此方法就無效了。
67.MipMap是什么,作用?
答:MipMapping:在三維計算機圖形的貼圖渲染中有常用的技術(shù),為加快渲染進度和減少圖像鋸齒,貼圖被處理成由一系列被預(yù)先計算和優(yōu)化過的圖片組成的文件,這樣的貼圖被稱為MipMap。
68.用代碼實現(xiàn)第三角色控制器
代碼自己寫出來
69.Mecanim系統(tǒng)中,Body Mask的作用是?
答:指定身體的某一部分是否參與渲染 即身體遮罩
70.Unity連接數(shù)據(jù)庫
答:需要得到Mono.Data.Sqlite.dll 文件與System.Data.dll文件 (可以說這一塊不太了解)
71.如何優(yōu)化內(nèi)存?
答:1.壓縮自帶類庫
2.將暫時不用的以后還需要使用的物體隱藏起來而不是直接Destroy掉
3.釋放AssetBundle占用的資源
4.降低模型的片面數(shù),降低模型的骨骼數(shù)量,降低貼圖的大小
5.使用光照貼圖
6.使用多層次細節(jié)(LOD)
7.使用著色器(Shader)
8.使用預(yù)設(shè)(Prefab)等
72.你用過哪些插件?
答:NGUI/DF/ITeen/可以自己去找一些插件使用一下?;騽t看我博客的幾款插件使用
在哪個模塊下可以修改Render Path?
a. Camera
b. Light
c. Render settings
d. ProjectSetting=》Player=》OtherSettings
圖形圖像
1.什么是渲染管道?
答:是指在顯示器上為了顯示出圖像而經(jīng)過的一系列必要操作。
渲染管道中的很多步驟,都要將幾何物體從一個坐標(biāo)系中變換到另一個坐標(biāo)系中去。
主要有三步:應(yīng)用程序階段,幾何階段 光柵階段
本地坐標(biāo)->視圖坐標(biāo)->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。
2.什么是矢量圖 ?
答:計算機中顯示的圖形一般可以分為兩大類——矢量圖和位圖。矢量圖使用直線和曲線來描述圖形,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數(shù)學(xué)公式計算獲得的。例如一幅花的矢量圖形實際上是由線段形成外框輪廓,由外框的顏色以及外框所封閉的顏色決定花顯示出的顏色。由于矢量圖形可通過公式計算獲得,所以矢量圖形文件體積一般較小。矢量圖形最大的優(yōu)點是無論放大、縮小或旋轉(zhuǎn)等不會失真;最大的缺點是難以表現(xiàn)色彩層次豐富的逼真圖像效果。
3.什么是矩陣?矩陣運算?
答:矩陣:橫軸排列的二維數(shù)據(jù)表格
矩陣運算:
加減 限制條件:行和列必須相同,對應(yīng)相加相減得到結(jié)果
乘法 限制條件:要求左矩陣的行和右矩陣的列必須同,行數(shù)和左矩陣相等,列數(shù)和右矩陣相等,結(jié)果的第i行第j列,是左矩陣的第i行和右矩陣的第j列逐個相乘并把結(jié)果相加,得到結(jié)果是結(jié)果 的 第i行第j列
4.角度和弧度的轉(zhuǎn)換
答:角度和弧度
度和弧度之間的換算 1弧度 = 180度 /pi(約57.3)
1度=pi/180弧度(約0.017)
5.矢量標(biāo)量
答:矢量有方向如力速度 標(biāo)量只有大小沒有方向如溫度
矢量取模就是只要大小不要方向
^單位向量 有方向 大小為1的向量
矢量的加法:是矢量的幾何和,服從平行四邊形規(guī)則
矢量滿足交換律,滿足結(jié)合律
在直角坐標(biāo)系中,矢量等于騎在坐標(biāo)軸上投影的矢量之和(二維矢量可以看做三維矢量的特例也就是說 三維成立,二維也成立)
矢量減法:
大小相等 方向相反 稱為逆矢量
任意多個矢量首尾相連接組成閉合多邊形,其結(jié)果必為0
矢量的乘法:點積(內(nèi)積、標(biāo)量積)、叉積(外積)結(jié)果是矢量
點積方法 dot