這個是我剛剛整理出的Unity面試題,為了幫助大家面試豪嗽,同時幫助大家更好地復(fù)習(xí)Unity知識點外厂,如果大家發(fā)現(xiàn)有什么錯誤冕象,(包括錯別字和知識點),或者發(fā)現(xiàn)哪里描述的不清晰汁蝶,請在下面留言渐扮,我會重新更新,希望大家共同來幫助開發(fā)者
一:什么是協(xié)同程序掖棉?
在主線程運行的同時開啟另一段邏輯處理墓律,來協(xié)助當(dāng)前程序的執(zhí)行,協(xié)程很像多線程幔亥,但是不是多線程耻讽,Unity的協(xié)程實在每幀結(jié)束之后去檢測yield的條件是否滿足。
二:Unity3D中的碰撞器和觸發(fā)器的區(qū)別帕棉?
碰撞器是觸發(fā)器的載體针肥,而觸發(fā)器只是碰撞器身上的一個屬性。當(dāng)Is Trigger=false時香伴,碰撞器根據(jù)物理引擎引發(fā)碰撞慰枕,產(chǎn)生碰撞的效果,可以調(diào)用OnCollisionEnter/Stay/Exit函數(shù)即纲;當(dāng)Is Trigger=true時捺僻,碰撞器被物理引擎所忽略,沒有碰撞效果崇裁,可以調(diào)用OnTriggerEnter/Stay/Exit函數(shù)匕坯。如果既要檢測到物體的接觸又不想讓碰撞檢測影響物體移動或要檢測一個物件是否經(jīng)過空間中的某個區(qū)域這時就可以用到觸發(fā)器
三:物體發(fā)生碰撞的必要條件?
兩個物體都必須帶有碰撞器(Collider)拔稳,其中一個物體還必須帶有Rigidbody剛體葛峻,而且必須是運動的物體帶有Rigidbody腳本才能檢測到碰撞。
四:請簡述ArrayList和List的主要區(qū)別巴比?
ArrayList存在不安全類型(ArrayList會把所有插入其中的數(shù)據(jù)都當(dāng)做Object來處理)?裝箱拆箱的操作(費時)?List是接口术奖,ArrayList是一個實現(xiàn)了該接口的類礁遵,可以被實例化
五:如何安全的在不同工程間安全地遷移asset數(shù)據(jù)?三種方法
1.將Assets目錄和Library目錄一起遷移
2.導(dǎo)出包采记,export Package
3.用unity自帶的assets Server功能
六:OnEnable佣耐、Awake、Start運行時的發(fā)生順序唧龄?哪些可能在同一個對象周期中反復(fù)的發(fā)生
Awake –>OnEnable->Start兼砖,OnEnable在同一周期中可以反復(fù)地發(fā)生。
七:MeshRender中material和sharedmaterial的區(qū)別既棺?
修改sharedMaterial將改變所有物體使用這個材質(zhì)的外觀讽挟,并且也改變儲存在工程里的材質(zhì)設(shè)置。不推薦修改由sharedMaterial返回的材質(zhì)丸冕。如果你想修改渲染器的材質(zhì)耽梅,使用material替代。
八:Unity提供了幾種光源胖烛,分別是什么
四種眼姐。
平行光:Directional Light
點光源:Point Light
聚光燈:Spot Light
區(qū)域光源:Area Light
九:簡述一下對象池,你覺得在FPS里哪些東西適合使用對象池
對象池就存放需要被反復(fù)調(diào)用資源的一個空間佩番,當(dāng)一個對象回大量生成的時候如果每次都銷毀創(chuàng)建會很費時間众旗,通過對象池把暫時不用的對象放到一個池中(也就是一個集合),當(dāng)下次要重新生成這個對象的時候先去池中查找一下是否有可用的對象答捕,如果有的話就直接拿出來使用,不需要再創(chuàng)建屑那,如果池中沒有可用的對象拱镐,才需要重新創(chuàng)建,利用空間換時間來達(dá)到游戲的高速運行效果持际,在FPS游戲中要常被大量復(fù)制的對象包括子彈沃琅,敵人,粒子等
十:CharacterController和Rigidbody的區(qū)別
Rigidbody具有完全真實物理的特性蜘欲,Unity中物理系統(tǒng)最基本的一個組件益眉,包含了常用的物理特性,而CharacterController可以說是受限的的Rigidbody姥份,具有一定的物理效果但不是完全真實的郭脂,是Unity為了使開發(fā)者能方便的開發(fā)第一人稱視角的游戲而封裝的一個組件
十一:簡述prefab的用處
在游戲運行時實例化,prefab相當(dāng)于一個模板澈歉,對你已經(jīng)有的素材展鸡、腳本、參數(shù)做一個默認(rèn)的配置埃难,以便于以后的修改莹弊,同時prefab打包的內(nèi)容簡化了導(dǎo)出的操作涤久,便于團(tuán)隊的交流。
十二:請簡述sealed關(guān)鍵字用在類聲明時與函數(shù)聲明時的作用
sealed修飾的類為密封類忍弛,類聲明時可防止其他類繼承此類响迂,在方法中聲明則可防止派生類重寫此方法。
十三:請簡述private细疚,public蔗彤,protected,internal的區(qū)別
public:對任何類和成員都公開惠昔,無限制訪問
private:僅對該類公開
protected:對該類和其派生類公開
internal:只能在包含該類的程序集中訪問該類
十四:使用Unity3d實現(xiàn)2d游戲幕与,有幾種方式?
使用本身的GUI镇防,在Unity4.6以后出現(xiàn)的UGUI
2.把攝像機(jī)的Projection(投影)值調(diào)為Orthographic(正交投影)啦鸣,不考慮z軸;
3.使用2d插件来氧,如:2DToolKit诫给,和NGUI
十五:在物體發(fā)生碰撞的整個過程中,有幾個階段啦扬,分別列出對應(yīng)的函數(shù)
三個階段中狂,1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionExit
十六:Unity3d的物理引擎中,有幾種施加力的方式扑毡,分別描述出來
rigidbody.AddForce/AddForceAtPosition胃榕,都在rigidbody系列函數(shù)中。大家可以自己去查看一下rigidbody的API
十七:什么叫做鏈條關(guān)節(jié)瞄摊?
Hinge Joint勋又,可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內(nèi)部相互移動而不產(chǎn)生作用力换帜,但是達(dá)到固定距離后就會產(chǎn)生拉力楔壤。
十八:物體自身旋轉(zhuǎn)使用的函數(shù)?
Transform.Rotate()
十九:Unity3d提供了一個用于保存和讀取數(shù)據(jù)的類(PlayerPrefs)惯驼,請列出保存和讀取整形數(shù)據(jù)的函數(shù)
PlayerPrefs.SetInt() PlayerPrefs.GetInt()
二十:Unity3d腳本從喚醒到銷毀有著一套比較完整的生命周期蹲嚣,請列出系統(tǒng)自帶的幾個重要的方法。
Awake——>OnEnable–>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy
二十一:物理更新一般放在哪個系統(tǒng)函數(shù)里祟牲?
FixedUpdate隙畜,每固定幀繪制時執(zhí)行一次,和Update不同的是FixedUpdate是渲染幀執(zhí)行说贝,如果你的渲染效率低下的時候FixedUpdate調(diào)用次數(shù)就會跟著下降禾蚕。FixedUpdate比較適用于物理引擎的計算,因為是跟每幀渲染有關(guān)狂丝。Update就比較適合做控制换淆。
二十二:在場景中放置多個Camera并同時處于活動狀態(tài)會發(fā)生什么哗总?
游戲界面可以看到很多攝像機(jī)的混合。
二十三:如何銷毀一個UnityEngine.Object及其子類倍试?
使用Destroy()方法;
二十四:請描述為什么Unity3d中會發(fā)生在組件上出現(xiàn)數(shù)據(jù)丟失的情況
一般是組件上綁定的物體對象被刪除了
二十五:LOD是什么讯屈,優(yōu)缺點是什么?
LOD(Level of detail)多層次細(xì)節(jié)县习,是最常用的游戲優(yōu)化技術(shù)涮母。它按照模型的位置和重要程度決定物體渲染的資源分配,降低非重要物體的面數(shù)和細(xì)節(jié)度躁愿,從而獲得高效率的渲染運算叛本。缺點是增加了內(nèi)存。
二十六:MipMap是什么彤钟,作用来候?
MipMapping:在三維計算機(jī)圖形的貼圖渲染中有常用的技術(shù),為加快渲染進(jìn)度和減少圖像鋸齒逸雹,貼圖被處理成由一系列被預(yù)先計算和優(yōu)化過的圖片組成的文件营搅,這樣的貼圖被稱為MipMap。
二十七:請描述Interface與抽象類之間的不同
抽象類表示該類中可能已經(jīng)有一些方法的具體定義梆砸,但接口就是公公只能定義各個方法的界面 转质,不能具體的實現(xiàn)代碼在成員方法中。類是子類用來繼承的帖世,當(dāng)父類已經(jīng)有實際功能的方法時該方法在子類中可以不必實現(xiàn)休蟹,直接引用父類的方法,子類也可以重寫該父類的方法日矫。實現(xiàn)接口的時候必須要實現(xiàn)接口中所有的方法赂弓,不能遺漏任何一個。
二十八:.Net與Mono的關(guān)系搬男?
mono是.net的一個開源跨平臺工具拣展,就類似Java虛擬機(jī)彭沼,java本身不是跨平臺語言缔逛,但運行在虛擬機(jī)上就能夠?qū)崿F(xiàn)了跨平臺。.net只能在windows下運行姓惑,mono可以實現(xiàn)跨平臺跑褐奴,可以運行于Linux,Unix于毙,Mac OS等敦冬。
二十九:簡述Unity3D支持的作為腳本的語言的名稱
Unity的腳本語言基于Mono的.Net平臺上運行,可以使用.NET庫唯沮,這也為XML脖旱、數(shù)據(jù)庫堪遂、正則表達(dá)式等問題提供了很好的解決方案。Unity里的腳本都會經(jīng)過編譯萌庆,他們的運行速度也很快溶褪。這三種語言實際上的功能和運行速度是一樣的,區(qū)別主要體現(xiàn)在語言特性上践险。JavaScript猿妈、 C#、Boo
三十:U3D中用于記錄節(jié)點空間幾何信息的組件名稱巍虫,及其父類名稱
Transform 父類是 Component
三十一:向量的點乘彭则、叉乘以及歸一化的意義?
1.點乘描述了兩個向量的相似程度占遥,結(jié)果越大兩向量越相似俯抖,還可表示投影
2.叉乘得到的向量垂直于原來的兩個向量
3.標(biāo)準(zhǔn)化向量:用在只關(guān)系方向,不關(guān)心大小的時候
三十二:為何大家都在移動設(shè)備上尋求U3D原生GUI的替代方案
不美觀筷频,OnGUI很耗費時間蚌成,效率不高,使用不方便
三十三:請簡述如何在不同分辨率下保持UI的一致性
NGUI很好的解決了這一點凛捏,屏幕分辨率的自適應(yīng)性担忧,原理就是計算出屏幕的寬高比跟原來的預(yù)設(shè)的屏幕分辨率求出一個對比值,然后修改攝像機(jī)的size坯癣。UGUI通過錨點和中心點和分辨率也解決這個問題
三十四:什么是LightMap瓶盛?
LightMap:就是指在三維軟件里實現(xiàn)打好光,然后渲染把場景各表面的光照輸出到貼圖上示罗,最后又通過引擎貼到場景上惩猫,這樣就使物體有了光照的感覺。
三十五:Unity和cocos2d的區(qū)別
Unity3D支持C#蚜点、javascript等轧房,cocos2d-x 支持c++、HTML5绍绘、Lua等奶镶。
cocos2d 開源 并且免費
Unity3D支持iOS、Android陪拘、Flash厂镇、Windows、Mac左刽、Wii等平臺的游戲開發(fā)捺信,cocos2d-x支持iOS、Android欠痴、WP等迄靠。
三十六:C#和C++的區(qū)別秒咨?
簡單的說:C# 與C++ 比較的話,最重要的特性就是C# 是一種完全面向?qū)ο蟮恼Z言掌挚,而C++ 不是拭荤,另外C# 是基于IL 中間語言和.NET Framework CLR 的,在可移植性疫诽,可維護(hù)性和強(qiáng)壯性都比C++ 有很大的改進(jìn)蛉威。C# 的設(shè)計目標(biāo)是用來開發(fā)快速穩(wěn)定可擴(kuò)展的應(yīng)用程序讥蔽,當(dāng)然也可以通過Interop 和Pinvoke 完成一些底層操作匠楚。更詳細(xì)的區(qū)別大家可以參考這里
三十七:結(jié)構(gòu)體和類有何區(qū)別偿乖?
結(jié)構(gòu)體是一種值類型,而類是引用類型摩钙。(值類型罢低、引用類型是根據(jù)數(shù)據(jù)存儲的角度來分的)就是值類型用于存儲數(shù)據(jù)的值,引用類型用于存儲對實際數(shù)據(jù)的引用胖笛。那么結(jié)構(gòu)體就是當(dāng)成值來使用的网持,類則通過引用來對實際數(shù)據(jù)操作
三十八:ref參數(shù)和out參數(shù)是什么?有什么區(qū)別长踊?
ref和out參數(shù)的效果一樣功舀,都是通過關(guān)鍵字找到定義在主函數(shù)里面的變量的內(nèi)存地址,并通過方法體內(nèi)的語法改變它的大小身弊。不同點就是輸出參數(shù)必須對參數(shù)進(jìn)行初始化辟汰。ref必須初始化,out 參數(shù)必須在函數(shù)里賦值阱佛。ref參數(shù)是引用帖汞,out參數(shù)為輸出參數(shù)。
三十九:C#的委托是什么凑术?有何用處翩蘸?
委托類似于一種安全的指針引用,在使用它時是當(dāng)做類來看待而不是一個方法淮逊,相當(dāng)于對一組方法的列表的引用催首。用處:使用委托使程序員可以將方法引用封裝在委托對象內(nèi)。然后可以將該委托對象傳遞給可調(diào)用所引用方法的代碼壮莹,而不必在編譯時知道將調(diào)用哪個方法翅帜。與C或C++中的函數(shù)指針不同姻檀,委托是面向?qū)ο竺沂穷愋桶踩摹?br>
四十:C#中的排序方式有哪些?
選擇排序绣版,冒泡排序胶台,快速排序歼疮,插入排序,希爾排序诈唬,歸并排序
四十一:射線檢測碰撞物的原理是韩脏?
射線是3D世界中一個點向一個方向發(fā)射的一條無終點的線,在發(fā)射軌跡中與其他物體發(fā)生碰撞時铸磅,它將停止發(fā)射 赡矢。
四十二:Unity中,照相機(jī)的Clipping Planes的作用是什么阅仔?調(diào)整Near吹散、Fare兩個值時,應(yīng)該注意什么八酒?
剪裁平面 空民。從相機(jī)到開始渲染和停止渲染之間的距離。
四十三:如何讓已經(jīng)存在的GameObject在LoadLevel后不被卸載掉羞迷?
void Awake() { DontDestroyOnLoad(transform.gameObject); } 四十四:請簡述GC(垃圾回收)產(chǎn)生的原因界轩,并描述如何避免?
GC回收堆上的內(nèi)存
避免:1.減少new產(chǎn)生對象的次數(shù)
2.使用公用的對象(靜態(tài)成員)
3.將String換為StringBuilder
四十五:反射的實現(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; } 4. Type type = assembly.GetType(“程序集.類名”);獲取當(dāng)前類的類型
Activator.CreateInstance(type); 創(chuàng)建此類型實例
MethodInfo mInfo = type.GetMethod(“方法名”);獲取當(dāng)前方法
m.Info.Invoke(null,方法參數(shù));
四十六:簡述四元數(shù)的作用热鞍,四元數(shù)對歐拉角的優(yōu)點与殃?
四元數(shù)用于表示旋轉(zhuǎn)
相對歐拉角的優(yōu)點:
1.能進(jìn)行增量旋轉(zhuǎn)
2.避免萬向鎖
3.給定方位的表達(dá)方式有兩種,互為負(fù)(歐拉角有無數(shù)種表達(dá)方式)
四十七:移動相機(jī)動作在哪個函數(shù)里碍现,為什么在這個函數(shù)里幅疼?
LateUpdate,是在所有的update結(jié)束后才調(diào)用昼接,比較適合用于命令腳本的執(zhí)行爽篷。官網(wǎng)上例子是攝像機(jī)的跟隨,都是所有的update操作完才進(jìn)行攝像機(jī)的跟進(jìn)慢睡,不然就有可能出現(xiàn)攝像機(jī)已經(jīng)推進(jìn)了逐工,但是視角里還未有角色的空幀出現(xiàn)。
四十八:GPU的工作原理
簡而言之漂辐,GPU的圖形(處理)流水線完成如下的工作:(并不一定是按照如下順序) 頂點處理:這階段GPU讀取描述3D圖形外觀的頂點數(shù)據(jù)并根據(jù)頂點數(shù)據(jù)確定3D圖形的形狀及位置關(guān)系泪喊,建立起3D圖形的骨架。在支持DX8和DX9規(guī)格的GPU中髓涯,這些工作由硬件實現(xiàn)的Vertex Shader(定點著色器)完成袒啼。 光柵化計算:顯示器實際顯示的圖像是由像素組成的,我們需要將上面生成的圖形上的點和線通過一定的算法轉(zhuǎn)換到相應(yīng)的像素點。把一個矢量圖形轉(zhuǎn)換為一系列像素點的過程就稱為光柵化蚓再。例如滑肉,一條數(shù)學(xué)表示的斜線段,最終被轉(zhuǎn)化成階梯狀的連續(xù)像素點摘仅。 紋理帖圖:頂點單元生成的多邊形只構(gòu)成了3D物體的輪廓靶庙,而紋理映射(texture mapping)工作完成對多變形表面的帖圖,通俗的說娃属,就是將多邊形的表面貼上相應(yīng)的圖片六荒,從而生成“真實”的圖形。TMU(Texture mapping unit)即是用來完成此項工作矾端。 像素處理:這階段(在對每個像素進(jìn)行光柵化處理期間)GPU完成對像素的計算和處理恬吕,從而確定每個像素的最終屬性。在支持DX8和DX9規(guī)格的GPU中须床,這些工作由硬件實現(xiàn)的Pixel Shader(像素著色器)完成铐料。 最終輸出:由ROP(光柵化引擎)最終完成像素的輸出,1幀渲染完畢后豺旬,被送到顯存幀緩沖區(qū)钠惩。
總結(jié):GPU的工作通俗的來說就是完成3D圖形的生成,將圖形映射到相應(yīng)的像素點上族阅,對每個像素進(jìn)行計算確定最終顏色并完成輸出篓跛。
四十九:什么是渲染管道?
是指在顯示器上為了顯示出圖像而經(jīng)過的一系列必要操作坦刀。 渲染管道中的很多步驟愧沟,都要將幾何物體從一個坐標(biāo)系中變換到另一個坐標(biāo)系中去。主要步驟有:
本地坐標(biāo)->視圖坐標(biāo)->背面裁剪->光照->裁剪->投影->視圖變換->光柵化
五十:如何優(yōu)化內(nèi)存鲤遥?
有很多種方式沐寺,例如
1.壓縮自帶類庫;
2.將暫時不用的以后還需要使用的物體隱藏起來而不是直接Destroy掉盖奈;
3.釋放AssetBundle占用的資源混坞;
4.降低模型的片面數(shù),降低模型的骨骼數(shù)量钢坦,降低貼圖的大芯吭小;
5.使用光照貼圖爹凹,使用多層次細(xì)節(jié)(LOD)厨诸,使用著色器(Shader),使用預(yù)設(shè)(Prefab)禾酱。
6.代碼中少產(chǎn)生臨時變量
五十一:動態(tài)加載資源的方式微酬?他們之間的區(qū)別
1.Resources.Load();
2.AssetBundle
區(qū)別參考
五十二:請描述游戲動畫有哪幾種绘趋,以及其原理?
主要有關(guān)節(jié)動畫得封、骨骼動畫、單一網(wǎng)格模型動畫(關(guān)鍵幀動畫)指郁。
關(guān)節(jié)動畫:把角色分成若干獨立部分忙上,一個部分對應(yīng)一個網(wǎng)格模型,部分的動畫連接成一個整體的動畫闲坎,角色比較靈活疫粥,Quake2中使用這種動畫;
骨骼動畫腰懂,廣泛應(yīng)用的動畫方式梗逮,集成了以上兩個方式的優(yōu)點,骨骼按角色特點組成一定的層次結(jié)構(gòu)绣溜,有關(guān)節(jié)相連慷彤,可做相對運動,皮膚作為單一網(wǎng)格蒙在骨骼之外怖喻,決定角色的外觀底哗;
單一網(wǎng)格模型動畫由一個完整的網(wǎng)格模型構(gòu)成,在動畫序列的關(guān)鍵幀里記錄各個頂點的原位置及其改變量锚沸,然后插值運算實現(xiàn)動畫效果跋选,角色動畫較真實。
五十三:alpha blend工作原理
Alpha Blend 實現(xiàn)透明效果哗蜈,不過只能針對某塊區(qū)域進(jìn)行alpha操作前标,透明度可設(shè)。
五十四:寫出光照計算中的diffuse的計算公式
diffuse = Kd x colorLight x max(NL,0)距潘;Kd 漫反射系數(shù)炼列、colorLight 光的顏色、N 單位法線向量音比、L 由點指向光源的單位向量唯鸭、其中N與L點乘,如果結(jié)果小于等于0硅确,則漫反射為0目溉。
五十五:兩種陰影判斷的方法、工作原理菱农。
本影和半影:參考本影和半影
本影:景物表面上那些沒有被光源直接照射的區(qū)域(全黑的輪廓分明的區(qū)域)缭付。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的區(qū)域(半明半暗區(qū)域)
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面循未,再將這些投影面與場景中的其他平面求交得出陰影多邊形陷猫,保存這些陰影多邊形信息秫舌,然后再按視點位置對場景進(jìn)行相應(yīng)處理得到所要求的視圖(利用空間換時間,每次只需依據(jù)視點位置進(jìn)行一次陰影計算即可绣檬,省去了一次消隱過程)
五十六: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幾個過程。
五十七:下列代碼在運行中會產(chǎn)生幾個臨時對象平夜?
string a = new string(“abc”); a = (a.ToUpper() + “123”).Substring(0, 2); 在C#中第一行是會報錯的(Java中倒是可行)蝶棋。
應(yīng)該這樣初始化:
string b = new string(new char[]{‘a(chǎn)’,’b’,’c’}); 答案為:5個臨時對象
五十八:下列代碼在運行中會發(fā)生什么問題?如何避免忽妒?
List ls = new List(new int[] { 1, 2, 3, 4, 5 }); foreach (int item in ls) { Console.WriteLine(item * item); ls.Remove(item); } 產(chǎn)生運行時錯誤玩裙,在 ls.Remove(item)這行,因為foreach是只讀的段直。不能一邊遍歷一邊修改献酗。
五十九:Unity3D是否支持寫成多線程程序?如果支持的話需要注意什么坷牛?
僅能從主線程中訪問Unity3D的組件罕偎,對象和Unity3D系統(tǒng)調(diào)用
支持:如果同時你要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。
注意:C#中有l(wèi)ock這個關(guān)鍵字,以確保只有一個線程可以在特定時間內(nèi)訪問特定的對象
六十:Unity3D的協(xié)程和C#線程之間的區(qū)別是什么京闰?
多線程程序同時運行多個線程 颜及,而在任一指定時刻只有一個協(xié)程在運行,并且這個正在運行的協(xié)同程序只在必要時才被掛起蹂楣。除主線程之外的線程無法訪問Unity3D的對象俏站、組件、方法痊土。
Unity3d沒有多線程的概念肄扎,不過unity也給我們提供了StartCoroutine(協(xié)同程序)和LoadLevelAsync(異步加載關(guān)卡)后臺加載場景的方法。 StartCoroutine為什么叫協(xié)同程序呢赁酝,所謂協(xié)同犯祠,就是當(dāng)你在StartCoroutine的函數(shù)體里處理一段代碼時,利用yield語句等待執(zhí)行結(jié)果酌呆,這期間不影響主程序的繼續(xù)執(zhí)行衡载,可以協(xié)同工作。
六十一:矩陣相乘的意義及注意點
用于表示線性變換:旋轉(zhuǎn)隙袁、縮放痰娱、投影弃榨、平移、仿射
注意矩陣的蠕變:誤差的積累
六十二:為什么dynamic font在unicode環(huán)境下優(yōu)于static font
Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案梨睁。
使用動態(tài)字體時鲸睛,Unity將不會預(yù)先生成一個與所有字體的字符紋理。當(dāng)需要支持亞洲語言或者較大的字體的時候坡贺,若使用正常紋理官辈,則字體的紋理將非常大。
六十三:當(dāng)一個細(xì)小的高速物體撞向另一個較大的物體時拴念,會出現(xiàn)什么情況钧萍?如何避免褐缠?
穿透(碰撞檢測失斦蟆)
六十四:請簡述OnBecameVisible及OnBecameInvisible的發(fā)生時機(jī),以及這一對回調(diào)函數(shù)的意義队魏?
當(dāng)物體是否可見切換之時公般。可以用于只需要在物體可見時才進(jìn)行的計算胡桨。
六十五:什么叫動態(tài)合批官帘?跟靜態(tài)合批有什么區(qū)別?
如果動態(tài)物體共用著相同的材質(zhì)昧谊,那么Unity會自動對這些物體進(jìn)行批處理刽虹。動態(tài)批處理操作是自動完成的,并不需要你進(jìn)行額外的操作呢诬。
區(qū)別:動態(tài)批處理一切都是自動的涌哲,不需要做任何操作,而且物體是可以移動的尚镰,但是限制很多阀圾。靜態(tài)批處理:自由度很高,限制很少狗唉,缺點可能會占用更多的內(nèi)存初烘,而且經(jīng)過靜態(tài)批處理后的所有物體都不可以再移動了。
參考
六十六:簡述StringBuilder和String的區(qū)別分俯?
String是字符串常量肾筐。
StringBuffer是字符串變量 ,線程安全缸剪。
StringBuilder是字符串變量局齿,線程不安全。
String類型是個不可變的對象橄登,當(dāng)每次對String進(jìn)行改變時都需要生成一個新的String對象抓歼,然后將指針指向一個新的對象讥此,如果在一個循環(huán)里面,不斷的改變一個對象谣妻,就要不斷的生成新的對象萄喳,所以效率很低,建議在不斷更改String對象的地方不要使用String類型蹋半。
StringBuilder對象在做字符串連接操作時是在原來的字符串上進(jìn)行修改他巨,改善了性能。這一點我們平時使用中也許都知道减江,連接操作頻繁的時候染突,使用StringBuilder對象。
六十七:Unity3D Shader分哪幾種辈灼,有什么區(qū)別份企?
表面著色器的抽象層次比較高,它可以輕松地以簡潔方式實現(xiàn)復(fù)雜著色巡莹。表面著色器可同時在前向渲染及延遲渲染模式下正常工作司志。
頂點片段著色器可以非常靈活地實現(xiàn)需要的效果,但是需要編寫更多的代碼降宅,并且很難與Unity的渲染管線完美集成骂远。
固定功能管線著色器可以作為前兩種著色器的備用選擇,當(dāng)硬件無法運行那些酷炫Shader的時腰根,還可以通過固定功能管線著色器來繪制出一些基本的內(nèi)容激才。
六十八:已知strcpy函數(shù)的原型是:char * strcpy(char * strDest,const char * strSrc); 1.不調(diào)用庫函數(shù),實現(xiàn)strcpy函數(shù)额嘿。2.解釋為什么要返回char *
char * strcpy(char * strDest,const char * strSrc) { if ((strDest==NULL)||(strSrc==NULL)) throw “Invalid argument(s)”; char * strDestCopy=strDest; while ((strDest++=*strSrc++)!=’\0’); return strDestCopy; } 六十九:C#中四種訪問修飾符是哪些瘸恼?各有什么區(qū)別?
1.屬性修飾符 2.存取修飾符 3.類修飾符 4.成員修飾符岩睁。
屬性修飾符:
Serializable:按值將對象封送到遠(yuǎn)程服務(wù)器钞脂。
STATread:是單線程套間的意思,是一種線程模型捕儒。
MATAThread:是多線程套間的意思冰啃,也是一種線程模型。
存取修飾符:
public:存取不受限制刘莹。
private:只有包含該成員的類可以存取阎毅。
internal:只有當(dāng)前工程可以存取。
protected:只有包含該成員的類以及派生類可以存取点弯。
類修飾符:
abstract:抽象類扇调。指示一個類只能作為其它類的基類。
sealed:密封類抢肛。指示一個類不能被繼承狼钮。理所當(dāng)然碳柱,密封類不能同時又是抽象類,因為抽象總是希望被繼承的熬芜。
成員修飾符:
abstract:指示該方法或?qū)傩詻]有實現(xiàn)莲镣。
sealed:密封方法∠牙可以防止在派生類中對該方法的override(重載)瑞侮。不是類的每個成員方法都可以作為密封方法密封方法,必須對基類的虛方法進(jìn)行重載鼓拧,提供具體的實現(xiàn)方法半火。所以,在方法的聲明中季俩,sealed修飾符總是和override修飾符同時使用钮糖。
delegate:委托。用來定義一個函數(shù)指針种玛。C#中的事件驅(qū)動是基于delegate + event的藐鹤。
const:指定該成員的值只讀不允許修改瓤檐。
event:聲明一個事件赂韵。
extern:指示方法在外部實現(xiàn)。
override:重寫挠蛉。對由基類繼承成員的新實現(xiàn)祭示。
readonly:指示一個域只能在聲明時以及相同類的內(nèi)部被賦值。
static:指示一個成員屬于類型本身谴古,而不是屬于特定的對象质涛。即在定義后可不經(jīng)實例化,就可使用掰担。
virtual:指示一個方法或存取器的實現(xiàn)可以在繼承類中被覆蓋汇陆。
new:在派生類中隱藏指定的基類成員,從而實現(xiàn)重寫的功能带饱。 若要隱藏繼承類的成員毡代,請使用相同名稱在派生類中聲明該成員,并用 new 修飾符修飾它勺疼。
七十:Heap與Stack有何區(qū)別教寂?
1.heap是堆,stack是棧执庐。
2.stack的空間由操作系統(tǒng)自動分配和釋放酪耕,heap的空間是手動申請和釋放的,heap常用new關(guān)鍵字來分配轨淌。
3.stack空間有限迂烁,heap的空間是很大的自由區(qū)看尼。
七十一:值類型和引用類型有何區(qū)別?
1.值類型的數(shù)據(jù)存儲在內(nèi)存的棧中盟步;引用類型的數(shù)據(jù)存儲在內(nèi)存的堆中狡忙,而內(nèi)存單元中只存放堆中對象的地址。
2.值類型存取速度快址芯,引用類型存取速度慢灾茁。
3.值類型表示實際數(shù)據(jù),引用類型表示指向存儲在內(nèi)存堆中的數(shù)據(jù)的指針或引用
4.值類型繼承自System.ValueType谷炸,引用類型繼承自System.Object
5.棧的內(nèi)存分配是自動釋放北专;而堆在.NET中會有GC來釋放
6.值類型的變量直接存放實際的數(shù)據(jù),而引用類型的變量存放的則是數(shù)據(jù)的地址旬陡,即對象的引用拓颓。
七十二:請寫出求斐波那契數(shù)列任意一位的值得算法
遞歸實現(xiàn):
int Fib1(int index) { if(index<1) { return -1; } if(index==1|| index==2) { return 1; } return Fib1(index-1)+Fib1(index-2); } 迭代實現(xiàn):
int Fib5(int index) { if(index<1) { return -1; } int a1 - 1, a2 = 1, a3 = 1; for(int i = 0; i < index - 2; i++) { a3=a1+a2; a1=a2; a2=a3; } return a3; } 參看更多實現(xiàn)方法
七十三:協(xié)同程序的執(zhí)行代碼是什么?有何用處描孟,有何缺點驶睦?
function Start() { // 協(xié)同程序WaitAndPrint在Start函數(shù)內(nèi)執(zhí)行,可以視同于它與Start函數(shù)同步執(zhí)行. StartCoroutine(WaitAndPrint(2.0)); print (“Before WaitAndPrint Finishes ” + Time.time ); } function WaitAndPrint (waitTime : float) { // 暫停執(zhí)行waitTime秒 yield WaitForSeconds (waitTime); print (“WaitAndPrint “+ Time.time ); }
作用:一個協(xié)同程序在執(zhí)行過程中,可以在任意位置使用yield語句。yield的返回值控制何時恢復(fù)協(xié)同程序向下執(zhí)行匿醒。協(xié)同程序在對象自有幀執(zhí)行過程中堪稱優(yōu)秀场航。協(xié)同程序在性能上沒有更多的開銷。
缺點:協(xié)同程序并非真線程廉羔,可能會發(fā)生堵塞溉痢。
七十四:什么是里氏代換元則?
里氏替換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計的基本原則之一憋他。通俗點:就是子類對象可以賦值給基類對象孩饼,基類對象不能賦值給子類對象
參考
七十五:Mock和Stub有何區(qū)別?
Mock與Stub的區(qū)別:Mock:關(guān)注行為驗證竹挡。細(xì)粒度的測試镀娶,即代碼的邏輯,多數(shù)情況下用于單元測試揪罕。Stub:關(guān)注狀態(tài)驗證梯码。粗粒度的測試,在某個依賴系統(tǒng)不存在或者還沒實現(xiàn)或者難以測試的情況下使用耸序,例如訪問文件系統(tǒng)忍些,數(shù)據(jù)庫連接,遠(yuǎn)程協(xié)議等坎怪。
七十六:概述序列化:
序列化簡單理解成把對象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^程罢坝。比如,可以序列化一個對象,然后使用HTTP通過Internet在客戶端和服務(wù)器端之間傳輸該對象
七十七:堆和棧的區(qū)別嘁酿?
棧通常保存著我們代碼執(zhí)行的步驟隙券,如在代碼段1中 AddFive()方法,int pValue變量闹司,int result變量等等娱仔。而堆上存放的則多是對象,數(shù)據(jù)等游桩。我們可以把棧想象成一個接著一個疊放在一起的盒子牲迫。當(dāng)我們使用的時候,每次從最頂部取走一個盒子借卧。棧也是如此盹憎,當(dāng)一個方法(或類型)被調(diào)用完成的時候,就從棧頂取走铐刘,接著下一個陪每。堆則不然,像是一個倉庫镰吵,儲存著我們使用的各種對象等信息檩禾,跟棧不同的是他們被調(diào)用完畢不會立即被清理掉。
七十八:概述c#中代理和事件疤祭?
代理就是用來定義指向方法的引用盼产。
C#事件本質(zhì)就是對消息的封裝,用作對象之間的通信画株;發(fā)送方叫事件發(fā)送器辆飘,接收方叫事件接收器
七十九:客戶端與服務(wù)器交互方式有幾種啦辐?
socket通常也稱作”套接字”,實現(xiàn)服務(wù)器和客戶端之間的物理連接谓传,并進(jìn)行數(shù)據(jù)傳輸,主要有UDP和TCP兩個協(xié)議芹关。Socket處于網(wǎng)絡(luò)協(xié)議的傳輸層续挟。
http協(xié)議傳輸?shù)闹饕衕ttp協(xié)議 和基于http協(xié)議的Soap協(xié)議(web service),常見的方式是 http 的post 和get 請求,web 服務(wù)侥衬。
八十:Unity和Android與iOS如何交互诗祸?
Unity可以到處Android和iOS的工程,然后通過安卓或者iOS的類去給Unity發(fā)消息轴总,調(diào)用Unity中的方法
八十一:如何在Unity3D中查看場景的面試直颅,頂點數(shù)和Draw Call數(shù)?如何降低Draw Call數(shù)怀樟?
在Game視圖右上角點擊Stats功偿。降低Draw Call 的技術(shù)是Draw Call Batching
這個在5.0以后在window-》Profiler下面,快捷鍵是cmd + 7(ctl + 7
八十二:請問alpha test在何時使用往堡?能達(dá)到什么效果械荷?
Alpha Test ,中文就是透明度測試共耍。簡而言之就是V&F shader中最后fragment函數(shù)輸出的該點顏色值(即上一講frag的輸出half4)的alpha值與固定值進(jìn)行比較。AlphaTest語句通常于Pass{}中的起始位置吨瞎。Alpha Test產(chǎn)生的效果也很極端痹兜,要么完全透明,即看不到颤诀,要么完全不透明字旭。
八十三:UNITY3d在移動設(shè)備上的一些優(yōu)化資源的方法
1.使用assetbundle,實現(xiàn)資源分離和共享崖叫,將內(nèi)存控制到200m之內(nèi)谐算,同時也可以實現(xiàn)資源的在線更新
2.頂點數(shù)對渲染無論是cpu還是gpu都是壓力最大的貢獻(xiàn)者,降低頂點數(shù)到8萬以下归露,fps穩(wěn)定到了30幀左右
3.只使用一盞動態(tài)光洲脂,不是用陰影,不使用光照探頭
粒子系統(tǒng)是cpu上的大頭
4.剪裁粒子系統(tǒng)
5.合并同時出現(xiàn)的粒子系統(tǒng)
6.自己實現(xiàn)輕量級的粒子系統(tǒng)
animator也是一個效率奇差的地方
7.把不需要跟骨骼動畫和動作過渡的地方全部使用animation剧包,控制骨骼數(shù)量在30根以下
8.animator出視野不更新
9.刪除無意義的animator
10.animator的初始化很耗時(粒子上能不能盡量不用animator)
11.除主角外都不要跟骨骼運動apply root motion
12.絕對禁止掉那些不帶剛體帶包圍盒的物體(static collider )運動
NUGI的代碼效率很差恐锦,基本上runtime的時候?qū)pu的貢獻(xiàn)和render不相上下
13每幀遞歸的計算finalalpha改為只有初始化和變動時計算
14去掉法線計算
15不要每幀計算viewsize 和windowsize
16filldrawcall時構(gòu)建頂點緩存使用array.copy
17.代碼剪裁:使用strip level ,使用.net2.0 subset
18.盡量減少smooth group
19.給美術(shù)定一個嚴(yán)格的經(jīng)過科學(xué)驗證的美術(shù)標(biāo)準(zhǔn)疆液,并在U3D里面配以相應(yīng)的檢查工具
八十四:四元數(shù)有什么作用一铅?
對旋轉(zhuǎn)角度進(jìn)行計算時用到四元數(shù)
八十五:將Camera組件的ClearFlags選項選成Depth only是什么意思?有何用處堕油?
如果把攝像機(jī)的ClearFlags勾選為Deapth Only,那么攝像機(jī)就會只渲染看得見的對象潘飘,把背景會完全透明,這種情況一般用在兩個攝像機(jī)以上的場景中
八十六:在編輯場景時將GameObject設(shè)置為Static有何作用掉缺?
設(shè)置游戲?qū)ο鬄镾tatic時卜录,這些部分被靜態(tài)物體擋住而不可見時,將會剔除(或禁用)網(wǎng)格對象眶明。因此艰毒,在你的場景中的所有不會動的物體都應(yīng)該標(biāo)記為Static。
八十七:有A和B兩組物體搜囱,有什么辦法能夠保證A組物體永遠(yuǎn)比B組物體先渲染丑瞧?
把A組物體的渲染對列大于B物體的渲染隊列,通過shader里面的渲染隊列來渲染
八十八:將圖片的TextureType選項分別選為““Texture”和“Sprite”有什么區(qū)別
Sprite作為UI精靈使用蜀肘,Texture作用模型貼圖使用绊汹。Sprite需要2的整次冪,打包圖片省資源
八十九:問一個Terrain扮宠,分別貼3張西乖,4張,5張地表貼圖,渲染速度有什么區(qū)別浴栽?為什么荒叼?
沒有區(qū)別,因為不管幾張貼圖只渲染一次典鸡。
九十:什么是DrawCall被廓?DrawCall高了又什么影響?如何降低DrawCall萝玷?
Unity中嫁乘,每次引擎準(zhǔn)備數(shù)據(jù)并通知GPU的過程稱為一次Draw Call。DrawCall越高對顯卡的消耗就越大球碉。降低DrawCall的方法:
Dynamic Batching
Static Batching
高級特性Shader降級為統(tǒng)一的低級特性的Shader蜓斧。
九十一:實時點光源的優(yōu)缺點是什么?
可以有cookies – 帶有 alpha通道的立方圖(Cubemap )紋理睁冬。點光源是最耗費資源的挎春。
九十二:Unity的Shader中,Blend SrcAlpha OneMinusSrcAlpha這句話是什么意思豆拨?
作用就是Alpha混合直奋。公式:最終顏色 = 源顏色 x 源透明值 + 目標(biāo)顏色 x(1 - 源透明值)
九十三:簡述水面倒影的渲染原理
原理就是對水面的貼圖紋理進(jìn)行擾動,以產(chǎn)生波光玲玲的效果施禾。用shader可以通過GPU在像素級別作擾動脚线,效果細(xì)膩,需要的頂點少弥搞,速度快
九十四:簡述NGUI中Grid和Table的作用邮绿?
對Grid和Table下的子物體進(jìn)行排序和定位
九十五:請簡述NGUI中Panel和Anchor的作用
只要提供一個half-pixel偏移量,它可以讓一個控件的位置在Windows系統(tǒng)上精確的顯示出來(只有這個Anchor的子控件會受到影響)
如果掛載到一個對象上攀例,那么他可以將這個對象依附到屏幕的角落或者邊緣
3.UIPanel用來收集和管理它下面所有widget的組件船逮。通過widget的geometry創(chuàng)建實際的draw call。沒有panel所有東西都不能夠被渲染出來,你可以把UIPanel當(dāng)做Renderer
九十六:能用foreach遍歷訪問的對象需要實現(xiàn)接口或聲明___方法的類型
IEnumerable肛度;GetEnumerator