一:什么是協(xié)同程序竖般?
答:在主線程運行時同時開啟另一段邏輯處理甚垦,來協(xié)助當前程序的執(zhí)行。換句話說涣雕,開啟協(xié)程就是開啟一個可以與程序并行的邏輯艰亮。可以用來控制運動挣郭、序列以及對象的行為迄埃。
二:Unity3d中的碰撞器和觸發(fā)器的區(qū)別?
答:碰撞器是觸發(fā)器的載體兑障,而觸發(fā)器只是碰撞器身上的一個屬性调俘。
當Is Trigger=false時,碰撞器根據(jù)物理引擎引發(fā)碰撞旺垒,產(chǎn)生碰撞的效果彩库,可以調(diào)用OnCollisionEnter/Stay/Exit函數(shù);
當Is Trigger=true時先蒋,碰撞器被物理引擎所忽略骇钦,沒有碰撞效果,可以調(diào)用OnTriggerEnter/Stay/Exit函數(shù)竞漾。
如果既要檢測到物體的接觸又不想讓碰撞檢測影響物體移動或要檢測一個物件是否經(jīng)過空間中的某個區(qū)域這時就可以用到觸發(fā)器
三:物體發(fā)生碰撞的必要條件
答:兩個物體都必須帶有碰撞器Collider眯搭,其中一個物體還必須帶有Rigidbody剛體窥翩。
四:請簡述ArrayList和List<Int>的主要區(qū)別
答:
ArrayList存在不安全類型
- ArrayList會把所有插入其中的數(shù)據(jù)都當做Object來處理
- 裝箱拆箱的操作
. net 2.0后不使用ArrayList,用List<Object>替代
IList是接口鳞仙,ArrayList是一個實現(xiàn)了該接口的類寇蚊,可以被實例化
五:請簡述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)步驟:
導入using System.Reflection;
Assembly.Load("程序集");//加載程序集,返回類型是一個Assembly
得到程序集中所有類的名稱foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}Type type = assembly.GetType("程序集.類名");//獲取當前類的類型
Activator.CreateInstance(type); //創(chuàng)建此類型實例
MethodInfo mInfo = type.GetMethod("方法名");//獲取當前方法
mInfo.Invoke(null,方法參數(shù));
七:簡述四元數(shù)Quaternion的作用借笙,四元數(shù)對歐拉角的優(yōu)點扒怖?
答:四元數(shù)用于表示旋轉(zhuǎn)
相對歐拉角的優(yōu)點:
- 能進行增量旋轉(zhuǎn)
- 避免萬向鎖
- 給定方位的表達方式有兩種,互為負(歐拉角有無數(shù)種表達方式)
八:如何安全的在不同工程間安全地遷移asset數(shù)據(jù)业稼?三種方法
答:
1.將Assets和Library一起遷移
2.導出包package
3.用unity自帶的assets Server功能
九:OnEnable盗痒、Awake、Start運行時的發(fā)生順序低散?哪些可能在同一個對象周期中反復的發(fā)生俯邓?
答:Awake–>OnEnable->Start OnEnable在同一周期中可以反復地發(fā)生!
十:MeshRender中material和sharedmaterial的區(qū)別?
答:
修改sharedMaterial將改變所有物體使用這個材質(zhì)的外觀熔号,并且也改變儲存在工程里的材質(zhì)設(shè)置稽鞭。
不推薦修改由sharedMaterial返回的材質(zhì)。如果你想修改渲染器的材質(zhì)跨嘉,使用material替代川慌。
十一:請簡述ArrayList和List之間的主要區(qū)別吃嘿。
答:
ArrayList的定義
ArrayList是動態(tài)數(shù)組祠乃,是Array的復雜版本,它提供了動態(tài)添加和減少元素兑燥,實現(xiàn)了ICollection和IList接口亮瓷,可以靈活設(shè)置數(shù)組的大小。
ArrayList的特點
(1)ArrayList數(shù)組的長度可以動態(tài)指定降瞳,其大小可以在初始化時指定嘱支,也可以不指定,因此其在托管堆上存放并不一定連續(xù)挣饥。
(2)ArrayList數(shù)據(jù)可以存放不同類型數(shù)據(jù)(因為它里面存放的都是被裝箱了的Object類型除师,實際上ArrayList內(nèi)部就是使用"object[] _items;"這樣一個私有字段來封裝對象的)。
(3)ArrayList可以在任意位置插入或刪除數(shù)項扔枫。
ArrayList的優(yōu)缺點
優(yōu)點:
(1)初始化時可以不指定長度汛聚,并且可以動態(tài)插入或刪除項,其長度可以動態(tài)擴充和收縮短荐。
(2)存放的數(shù)據(jù)類型可以是不同類型的數(shù)據(jù)倚舀。
缺點:
(1)ArrayList不是類型安全的叹哭,其插入的數(shù)據(jù)當做Object類型處理,因此在處理數(shù)據(jù)是可能會報類型不匹配錯誤痕貌。
(2)由于存在裝箱和拆箱操作风罩,會帶來很大的性能損耗,所以存取效率低舵稠。
List的定義
List是ArrayList的范型等效類超升,List類也繼承了IList接口,其大部分用法與ArrayList相似柱查,最關(guān)鍵的區(qū)別是唉工,在聲明List集合時需要為其聲明List集合內(nèi)數(shù)據(jù)的對象類型,往List中插入其它(非聲明數(shù)據(jù)類型)數(shù)據(jù)類型元素時將會報錯淋硝,因此其是類型安全的雹熬。
數(shù)組結(jié)構(gòu)的特點:
(1)聲明時必須指定數(shù)據(jù)集內(nèi)元素的數(shù)據(jù)類型竿报,且數(shù)據(jù)元素類型必須相同。
(2)可以動態(tài)插入或刪除數(shù)據(jù)元素继谚。
(3)數(shù)據(jù)操作是類型安全的且不存在裝箱和拆箱操作烈菌,因此效率較高芽世。
十二:TCP/IP協(xié)議棧各個層次及分別的功能
答:網(wǎng)絡(luò)接口層:這是協(xié)議棧的最低層,對應(yīng)OSI的物理層和數(shù)據(jù)鏈路層棵帽,主要完成數(shù)據(jù)幀的實際發(fā)送和接收。
網(wǎng)絡(luò)層:處理分組在網(wǎng)絡(luò)中的活動夺克,例如路由選擇和轉(zhuǎn)發(fā)等铺纽,這一層主要包括IP協(xié)議、ARP雕崩、ICMP協(xié)議等盼铁。
傳輸層:主要功能是提供應(yīng)用程序之間的通信饶火,這一層主要是TCP/UDP協(xié)議。
應(yīng)用層:用來處理特定的應(yīng)用当辐,針對不同的應(yīng)用提供了不同的協(xié)議缘揪,例如進行文件傳輸時用到的FTP協(xié)議找筝,發(fā)送email用到的SMTP等。
十三題:Unity提供了幾種光源慷吊,分別是什么
答:
四種袖裕。
平行光:Directional Light
點光源:Point Light
聚光燈:Spot Light
區(qū)域光源:Area Light
十四:簡述一下對象池急鳄,你覺得在FPS里哪些東西適合使用對象池疾宏?
對象池就存放需要被反復調(diào)用資源的一個空間灾锯,比如游戲中要常被大量復制的對象,子彈凌那,敵人吟逝,以及任何重復出現(xiàn)的對象块攒。
十五:CharacterController和Rigidbody的區(qū)別?
Rigidbody具有完全真實物理的特性趣避,而CharacterController可以說是受限的的Rigidbody程帕,具有一定的物理效果但不是完全真實的愁拭。
十六:移動相機動作在哪個函數(shù)里岭埠,為什么在這個函數(shù)里枫攀?
LateUpdate株茶,是在所有的Update結(jié)束后才調(diào)用启盛,比較適合用于命令腳本的執(zhí)行僵闯。官網(wǎng)上例子是攝像機的跟隨鳖粟,都是所有的Update操作完才進行攝像機的跟進向图,不然就有可能出現(xiàn)攝像機已經(jīng)推進了榄攀,但是視角里還未有角色的空幀出現(xiàn)。
十七:簡述prefab的用處
在游戲運行時實例化吕嘀,prefab相當于一個模板偶房,對你已經(jīng)有的素材棕洋、腳本拍冠、參數(shù)做一個默認的配置庆杜,以便于以后的修改晃财,同事prefab打包的內(nèi)容簡化了導出的操作断盛,便于團隊的交流。
十八:請簡述sealed關(guān)鍵字用在類聲明時與函數(shù)聲明時的作用。
答:類聲明時可防止其他類繼承此類命迈,在方法中聲明則可防止派生類重寫此方法壶愤。
十九:請簡述private征椒,public勃救,protected剪芥,internal的區(qū)別税肪。
public:對任何類和成員都公開益兄,無限制訪問
private:僅對該類公開
protected:對該類和其派生類公開
internal:只能在包含該類的程序集中訪問該類
protected internal:protected + internal
二十:簡述SkinnedMesh的實現(xiàn)原理
答:Skinned Mesh中文一般稱作骨骼蒙皮動畫净捅,正如其名蛔六,這種動畫中包含骨骼(Bone)和蒙皮(Skinned Mesh)兩個部分国章,Bone的層次結(jié)構(gòu)和關(guān)節(jié)動畫類似液兽,Mesh則和關(guān)節(jié)動畫不同:關(guān)節(jié)動畫中是使用多個分散的Mesh,而Skinned Mesh中Mesh是一個整體四啰,也就是說只有一個Mesh,實際上如果沒有骨骼讓Mesh運動變形柑晒,Mesh就和靜態(tài)模型一樣了匙赞。Skinned Mesh技術(shù)的精華在于蒙皮罚屋,所謂的皮并不是模型的貼圖(也許會有人這么想過吧)脾猛,而是Mesh本身猛拴,蒙皮是指將Mesh中的頂點附著(綁定)在骨骼之上愉昆,而且每個頂點可以被多個骨骼所控制跛溉,這樣在關(guān)節(jié)處的頂點由于同時受到父子骨骼的拉扯而改變位置就消除了裂縫扮授。Skinned Mesh這個詞從字面上理解似乎是有皮的模型,哦荔仁,如果貼圖是皮乏梁,那么普通靜態(tài)模型不也都有嗎掌呜?所以我覺得應(yīng)該理解為具有蒙皮信息的Mesh或可當做皮膚用的Mesh坪哄,這個皮膚就是Mesh翩肌。而為了有皮膚功能念祭,Mesh還需要蒙皮信息粱坤,即Skin數(shù)據(jù)站玄,沒有Skin數(shù)據(jù)就是一個普通的靜態(tài)Mesh了株旷。Skin數(shù)據(jù)決定頂點如何綁定到骨骼上锉矢。頂點的Skin數(shù)據(jù)包括頂點受哪些骨骼影響以及這些骨骼影響該頂點時的權(quán)重(weight)沽损,另外對于每塊骨骼還需要骨骼偏移矩陣(BoneOffsetMatrix)用來將頂點從Mesh空間變換到骨骼空間绵估。骨骼動畫中的Mesh特指這個皮膚Mesh壹士,模型是指骨骼動畫模型整體躏救。骨骼控制蒙皮運動盒使,而骨骼本身的運動呢少办?當然是動畫數(shù)據(jù)了英妓。每個關(guān)鍵幀中包含時間和骨骼運動信息蔓纠,運動信息可以用一個矩陣直接表示骨骼新的變換腿倚,也可用四元數(shù)表示骨骼的旋轉(zhuǎn)敷燎,也可以隨便自己定義什么只要能讓骨骼動就行硬贯。除了使用編輯設(shè)定好的動畫幀數(shù)據(jù)澄成,也可以使用物理計算對骨骼進行實時控制墨状。
二十一: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ù)學表示的斜線段貌踏,最終被轉(zhuǎn)化成階梯狀的連續(xù)像素點祖乳。
紋理帖圖:頂點單元生成的多邊形只構(gòu)成了3D物體的輪廓眷昆,而紋理映射(texture mapping)工作完成對多變形表面的帖圖亚斋,通俗的說帅刊,就是將多邊形的表面貼上相應(yīng)的圖片女揭,從而生成“真實”的圖形吧兔。TMU(Texture mapping unit)即是用來完成此項工作境蔼。
像素處理:這階段(在對每個像素進行光柵化處理期間)GPU完成對像素的計算和處理欧穴,從而確定每個像素的最終屬性。在支持DX8和DX9規(guī)格的GPU中调缨,這些工作由硬件實現(xiàn)的Pixel Shader(像素著色器)完成弦叶。
最終輸出:由ROP(光柵化引擎)最終完成像素的輸出伤哺,1幀渲染完畢后立莉,被送到顯存幀緩沖區(qū)。
總結(jié):GPU的工作通俗的來說就是完成3D圖形的生成刹淌,將圖形映射到相應(yīng)的像素點上有勾,對每個像素進行計算確定最終顏色并完成輸出蔼卡。
二十二:什么是渲染管道贷祈?
答:是指在顯示器上為了顯示出圖像而經(jīng)過的一系列必要操作势誊。 渲染管道中的很多步驟粟耻,都要將幾何物體從一個坐標系中變換到另一個坐標系中去。
主要步驟有:
本地坐標->視圖坐標->背面裁剪->光照->裁剪->投影->視圖變換->光柵化册烈。
二十三:如何優(yōu)化內(nèi)存赏僧?
答:有很多種方式,例如
1.壓縮自帶類庫驾中;
2.將暫時不用的以后還需要使用的物體隱藏起來而不是直接Destroy掉肩民;
3.釋放AssetBundle占用的資源此改;
4.降低模型的片面數(shù),降低模型的骨骼數(shù)量移剪,降低貼圖的大凶菘痢攻人;
5.使用光照貼圖瞬浓,使用多層次細節(jié)(LOD),使用著色器(Shader)蓬坡,使用預(yù)設(shè)(Prefab)猿棉。
二十四:動態(tài)加載資源的方式?
1.Resources.Load();
2.AssetBundle Unity5.1版本后可以選擇使用Git: https://github.com/applexiaohao/LOAssetFramework.git
二十五:你用過哪些插件?
二十六: 使用Unity3d實現(xiàn)2d游戲屑咳,有幾種方式萨赁?
答:
1.使用本身的GUI兆龙、UGUI
2.把攝像機的Projection(投影)值調(diào)為Orthographic(正交投影)杖爽,不考慮z軸;
3.使用2d插件详瑞,如:2DToolKit掂林、NGUI
二十七:在物體發(fā)生碰撞的整個過程中臣缀,有幾個階段坝橡,分別列出對應(yīng)的函數(shù) 三個階段
答:
- OnCollisionEnter
- OnCollisionStay
- OnCollisionExit
二十八:Unity3d的物理引擎中,有幾種施加力的方式精置,分別描述出來
答:
- rigidbody.AddForce
- rigidbody.AddForceAtPosition
二十九:什么叫做鏈條關(guān)節(jié)计寇?
答:Hinge Joint,可以模擬兩個物體間用一根鏈條連接在一起的情況脂倦,能保持兩個物體在一個固定距離內(nèi)部相互移動而不產(chǎn)生作用力番宁,但是達到固定距離后就會產(chǎn)生拉力。
三十:物體自身旋轉(zhuǎn)使用的函數(shù)赖阻?
答: Transform.Rotate()
三十一:Unity3d提供了一個用于保存和讀取數(shù)據(jù)的類(PlayerPrefs)蝶押,請列出保存和讀取整形數(shù)據(jù)的函數(shù)
答:
- PlayerPrefs.SetInt()
- PlayerPrefs.GetInt()
三十二:Unity3d腳本從喚醒到銷毀有著一套比較完整的生命周期,請列出系統(tǒng)自帶的幾個重要的方法火欧。
答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
三十三:物理更新一般放在哪個系統(tǒng)函數(shù)里棋电?
答:
FixedUpdate,每固定幀繪制時執(zhí)行一次苇侵,和Update不同的是FixedUpdate是渲染幀執(zhí)行赶盔,如果你的渲染效率低下的時候FixedUpdate調(diào)用次數(shù)就會跟著下降。
- FixedUpdate比較適用于物理引擎的計算榆浓,因為是跟每幀渲染有關(guān)于未。
- Update就比較適合做控制。
三十四:在場景中放置多個Camera并同時處于活動狀態(tài)會發(fā)生什么?
答:游戲界面可以看到很多攝像機的混合烘浦。
三十五:如何銷毀一個UnityEngine.Object及其子類抖坪?
答: 使用Destroy()方法;
三十六:請描述游戲動畫有哪幾種,以及其原理闷叉?
答:主要有關(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)動畫效果禽绪,角色動畫較真實。
三十七:請描述為什么Unity3d中會發(fā)生在組件上出現(xiàn)數(shù)據(jù)丟失的情況
答: 一般是組件上綁定的物體對象被刪除了
三十八:alpha blend工作原理
答:Alpha Blend 實現(xiàn)透明效果洪规,不過只能針對某塊區(qū)域進行alpha操作印屁,透明度可設(shè)。
三十九:寫出光照計算中的diffuse的計算公式
答:diffuse = Kd x colorLight x max(N*L,0)斩例;Kd 漫反射系數(shù)雄人、colorLight 光的顏色、N 單位法線向量念赶、L 由點指向光源的單位向量础钠、其中N與L點乘,如果結(jié)果小于等于0晶乔,則漫反射為0珍坊。
四十:LOD是什么,優(yōu)缺點是什么正罢?
答:LOD(Level of detail)多層次細節(jié)阵漏,是最常用的游戲優(yōu)化技術(shù)。它按照模型的位置和重要程度決定物體渲染的資源分配,降低非重要物體的面數(shù)和細節(jié)度履怯,從而獲得高效率的渲染運算回还。
四十一:兩種陰影判斷的方法、工作原理叹洲。
本影和半影:
本影:景物表面上那些沒有被光源直接照射的區(qū)域(全黑的輪廓分明的區(qū)域)柠硕。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的區(qū)域(半明半暗區(qū)域)
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面运提,再將這些投影面與場景中的其他平面求交得出陰影多邊形蝗柔,保存這些陰影多邊形信息,然后再按視點位置對場景進行相應(yīng)處理得到所要求的視圖(利用空間換時間民泵,每次只需依據(jù)視點位置進行一次陰影計算即可癣丧,省去了一次消隱過程)
四十二: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幾個過程寥假。
四十三:MipMap是什么市框,作用?
答:MipMapping:在三維計算機圖形的貼圖渲染中有常用的技術(shù)昧旨,為加快渲染進度和減少圖像鋸齒拾给,貼圖被處理成由一系列被預(yù)先計算和優(yōu)化過的圖片組成的文件,這樣的貼圖被稱為MipMap兔沃。
四十四:請描述Interface與抽象類之間的不同
答:抽象類表示該類中可能已經(jīng)有一些方法的具體定義,但接口就是公公只能定義各個方法的界面 级及,不能具體的實現(xiàn)代碼在成員方法中乒疏。
類是子類用來繼承的,當父類已經(jīng)有實際功能的方法時該方法在子類中可以不必實現(xiàn)饮焦,直接引用父類的方法怕吴,子類也可以重寫該父類的方法。
實現(xiàn)接口的時候必須要實現(xiàn)接口中所有的方法县踢,不能遺漏任何一個转绷。
四十五:下列代碼在運行中會產(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','b','c'});
四十六:下列代碼在運行中會發(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是只讀的煞肾。不能一邊遍歷一邊修改咧织。
四十七:.Net與Mono的關(guān)系?
答:mono是.net的一個開源跨平臺工具籍救,就類似java虛擬機习绢,java本身不是跨平臺語言,但運行在虛擬機上就能夠?qū)崿F(xiàn)了跨平臺蝙昙。.net只能在windows下運行闪萄,mono可以實現(xiàn)跨平臺編譯運行,可以運行于linux奇颠,Unix桃煎,Mac OS等。
四十八:簡述Unity3D支持的作為腳本的語言的名稱
答:Unity的腳本語言基于Mono的.Net平臺上運行大刊,可以使用.NET庫为迈,這也為XML、數(shù)據(jù)庫缺菌、正則表達式等問題提供了很好的解決方案葫辐。
Unity里的腳本都會經(jīng)過編譯,他們的運行速度也很快伴郁。這三種語言實際上的功能和運行速度是一樣的耿战,區(qū)別主要體現(xiàn)在語言特性上。
JavaScript焊傅、 C#剂陡、Boo
四十九: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é)同屑墨,就是當你在StartCoroutine的函數(shù)體里處理一段代碼時躁锁,利用yield語句等待執(zhí)行結(jié)果,這期間不影響主程序的繼續(xù)執(zhí)行绪钥,可以協(xié)同工作灿里。
五十一:U3D中用于記錄節(jié)點空間幾何信息的組件名稱,及其父類名稱
答:Transform 父類是 Component
五十二:向量的點乘程腹、叉乘以及歸一化的意義匣吊?
答:
1)點乘描述了兩個向量的相似程度,結(jié)果越大兩向量越相似寸潦,還可表示投影
2)叉乘得到的向量垂直于原來的兩個向量
3)標準化向量:用在只關(guān)系方向色鸳,不關(guān)心大小的時候
五十三:矩陣相乘的意義及注意點
答:用于表示線性變換:旋轉(zhuǎn)、縮放见转、投影命雀、平移、仿射
注意矩陣的蠕變:誤差的積累
五十四:為何大家都在移動設(shè)備上尋求U3D原生GUI的替代方案
答:不美觀斩箫,OnGUI很耗費時間吏砂,使用不方便
五十五:請簡述如何在不同分辨率下保持UI的一致性
答:NGUI很好的解決了這一點,屏幕分辨率的自適應(yīng)性乘客,原理就是計算出屏幕的寬高比跟原來的預(yù)設(shè)的屏幕分辨率求出一個對比值狐血,然后修改攝像機的size。
五十六:為什么dynamic font在unicode環(huán)境下優(yōu)于static font
答:Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案易核。
使用動態(tài)字體時匈织,Unity將不會預(yù)先生成一個與所有字體的字符紋理。當需要支持亞洲語言或者較大的字體的時候牡直,若使用正常紋理缀匕,則字體的紋理將非常大。
五十七:當一個細小的高速物體撞向另一個較大的物體時碰逸,會出現(xiàn)什么情況乡小?如何避免?
答:穿透(碰撞檢測失敾ň骸)
五十八:請簡述OnBecameVisible及OnBecameInvisible的發(fā)生時機劲件,以及這一對回調(diào)函數(shù)的意義?
答:當物體是否可見切換之時〉L溃可以用于只需要在物體可見時才進行的計算授段。
五十九:什么叫動態(tài)合批?跟靜態(tài)合批有什么區(qū)別畦贸?
答:如果動態(tài)物體共用著相同的材質(zhì),那么Unity會自動對這些物體進行批處理。動態(tài)批處理操作是自動完成的奴饮,并不需要你進行額外的操作纬向。
區(qū)別:動態(tài)批處理一切都是自動的,不需要做任何操作戴卜,而且物體是可以移動的逾条,但是限制很多。靜態(tài)批處理:自由度很高投剥,限制很少师脂,缺點可能會占用更多的內(nèi)存,而且經(jīng)過靜態(tài)批處理后的所有物體都不可以再移動了江锨。
六十:簡述StringBuilder和String的區(qū)別吃警?
答:
String是字符串常量。
StringBuffer是字符串變量 啄育,線程安全酌心。
StringBuilder是字符串變量,線程不安全挑豌。
String類型是個不可變的對象安券,當每次對String進行改變時都需要生成一個新的String對象,然后將指針指向一個新的對象氓英,如果在一個循環(huán)里面侯勉,不斷的改變一個對象,就要不斷的生成新的對象债蓝,所以效率很低壳鹤,建議在不斷更改String對象的地方不要使用String類型。
StringBuilder對象在做字符串連接操作時是在原來的字符串上進行修改饰迹,改善了性能芳誓。這一點我們平時使用中也許都知道,連接操作頻繁的時候啊鸭,使用StringBuilder對象锹淌。
六十一:什么是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 的懈糯,在可移植性涤妒,可維護性和強壯性都比C++ 有很大的改進。C# 的設(shè)計目標是用來開發(fā)快速穩(wěn)定可擴展的應(yīng)用程序赚哗,當然也可以通過Interop
和Pinvoke 完成一些底層操作
六十四:Unity3D Shader分哪幾種她紫,有什么區(qū)別?
答:表面著色器的抽象層次比較高屿储,它可以輕松地以簡潔方式實現(xiàn)復雜著色贿讹。表面著色器可同時在前向渲染及延遲渲染模式下正常工作。
頂點片段著色器可以非常靈活地實現(xiàn)需要的效果够掠,但是需要編寫更多的代碼民褂,并且很難與Unity的渲染管線完美集成。
固定功能管線著色器可以作為前兩種著色器的備用選擇疯潭,當硬件無法運行那些酷炫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)) //[1]
throw "Invalid argument(s)"; //[2]
char * strDestCopy=strDest; //[3]
while ((strDest++=strSrc++)!='\0'); //[4]
return strDestCopy;
}
錯誤的做法:
//不檢查指針的有效性,說明答題者不注重代碼的健壯性相叁。
//檢查指針的有效性時使用((!strDest)||(!strSrc))或(!(strDest&&strSrc))遵绰,說明答題者對C語言中類型的隱式轉(zhuǎn)換沒有深刻認識。在本例中char *轉(zhuǎn)換為bool即是類型隱式轉(zhuǎn)換增淹,這種功能雖然靈活椿访,但更多的是導致出錯概率增大和維護成本升高。所以C++專門增加了bool虑润、true赎离、false三個關(guān)鍵字以提供更安全的條件表達式。
//檢查指針的有效性時使用((strDest==0)||(strSrc==0))端辱,說明答題者不知道使用常量的好處梁剔。直接使用字面常量(如本例中的0)會減少程序的可維護性。0雖然簡單舞蔽,但程序中可能出現(xiàn)很多處對指針的檢查荣病,萬一出現(xiàn)筆誤,編譯器不能發(fā)現(xiàn)渗柿,生成的程序內(nèi)含邏輯錯誤个盆,很難排除。而使用NULL代替0朵栖,如果出現(xiàn)拼寫錯誤颊亮,編譯器就會檢查出來。
//return new string("Invalid argument(s)");陨溅,說明答題者根本不知道返回值的用途终惑,并且他對內(nèi)存泄漏也沒有警惕心。從函數(shù)中返回函數(shù)體內(nèi)分配的內(nèi)存是十分危險的做法门扇,他把釋放內(nèi)存的義務(wù)拋給不知情的調(diào)用者雹有,絕大多數(shù)情況下,調(diào)用者不會釋放內(nèi)存臼寄,這導致內(nèi)存泄漏霸奕。
//return 0;,說明答題者沒有掌握異常機制吉拳。調(diào)用者有可能忘記檢查返回值质帅,調(diào)用者還可能無法檢查返回值(見后面的鏈式表達式)。妄想讓返回值肩負返回正確值和異常值的雙重功能留攒,其結(jié)果往往是兩種功能都失效煤惩。應(yīng)該以拋出異常來代替返回值,這樣可以減輕調(diào)用者的負擔稼跳、使錯誤不會被忽略盟庞、增強程序的可維護性。
//忘記保存原始的strDest值汤善,說明答題者邏輯思維不嚴密什猖。
//循環(huán)寫成while (strDest++=strSrc++);,同1红淡。
//循環(huán)寫成while (strSrc!='\0') strDest++=strSrc++;不狮,說明答題者對邊界條件的檢查不力。循環(huán)體結(jié)束后在旱,strDest字符串的末尾沒有正確地加上'\0'摇零。
/*
*返回strDest的原始值使函數(shù)能夠支持鏈式表達式,增加了函數(shù)的“附加值”桶蝎。同樣功能的函數(shù)驻仅,如果能合理地提高的可用性谅畅,自然就更加理想。
鏈式表達式的形式如:
`nt iLength=strlen(strcpy(strA,strB));
又如:
char * strA=strcpy(new char[10],strB);
返回strSrc的原始值是錯誤的噪服。其一毡泻,源字符串肯定是已知的,返回它沒有意義粘优。其二仇味,不能支持形如第二例的表達式。其三雹顺,為了保護源字符串丹墨,形參用const限定strSrc所指的內(nèi)容,把const char *作為char *返回嬉愧,類型不符贩挣,編譯報錯。
*/
六十六:C#中四種訪問修飾符是哪些英染?各有什么區(qū)別揽惹?
答:1.屬性修飾符 2.存取修飾符 3.類修飾符 4.成員修飾符。
屬性修飾符:
Serializable:按值將對象封送到遠程服務(wù)器四康。
STATread:是單線程套間的意思搪搏,是一種線程模型。
MATAThread:是多線程套間的意思闪金,也是一種線程模型疯溺。
存取修飾符:
public:存取不受限制。
private:只有包含該成員的類可以存取哎垦。
internal:只有當前命名空間可以存取囱嫩。
protected:只有包含該成員的類以及派生類可以存取。
類修飾符:
abstract:抽象類漏设。指示一個類只能作為其它類的基類墨闲。
sealed:密封類。指示一個類不能被繼承郑口。理所當然鸳碧,密封類不能同時又是抽象類,因為抽象總是希望被繼承的犬性。
成員修飾符:
abstract:指示該方法或?qū)傩詻]有實現(xiàn)瞻离。
sealed:密封方法∑柜桑可以防止在派生類中對該方法的override(重載)套利。不是類的每個成員方法都可以作為密封方法密封方法,必須對基類的虛方法進行重載,提供具體的實現(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ù)的地址,即對象的引用高帖。
7.值類型變量直接把變量的值保存在堆棧中缰儿,引用類型的變量把實際數(shù)據(jù)的地址保存在堆棧中。
六十九:結(jié)構(gòu)體和類有何區(qū)別散址?
答:結(jié)構(gòu)體是一種值類型乖阵,而類是引用類型。(值類型预麸、引用類型是根據(jù)數(shù)據(jù)存儲的角度來分的)
就是值類型用于存儲數(shù)據(jù)的值瞪浸,引用類型用于存儲對實際數(shù)據(jù)的引用。那么結(jié)構(gòu)體就是當成值來使用的吏祸,類則通過引用來對實際數(shù)據(jù)操作对蒲。
七十:請寫出求斐波那契數(shù)列任意一位的值得算法
static int Fn(int n)
{
if (n <= 0)
{
throw new ArgumentOutOfRangeException();
}
if (n == 1||n==2)
{
return 1;
}
return checked(Fn(n - 1) + Fn(n - 2)); // when n>46 memory will overflow
}
七十一:ref參數(shù)和out參數(shù)是什么?有什么區(qū)別贡翘?
答:ref和out參數(shù)的效果一樣蹈矮,都是通過關(guān)鍵字找到定義在主函數(shù)里面的變量的內(nèi)存地址,并通過方法體內(nèi)的語法改變它的大小鸣驱。
不同點就是輸出參數(shù)必須對參數(shù)進行初始化泛鸟。 ref參數(shù)是引用,out參數(shù)為輸出參數(shù)丐巫。
七十二:C#的委托是什么谈况?有何用處?
答:委托類似于一種安全的指針引用递胧,在使用它時是當做類來看待而不是一個方法碑韵,相當于對一組方法的列表的引用。
用處:使用委托使程序員可以將方法引用封裝在委托對象內(nèi)缎脾。然后可以將該委托對象傳遞給可調(diào)用所引用方法的代碼祝闻,而不必在編譯時知道將調(diào)用哪個方法。與C或C++中的函數(shù)指針不同遗菠,委托是面向?qū)ο罅沂穷愋桶踩摹?/p>
七十三:協(xié)同程序的執(zhí)行代碼是什么?有何用處辙纬,有何缺點豁遭?
function Start() {
// - After 0 seconds, prints "Starting 0.0"
// - After 0 seconds, prints "Before WaitAndPrint Finishes 0.0"
// - After 2 seconds, prints "WaitAndPrint 2.0"
// 先打印"Starting 0.0"和"Before WaitAndPrint Finishes 0.0"兩句,2秒后打印"WaitAndPrint 2.0"
print ("Starting " + Time.time );
// Start function WaitAndPrint as a coroutine. And continue execution while it is running
// this is the same as WaintAndPrint(2.0) as the compiler does it for you automatically
// 協(xié)同程序WaitAndPrint在Start函數(shù)內(nèi)執(zhí)行,可以視同于它與Start函數(shù)同步執(zhí)行.
StartCoroutine(WaitAndPrint(2.0));
print ("Before WaitAndPrint Finishes " + Time.time );
}
function WaitAndPrint (waitTime : float) {
// suspend execution for waitTime seconds
// 暫停執(zhí)行waitTime秒
yield WaitForSeconds (waitTime);
print ("WaitAndPrint "+ Time.time );
}
作用:一個協(xié)同程序在執(zhí)行過程中,可以在任意位置使用yield語句。yield的返回值控制何時恢復協(xié)同程序向下執(zhí)行贺拣。協(xié)同程序在對象自有幀執(zhí)行過程中堪稱優(yōu)秀蓖谢。協(xié)同程序在性能上沒有更多的開銷捂蕴。
缺點:協(xié)同程序并非真線程,可能會發(fā)生堵塞闪幽。
七十四:什么是里氏代換元則啥辨?
答:里氏替換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計的基本原則之一。 里氏替換原則中說盯腌,任何基類可以出現(xiàn)的地方溉知,子類一定可以出現(xiàn),作用方便擴展功能能
七十五:Mock和Stub有何區(qū)別腕够?
Mock與Stub的區(qū)別:Mock:關(guān)注行為驗證级乍。細粒度的測試,即代碼的邏輯燕少,多數(shù)情況下用于單元測試卡者。Stub:關(guān)注狀態(tài)驗證。粗粒度的測試客们,在某個依賴系統(tǒng)不存在或者還沒實現(xiàn)或者難以測試的情況下使用,例如訪問文件系統(tǒng)材诽,數(shù)據(jù)庫連接底挫,遠程協(xié)議等。
七十六:概述序列化:
答:序列化簡單理解成把對象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^程脸侥。比如建邓,可以序列化一個對象,然后使用HTTP通過Internet在客戶端和服務(wù)器端之間傳輸該對象
七十七:堆和棧的區(qū)別睁枕?
答:棧通常保存著我們代碼執(zhí)行的步驟官边,如在代碼段1中 AddFive()方法,int pValue變量外遇,int result變量等等注簿。而堆上存放的則多是對象,數(shù)據(jù)等跳仿。(譯者注:忽略編譯器優(yōu)化)我們可以把棧想象成一個接著一個疊放在一起的盒子诡渴。當我們使用的時候,每次從最頂部取走一個盒子菲语。棧也是如此妄辩,當一個方法(或類型)被調(diào)用完成的時候,就從棧頂取走(called a Frame山上,譯注:調(diào)用幀)眼耀,接著下一個。堆則不然佩憾,像是一個倉庫哮伟,儲存著我們使用的各種對象等信息干花,跟棧不同的是他們被調(diào)用完畢不會立即被清理掉。
七十八:概述c#中代理和事件澈吨?
答:代理就是用來定義指向方法的引用把敢。
C#事件本質(zhì)就是對消息的封裝,用作對象之間的通信谅辣;發(fā)送方叫事件發(fā)送器修赞,接收方叫事件接收器;
七十九:C#中的排序方式有哪些桑阶?
答:選擇排序柏副,冒泡排序,快速排序蚣录,插入排序割择,希爾排序,歸并排序
八十:射線檢測碰撞物的原理是萎河?
答:射線是3D世界中一個點向一個方向發(fā)射的一條無終點的線荔泳,在發(fā)射軌跡中與其他物體發(fā)生碰撞時,它將停止發(fā)射 虐杯。
八十一:客戶端與服務(wù)器交互方式有幾種玛歌?
答: socket通常也稱作"套接字",實現(xiàn)服務(wù)器和客戶端之間的物理連接,并進行數(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如何交互?
答:
1. Unity主動調(diào)用iOS巩搏、Android
Unity -> iOS
實現(xiàn)方案Unity的官方文檔已經(jīng)給出了
我自己做了一些總結(jié):
第一昨登,Unity是支持 C# 通過調(diào)用DLL的方式來調(diào)用 C++ 的
第二,iOS是支持 C++ 和 OC混編的塔猾,所以 C++ 自然可以調(diào)用 OC
所以篙骡,我們的實現(xiàn)方案為 C# -> C++ -> OC
Unity -> Android
同樣,實現(xiàn)方案Unity的官方文檔也已經(jīng)給出了
文檔中給出了兩種方法:
Plan A:使用Android NDK的方式
Plan B:使用Java Native Interface (JNI)的方式
關(guān)于JNI的方式官方給了詳細的示例丈甸,我自己也做了一些總結(jié):
第一糯俗,Unity提供了UnityEngine.AndroidJNI,可以實現(xiàn)在C#創(chuàng)建Java對象并調(diào)用函數(shù)
第二睦擂,在Android下做原生的Java調(diào)用Java實現(xiàn)不了的可以自掛東南枝了
所以得湘,我們的實現(xiàn)方案為 C# -> Java
2. iOS、Android主動調(diào)用Unity
iOS -> Unity 顿仇、 Android -> Unity
Unity都只為我們提供了一個官方的方法
UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
解釋一下這個函數(shù):
返回值:無
函數(shù)類型:靜態(tài)函數(shù)淘正,直接調(diào)用即可(Java中包含在com.unity3d.player.UnityPlayer中)
參數(shù)1:場景內(nèi)某GameObject物體的名稱
參數(shù)2:該GameObject物體上組件所掛載的函數(shù)名
參數(shù)3:調(diào)用該函數(shù)時傳入的參數(shù)
所以摆马,我們的實現(xiàn)方案為 Java/OC -> C#
八十三:Unity中,照相機的Clipping Planes的作用是什么鸿吆?調(diào)整Near囤采、Fare兩個值時,應(yīng)該注意什么惩淳?
答:剪裁平面 蕉毯。從相機到開始渲染和停止渲染之間的距離。
八十四:如何在Unity3D中查看場景的面試思犁,頂點數(shù)和Draw Call數(shù)代虾?如何降低Draw Call數(shù)?
答:在Game視圖右上角點擊Stats激蹲。降低Draw Call 的技術(shù)是Draw Call Batching
八十五:請問alpha test在何時使用棉磨?能達到什么效果?
Alpha Test,中文就是透明度測試学辱。簡而言之就是V&F shader中最后fragment函數(shù)輸出的該點顏色值(即上一講frag的輸出half4)的alpha值與固定值進行比較乘瓤。Alpha Test語句通常于Pass{}中的起始位置。Alpha Test產(chǎn)生的效果也很極端策泣,要么完全透明馅扣,即看不到,要么完全不透明着降。
八十六:UNITY3d在移動設(shè)備上的一些優(yōu)化資源的方法
答:
- 使用assetbundle,實現(xiàn)資源分離和共享拗军,將內(nèi)存控制到200m之內(nèi)任洞,同時也可以實現(xiàn)資源的在線更新
- 頂點數(shù)對渲染無論是cpu還是gpu都是壓力最大的貢獻者,降低頂點數(shù)到8萬以下发侵,fps穩(wěn)定到了30幀左右
- 只使用一盞動態(tài)光交掏,不是用陰影,不使用光照探頭
粒子系統(tǒng)是cpu上的大頭 - 剪裁粒子系統(tǒng)
- 合并同時出現(xiàn)的粒子系統(tǒng)
- 自己實現(xiàn)輕量級的粒子系統(tǒng)
animator也是一個效率奇差的地方 - 把不需要跟骨骼動畫和動作過渡的地方全部使用animation刃鳄,控制骨骼數(shù)量在30根以下
- animator出視野不更新
- 刪除無意義的animator
- animator的初始化很耗時(粒子上能不能盡量不用animator)
- 除主角外都不要跟骨骼運動apply root motion
- 絕對禁止掉那些不帶剛體帶包圍盒的物體(static collider )運動
NUGI的代碼效率很差盅弛,基本上runtime的時候?qū)pu的貢獻和render不相上下 - 每幀遞歸的計算finalalpha改為只有初始化和變動時計算
- 去掉法線計算
- 不要每幀計算viewsize 和windowsize
- filldrawcall時構(gòu)建頂點緩存使用array.copy
- 代碼剪裁:使用strip level ,使用.net2.0 subset
- 盡量減少smooth group
- 給美術(shù)定一個嚴格的經(jīng)過科學驗證的美術(shù)標準叔锐,并在U3D里面配以相應(yīng)的檢查工具
八十七:四元數(shù)有什么作用挪鹏?
答:對旋轉(zhuǎn)角度進行計算時用到四元數(shù)
八十八:將Camera組件的ClearFlags選項選成Depth only是什么意思?有何用處愉烙?
答:僅深度讨盒,該模式用于對象不被裁剪。
八十九:如何讓已經(jīng)存在的GameObject在LoadLevel后不被卸載掉步责?
void Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
九十:在編輯場景時將GameObject設(shè)置為Static有何作用返顺?
答:設(shè)置游戲?qū)ο鬄镾tatic將會剔除(或禁用)網(wǎng)格對象當這些部分被靜態(tài)物體擋住而不可見時禀苦。因此,在你的場景中的所有不會動的物體都應(yīng)該標記為Static遂鹊。
九十一:有A和B兩組物體振乏,有什么辦法能夠保證A組物體永遠比B組物體先渲染?
答:把A組物體的渲染對列大于B物體的渲染隊列
九十二:將圖片的TextureType選項分別選為Texture和Sprite有什么區(qū)別
答:Sprite作為UI精靈使用秉扑,Texture作用模型貼圖使用慧邮。
九十三:問一個Terrain,分別貼3張邻储,4張萧福,5張地表貼圖,渲染速度有什么區(qū)別芯肤?為什么赦抖?
答:沒有區(qū)別,因為不管幾張貼圖只渲染一次宦赠。
九十四:什么是DrawCall陪毡?DrawCall高了又什么影響?如何降低DrawCall勾扭?
答:Unity中毡琉,每次引擎準備數(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混合号俐。公式:最終顏色 = 源顏色 源透明值 + 目標顏色(1 - 源透明值)
九十七:簡述水面倒影的渲染原理
答: 原理就是對水面的貼圖紋理進行擾動,以產(chǎn)生波光玲玲的效果定庵。用shader可以通過GPU在像素級別作擾動吏饿,效果細膩,需要的頂點少蔬浙,速度快
九十八:簡述NGUI中Grid和Table的作用猪落?
答:對Grid和Table下的子物體進行排序和定位
九十九:請簡述NGUI中Panel和Anchor的作用
答:
- 只要提供一個half-pixel偏移量,它可以讓一個控件的位置在Windows系統(tǒng)上精確的顯示出來(只有這個Anchor的子控件會受到影響)
- 如果掛載到一個對象上敛滋,那么他可以將這個對象依附到屏幕的角落或者邊緣
- UIPanel用來收集和管理它下面所有widget的組件许布。通過widget的geometry創(chuàng)建實際的draw call。沒有panel所有東西都不能夠被渲染出來,你可以把UIPanel當做Renderer
一百:能用foreach遍歷訪問的對象需要實現(xiàn)_接口或聲明方法的類型
答:IEnumerable绎晃;GetEnumerator