第一次發布時間:9月12日
最近修改時間:11月18日
2020年9月面試題分享
- 一、Unity腳本基礎
- 二、Unity性能優化
一、Unity腳本基礎
1、Unity3D中的協程(coroutine),C#執行緒和行程之間的區別是什么?
簡記:協程和執行緒區別
協程(協同程式Coroutine): 同一時間只能執行某個協程,開辟多個協程開銷不大,協程適合對某任務進行分時處理, Unity提供了StartCoroutine來開啟協程,當你在 StartCoroutine 的函式體里處理一段代碼時,利用 yield陳述句等待執行結果,這期間不影響主程式的繼續執行,可以協同作業,
舉個例子:LoadLevelAsync(異步加載關卡)后臺加載場景的方法,允許你在后臺加載新資源和場景,再利用協同,你就可以在前臺用 loading 潭訓影片提示玩家游戲處于加載中,同時后臺協同處理加載的事宜,
行程progress:行程是執行緒的容器,
執行緒thread: 同一時間可以同時執行多個執行緒,開辟多條執行緒開銷很大,執行緒適合多任務同時處理,并發并行,
協程:具體多回傳點的方法,時間分片(幀),Unity只能是單執行緒,只能在主執行緒呼叫Api,物件

2、Unity3D 是否支持寫成多執行緒程式?如果支持的話需要注意什么?
支持,如果掌握的Unity多執行緒的方法,就可以從容的使用多個硬體處理器或處理很難劃分管理資料塊,
【注意】
1、只能從主執行緒中訪問 Unity3D 的組件,物件和 Unity3D 系統呼叫
2、如果同時你要處理很多事情或者與 Unity 的物件互動,可以用 thread,可以通過排序來解決一個執行緒改變一個資料的問題,否則使用協程coroutine,
3、C#中有 lock 這個關鍵字,以確保只有一個執行緒可以在特定時間內訪問特定的物件
3、OnEnable、Awake、Start 運行時的發生順序?哪些可能在同一個物件周期中反復的發生?
Awake > OnEnable>Start 推薦看腳本生命周期順序
OnEnable可以在同一周期反復的發生
SetActive(true)就會反復觸發OnEnable事件
SetActive(false)就會反復觸發OnDisable事件
其中Awake函式一般用于實作單例模式;
OnEnable函式是在游戲物件可以呼叫時呼叫;
OnDisable是在游戲物件不可用時呼叫;
Start函式則是在場景中顯示該游戲物件前呼叫一次,用于開始設定物體屬性和渲染;
FixedUpdate函式具有固定更新頻率,一般進行游戲物件的物理引擎的更新;
Update函式則是渲染幀更新,每秒更新一定頻率;
LateUpdate函式是延遲更新,只有在每一幀的所有Update函式都執行完了過后才會執行;
而OnGUI函式則是在每一幀更新時呼叫,

4、Unity3D 如何獲知場景中需要加載的資料?如何動態資源加載?
instantiate:最簡單的一種方式,以實體化的方式動態生成一個物體,
Assetsbundle:即將資源打成 asset bundle 放在服務器或本地磁盤,然后使用WWW模塊get 下來,然后從這個bundle中load某個object,unity官方推薦也是絕大多數商業化專案使用的一種方式,
Resource.Load:可以直接load并回傳某個型別的Object,前提是要把這個資源放在Resource命名的檔案夾下,Unity不管有沒有場景參考,都會將其全部打入到安裝包中
AssetDatabase.loadasset :這種方式只在editor范圍內有效,游戲運行時沒有這個函式,它通常是在開發中除錯用的,
5、Unity中碰撞器(Collider)和觸發器(Trigger)的區別?
碰撞器(Collider)有碰撞效果,IsTrigger=false,可以調OnCollisionEnter/Stay/Exit函式
觸發器(Trigger)沒有碰撞效果,isTrigger=true,可以呼叫OnTriggerEnter/Stay/Exit函式
6、U3D中,幾種施加力的方式,描述出來
首先需要物件要有rigidbody組件
Rigidbody.AddForce /AddForceAtPosition
2D Constant Force
Force/Relative Force/Torque
7、物體自旋轉使用的函式叫什么?物體繞某點旋轉使用函式叫什么?
transform.Rotate
transform.RotateAround
8、u3d 提供了一個用于保存讀取資料的類,(playerPrefs),請列出保存讀取整形資料的函式
PlayerPrefs類是一個本地持久化保存與讀取資料的類
PlayerPrefs類支持3中資料型別的保存和讀取,浮點型,整形,和字串型,
分別對應的函式為:
SetInt();保存整型資料;GetInt();讀取整形資料;
SetFloat();保存浮點型資料; GetFlost();讀取浮點型資料;
SetString();保存字串型資料; GetString();讀取字串型資料;
9、unity3d 從喚醒到銷毀有一段生命周期,請列出系統自己呼叫的幾個重要方法,
(init)Awake>OnEnable>Start > (Physic)FixedUpdate> (GameLogic)Update>Yield >LateUpdate>OnGui>OnDisable>OnDistroy
10、物理更新一般在哪個系統函式里?
FixedUpdate,每固定幀繪制時執行一次,和 update 不同的是 FixedUpdate 是渲染幀執行,如果你的渲染效率低下的時候 FixedUpdate 呼叫次數就會跟著下降,
FixedUpdate 比較適用于物理引擎的計算,因為是跟每幀渲染有關,
Update 就比較適合做游戲邏輯更新,
LateUpdate比較適合相機更新,update后更新,防止視角移動,游戲物件發生空幀未出現,
11、反向旋轉影片的方法是什么?
1.將影片速度調成-1
2.改代碼animation.speed=-1
12、用代碼實作第三人稱角色控制器?第一人稱角色控制器
大致思路:
攝像機與角色的距離范圍
攝像機旋轉、平移
滑鼠控制攝像機
13、獲取、增加、洗掉組件的命令分別是什么?
獲取:GetComponent
增加:AddComponent
洗掉:Destroy
14、Animation.CrossFade 是什么?
影片淡入淡出
15、Application.LoadLevel 命令作用是什么?
加載關卡,已棄用
SceneManager.LoadScene
16、調式記錄到控制臺的命令是什么?
Debug.Log();
17、編輯器類存放路徑是什么?
Asset/Editor
18、使用原生 GUI 創建一個可以拖動的視窗命令是什么?
GUI.DragWindow
19、localPosition 與 Position 的使用區別?
localPosition :自身坐標系,相對于父級的位置
Position :世界坐標系中的位置
20、Mathf.Round和Mathf.Clamp和Mathf.Lerp含義?
Mathf.Round:四舍五入
Mathf.Clamp:左右限值
Mathf.Lerp:插值
21、寫一個計時器工具,從整點開始,格式為00:00:00
分小時、分、秒
22、寫出 Animation 的五個方法
AddClip 將 clip 添加到名稱為 newName 的影片中,
Blend 在后續 time 秒中將名稱為 animation 的影片向 targetWeight 混合,
CrossFade 在后續 time 秒的時間段內,使名稱為 animation 的影片淡入,使其他影片淡出,
CrossFadeQueued 使影片在上一個影片播放完成后交叉淡入淡出,
IsPlaying 名稱為 name 的影片是否正在播放?
PlayQueued 在先前的影片播放完畢后再播放影片,
RemoveClip 從影片串列中移除剪輯,
Sample 對當前狀態的影片進行采樣,
Stop 停止所有使用該影片啟動的正在播放的影片,
23、用滑鼠實作在場景中拖動物體,用滑鼠滾輪實作縮放(用一個 Cube 即可)
在場景中添加一個Plan,Camera,Directional Light,Cube,添加兩個腳本一個掛在Camera上,另一個掛在Cube上,
1.滑鼠滾輪實作縮放:將攝像機的鏡頭拉近或者拉遠,調整攝像機的視角就可以實作2.滑鼠實作在場景中拖動物體:解決思路就是將世界坐標轉換成螢屏坐標,然后計算物體與滑鼠之間移動量,回圈滑鼠被按下操作,得到滑鼠的當前位置,加上計算好的移動量,將新的坐標賦值給物理就行了, 具體代碼實作:http://www.cnblogs.com/hewencong/p/4299722.html
24、<憤怒的小鳥>給予初速度以后,怎么讓小鳥受到重力和空氣阻力的影響而繪制拋物線軌跡,說出具體的計算方法
Vector3 v 代表初速度 v’代表現在的速度, 假設小鳥是沿的 z 軸也就是transform.forward 方向,運動的質量為 m,那么 v‘=v-new Vector3(0,mgt,ft),transform.Translate(v’)做的就是拋物線運動(g 為重力加速度不要用現實中的需要自己除錯,f 為阻力也要自己除錯
設定,t 為時間)
25、當游戲中需要頻繁創建一個物體時,我們需要怎樣做能夠節省記憶體?
1.使用預制體物件
2.使用物件池技術
26、碰撞檢測需要物體具備什么屬性?
能檢測碰撞發生的方式有兩種,一種是利用碰撞器,另一種則是利用觸發器
27、如何使子控制元件居中,如果使用UGUI怎么實作
錨點設定為中心
28、去掉敏感字的程式(手寫程式)
字串replace
29、寫出WWW的幾個方法
WWW.LoadFromCacheOrDownload:可被用于將Assets Bundles自動快取到本地磁盤
WWW.Dispose :釋放現有的 WWW 物件,
WWW.isDone:是否完成下載?(只讀)
WWW.progress:下載進度(只讀),
30、啟用MipMaps對記憶體的影響是?
增加約33%的記憶體,1/4 +1/16
31、采用Input.mousePosition來獲取滑鼠在螢屏上的位置
左下角為原點(0,0),右上角為(Screen.Height,Screen.Width)
32、Unity中銷毀GameObject的方式,簡述Destroy和DestroyImmediate的區別
Destroy銷毀訊息物件,記憶體中還是存在,只有記憶體不夠才被清除釋放記憶體
DestroyImmediate立即銷毀物件,并釋放記憶體
33、如何檢測物體是否被其他物件遮擋
射線檢測
EventSystem.IsPointerOverGameObject
是否具有給定 ID 的指標是否位于 EventSystem 物件上
二、Unity性能優化
lod 是什么,優缺點是什么
MipMap 是什么?作用?
當游戲中需要頻繁創建一個物體物件時,我們需要怎么做來節省記憶體,
如何優化記憶體?
動態加載資源的方式?和區別
請簡述一下物件池原理,什么情況下使用?
19.使用mipmap有什么好處?什么情況下使用?
Unity記憶體優化?GC垃圾回收
你認為unity在開發程序中哪些地方比較容易造成記憶體泄漏和記憶體泄漏問題?如何避免?
如何解決過多創建和洗掉物件帶來的卡頓問題
Unity資源加載的有幾種方式,簡述asset bundie
背包系統中只有20個格子,現在有總共有100個物體,除了顯示在視野中的20個外,對其他的處理方法?(注:將其他隱藏起來不可行,物件池得有具體的說明)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/225542.html
標籤:其他
