Unity面試題加強版之三Unity腳本基礎
unity超全面試題,掌握輕輕松松拿Offer,碼住學習
107.Unity3D中的協程(coroutine)和C#執行緒之間的區別是什么?
多執行緒程式同時運行多個執行緒 ,而在任一指定時刻只有一個協程在運行,并且這個正在運行的協同程式只在必要時才被掛起,除主執行緒之外的執行緒無法訪問 Unity3D 的物件、組件、方法,
Unity3d 沒有多執行緒的概念,不過 unity 也給我們提供了 StartCoroutine(協同程式)和LoadLevelAsync(異步加載關卡)后臺加載場景的方法, StartCoroutine 為什么叫協同程式呢,所謂協同,就是當你在 StartCoroutine 的函式體里處理一段代碼時,利用 yield 陳述句等待執行結果,這期間不影響主程式的繼續執行,可以協同作業,而 LoadLevelAsync 則允許你在后臺加載新資源和場景,所以再利用協同,你就可以前臺用 loading 潭訓影片提示玩家游戲未卡死,同時后臺協同處理加載的事宜
108.簡述 Unity3D 支持的作為腳本的語言的名稱
Unity 的腳本語言基于 Mono 的.Net 平臺上運行,可以使用.NET 庫,這也為 XML、資料庫、正則運算式等問題提供了很好的解決方案,
Unity 里的腳本都會經過編譯,他們的運行速度也很快,這三種語言實際上的功能和運行速度是一樣的,區別主要體現在語言特性上,
JavaScript:和網頁中常用的 JavaScript 不一樣,它編譯后的運行速度很快,語法方面也會有不少區別,
C#
Boo:可以看做是 Python 語言的變種,又糅合了 Ruby 和 C#的特性,它是靜態型別語言
109.Unity3D 是否支持寫成多執行緒程式?如果支持的話需要注意什么?
僅能從主執行緒中訪問 Unity3D 的組件,物件和 Unity3D 系統呼叫
110.支持:如果同時你要處理很多事情或者與 Unity 的物件互動小可以用 thread,否則使用coroutine,
注意:C#中有 lock 這個關鍵字,以確保只有一個執行緒可以在特定時間內訪問特定的物件
111.OnEnable、Awake、Start 運行時的發生順序?哪些可能在同一個物件周期中反復的發生?
Awake —>OnEnable—>Start
OnEnable 在同一周期中可以反復地發生
112.請簡述 OnBecameVisible 及 OnBecameInvisible 的發生時機,以及這一對回呼函式的意義?
當物體是否可見切換之時,可以用于只需要在物體可見時才進行的計算,
113.Unity3D 如何獲知場景中需要加載的資料?
Resource.Load
AssetBundle.Load
114.物體發生碰撞時,有幾個階段,分別對應的函式
三個階段,OnCollisionEnter/Stay/Exit 函式
115.u3d 中,幾種施加力的方式,描述出來
rigidbody.AddForce/AddForceAtPosition,都是 rigidbody 的成員函式
116.物體自旋轉使用的函式叫什么
transform.Rotate
117.物體繞某點旋轉使用函式叫什么
transform.RotateAround
118.u3d 提供了一個用于保存讀取資料的類,(playerPrefs),請列出保存讀取整形資料的函式
PlayerPrefs.SetInt 與 PlayerPrefs.GetInt
119.unity3d 從喚醒到銷毀有一段生命周期,請列出系統自己呼叫的幾個重要方法,
Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –>OnGUI –> Reset –> OnDisable –> OnDestroy
120.物理更新一般在哪個系統函式里?
FixedUpdate,每固定幀繪制時執行一次,和 update 不同的是 FixedUpdate 是渲染幀執行,如果你的渲染效率低下的時候 FixedUpdate 呼叫次數就會跟著下降,FixedUpdate 比較適用于物理引擎的計算,因為是跟每幀渲染有關,Update 就比較適合做控制,
121.移動相機動作在哪個函式里,為什么在這個函式里,
LateUpdate,,是在所有 update 結束后才調,比較適合用于命令腳本的執行,官網上例子是攝像機的跟隨,都是在所有 update 操作完才跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現,
122.為什么 u3d 會出現組件上資料丟失的情況
一般是組件上系結的物體物件被洗掉了
123.什么是協同程式?
在主執行緒運行時同時開啟另一段邏輯處理,來協助當前程式的執行,換句話說,開啟協程就是開啟一個執行緒,可以用來控制運動、序列以及物件的行為,
124.反向旋轉影片的方法是什么?
反轉影片,講影片的速度調到-1,碰撞時,被碰撞物體與碰撞物體有collider 組件,碰撞物體有剛體組件,或角色碰撞得包含角色組件 OR 改變 animation.speed
125.用代碼實作第三角色控制器
public class Player : MonoBehaviour {
public Transform _cameraTrans;
private Vector3 _cameraOffset;
void Awake() {
_cameraOffset = transform.position - _cameraTrans.position;
}
void Update() {
_cameraTrans.position = transform.position - _cameraOffset;
}
}
126.實作刀訓吊物體的功能
刀訓吊物體需要節點掛接和坐標系轉換
127.獲取、增加、洗掉組件的命令分別是什么
獲取:GetComponent
增加:AddComponent
洗掉:Destroy
128.Animation.CrossFade 命令作用是:C
A.影片放大 B.影片轉換 C.影片的淡入為其他影片
129.Application.loadLevel 命令為:A
A.加載關卡 B.異步加載關卡 C.加載動作
130.除錯記錄到控制臺的命令是什么?
Debug.Log();
131.編輯器類存放路徑是什么?
工程目錄下的 Assets/Editor 檔案夾下,
132.使用原生 GUI 創建一個可以拖動的視窗命令是什么?
GUI.DragWindow();
133.localPosition 與 Position 的使用區別?
localPosition:自身位置,相對于父級的變換的位置, Position:在世界坐標 transform的位置
134.Mathf.Round, Mathf.Clamp, Mathf.Lerp的含義
Mathf.Round 四舍五入
Mathf.Clamp 限制
Mathf.Lerp 插值
135.寫一個計時器工具,從整點開始計時,格式為:00:00:00
private float timer = 0f;
private int h = 0;
private int m = 0;
private int s = 0;
private string timeStr = string.Empty;
void Update () {
timer += Time.deltaTime;
if (timer >= 1f) {s++; timer = 0;}
if (s >= 60) {m++;s = 0;}
if (m >= 60) {h++;m = 0;}
if (h >= 99) {h = 0;}
}
void OnGUI(){
timeStr = string.Format ("{0:D2}:{1:D2}:{2:D2}", h, m, s);
GUI.Label (new Rect (10, 10, 100, 200), timeStr);
}
136.寫出 Animation 的五個方法
AddClip 添加剪輯、Blend 混合、Play 播放、Stop 停止、Sample 采樣
137.用滑鼠實作在場景中拖動物體,用滑鼠滾輪實作縮放(用一個 Cube 即可),
在場景中添加一個Plan,Camera,Directional Light,Cube,添加兩個腳本scrollerScirpt(掛在Camera),CubeDragScript(掛在Cube上),
**1.滑鼠滾輪實作縮放:**將攝像機的鏡頭拉近或者拉遠,調整攝像機的視角就可以實作,主要實作代碼如下:
void Update () {
//滑鼠滾輪的效果
if (Input.GetAxis("Mouse ScrollWheel") < 0) {
if (Camera.main.fieldOfView <= 100)
Camera.main.fieldOfView += 2;
if (Camera.main.orthographicSize <= 20)
Camera.main.orthographicSize += 0.5F;
}
//Zoom in
if (Input.GetAxis("Mouse ScrollWheel") > 0) {
if (Camera.main.fieldOfView > 2)
Camera.main.fieldOfView -= 2;
if (Camera.main.orthographicSize >= 1)
Camera.main.orthographicSize -= 0.5F;
}
}
2.滑鼠實作在場景中拖動物體:
解決思路就是將世界坐標轉換成螢屏坐標,然后計算物體與滑鼠之間移動量,回圈滑鼠被按下操作,得到滑鼠的當前位置,加上計算好的移動量,將新的坐標賦值給物理就行了,主要是開啟一個協同程式(Corountine)來處理
主要代碼如下:
// Use this for initialization
void Start () {
StartCoroutine(OnMouseDown());
}
IEnumerator OnMouseDown() {
//將物體由世界坐標系轉換為螢屏坐標系
Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);
//完成兩個步驟 1.由于滑鼠的坐標系是2維,需要轉換成3維的世界坐標系
//2.只有3維坐標情況下才能來計算滑鼠位置與物理的距離,offset即是距離
//將滑鼠螢屏坐標轉為三維坐標,再算出物體位置與滑鼠之間的距離
Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
while (Input.GetMouseButton(0)) {
//得到現在滑鼠的2維坐標系位置
Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
//將當前滑鼠的2維位置轉換成3維位置,再加上滑鼠的移動量
Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
//curPosition就是物體應該的移動向量賦給transform的position屬性
transform.position = curPosition;
yield return new WaitForFixedUpdate(); //這個很重要,回圈執行
}
}
138.NGUI Button 怎樣接受用戶點擊并呼叫函式,具體方法名稱是什么
1、主要是在UICamera腳本中用射線判斷點擊的物體并通過SendMessage呼叫OnClick() OnPress()等函式,可以說NGUI的按鈕是通過發訊息這個方式呼叫的,具體方法名稱是OnClick() 2、void Awake () { //獲取需要監聽的按鈕物件 GameObject button = GameObject.Find("UI Root/Button3"); //設定這個按鈕的監聽,指向本類的ButtonClick方法中, UIEventListener.Get(button).onClick = OnButton3Click; } private void OnButton3Click(GameObject button) { Debug.Log("我是按鈕3被點擊了"); }
139.<憤怒的小鳥>給予初速度以后,怎么讓小鳥受到重力和空氣阻力的影響而繪制拋物線軌跡,說出具體的計算方法.
Vector3 v 代表初速度 v’代表現在的速度, 假設小鳥是沿的 z 軸也就是 transform.forward方向運動的質量為 1,那么 v’=v-new Vector3(0,gt,ft),transform.Translate(v’)做的就是拋物線運動(g 為重力加速度不要用現實中的需要自己除錯,f 為阻力也要自己除錯設定,t 為時間)
140.當游戲中需要頻繁創建一個物體時,我們需要怎樣做能夠節省記憶體?
1、使用預制物體物件 Prefab
2、使用物件池技術,不使用時關閉,使用時打開
141.碰撞檢測需要物體具備什么屬性?
能檢測碰撞發生的方式有兩種,一種是利用碰撞器,另一種則是利用觸發器
【Physics.OverlapSphere 相交球檢測碰撞,碰撞檢測需要包圍盒】
142.Vector3.forward與Vector3(0,0,1)是一樣的意思對嗎?
對
143.下哪個函式在游戲進入新場景后會被馬上呼叫?
MonoBehaviour.OnLevelWasLoaded
144.itween 插件的作用是什么,itween 作用于世界坐標還是區域坐標,請列舉出 3 個其常用方法?
iTween 是一個影片庫,作者創建它的目的就是最小的投入實作最大的產出,讓你做開發更輕松,用它可以輕松實作各種影片,晃動,旋轉,移動,褪色,上色,控制音頻等等“方法:
a、MoveTo 物體移動;
b、ColorTo:隨著時間改變物件的顏色組;
c、LookTo:隨時間旋轉物體讓其臉部朝向所提供的 Vector3 或 Transform 位置;
145.U3D 中用于記錄節點空間幾何資訊的組件名稱,及其父類名稱
Transform 父類是 Component
146.NGUI:把子控制元件放在父控制元件里面,如何上下邊距都是10,
給子控制元件設定上下兩個錨點為10
147.如何使子控制元件居中,如果使用UGUI怎么實作
設定子控制元件錨點為中心
148.去掉敏感字的程式(手寫程式)
String s = “你是壞蛋”;
s.Replace(“壞蛋”, “**”);
149.unity3D從喚醒到銷毀有一段生命周期,列出系統自己呼叫的重要方法,
Awake ()
OnEnable ()
Start()
FixedUpdate()
OnTriggerXXX(Collider other)
OnCollisionXXX (Collision collisionInfo)
Update()
LateUpdate ()
OnGUI()
OnDisable ()
OnDestroy ()
150.Unity3d中resources目錄一般用來放些什么,打包的時候會有什么影響?
resource一般用來放置一些需要動態加載的資源,打包程式的時候會將Resource目錄下的全部檔案都加密壓縮打進包內,這樣再想使用assetbundle方式打小包的話就不行了
151.空間內一物體繞球面固定點(0、1、2)按照固定速度speed環繞運動,
public float Speed = 1;
void Update () {
transform.RotateAround (new Vector3(0,1,2),Vector3.up,Speed);
}
152.以下關于WWW.LoadFromCacheOrDownload描述正確的是: C
A.可被用于將Text Assets自動快取到本地磁盤
B.可被用于將Resource自動快取到本地磁盤
C.可被用于將Assets Bundles自動快取到本地磁盤
D.可被用于將任意的Unity資源檔案自動快取到本地磁盤
153.以下哪個函式在游戲進入新場景后會被馬上呼叫? C
A:MonoBehaviour.OnSceneWasLoaded
B:MonoBehaviour.OnSceneEnter
C:MonoBehaviour.OnLevelWasLoaded
D:MonoBehaviour.OnLevelEnter
154.關于MonoBehavior.LateUpdate函式描述錯誤的是: B
A.當MonoBehavior型別應用后,每幀呼叫一次
B.常被用于處理RigidBody的更新
C.在所有Update函式執行后才能被呼叫
D.常被用于實作跟隨相機效果,且目標物體的位置已經在Update函式中被更新
155.某個GameObject有一個名為MyScript的腳本,該腳本中有一個名為DoSomething的函式,則如何在該GameObject的另一個腳本中國呼叫該函式? A
A.GetComponent().DoSomething()
B.GetComponent
156.啟用MipMaps對記憶體的影響是? A
A.增加約33%的記憶體
B.減少約33%的記憶體
C.增加約25%的記憶體
D.減少約25%的記憶體
157.以下關于MonoBehaviour.OnGUI()的描述的是: D
A.如果MonoBehaviour沒有被啟用,則OnGUI函式不會被呼叫
B.用于繪制和處理GUI events
C.每幀可能會被繪制多次,每次對應于一個GUI event
D.每幀被呼叫一次
158.采用Input.mousePosition來獲取滑鼠在螢屏上的位置,以下表述正確的是: B
A.左上角為原點(0, 0),右下角為(Screen.Width, Screen.Height)
B.左下角為原點(0, 0),右上角為(Screen.Height, Screen.Width)
C.左下角為原點(0, 0),右上角為(Screen.Width, Screen.Height)
D.左上角為原點(0, 0),右下角為(Screen.Height, Screen.Height)
159.正確排列出下面Unity腳本自帶的函式執行順序Start,Awake,Update,OnUpdate,OnEnable,FixedUpdate,OnGUI,LateUpdate、OnDisable、OnDestory
Awake–>OnEnable–>Start–>Update–>FixedUpdate–>LateUpdate–>OnGUI–>OnDisable -->OnDestory
160.Unity中銷毀GameObject的方式,簡述Destroy和DestroyImmediate的區別
Destroy銷毀場景中的物體,但是記憶體中它還是存在的,只有當記憶體不夠時,機制才會將它銷毀并釋放記憶體,而DestroyImmediate會立即將物件銷毀,并且將記憶體釋放,
161.Unity中如何派發事件(訊息)
在腳本里的Update函式里呼叫EventDispatcher.Instance().OnTick();就可以了
162.ScriptObject的作用和使用方式
ScriptObject型別經常使用于存盤一些Unity本身不可以打包的一些object,比如字串,一些類物件,用這個型別的子型別可以用BuildPipeline打包成assetbundle包共后續使用,非常方便,
163.如何檢測物體是否被其他物件遮擋
使用射線進行檢測
164.寫一個角色控制器,滑鼠控制螢屏晃動,滑鼠控制開槍,
public class Player : MonoBehaviour {
public GameObject _prefabBullet;
private float _angleSpeed = 120f;
void Update() {
float eularY = Input.GetAxis("Mouse X") * _angleSpeed * Time.deltaTime;
transform.Rotate(new Vector3(0, eularY, 0));
if (Input.GetMouseButtonDown(0)) {
Instantiate(_prefabBullet, transform.position, transform.rotation);
}
}
}
165.敵人AI,有各種狀態,實作各種狀態之間的切換,
通過狀態機來實作各種狀態之間的切換
166.1.寫一個角色控制器,滑鼠控制螢屏晃動,滑鼠控制開槍,
2.敵人AI,有各種狀態,實作各種狀態之間的切換,
3.敵人會和主角對抗,敵人被打到之后,會閃一次紅色,然后紅色比例提升10%,10次攻擊之后,成紅色,
4.敵人會自動攻擊主角,主角也會有顏色變化,
5.敵人會在范圍內巡邏,
6.UI,左邊顯示8個AI的被攻擊次數,右邊顯示AI的攻擊次數排序,
public class Player : MonoBehaviour {
public Camera _camera;
public GameObject _prefabBullet;
private float _angleSpeed = 120f;
//生命值
private int _life = 10;
//玩家的狀態
private bool _state = false;
//是否被打到
public void IsState() {
if (_state && _life > 0) {
_life -= 1;
_state = false;
} else {
_state = true;
}
}
public void RoleRotate() {
float eularY = Input.GetAxis("Mouse X") * _angleSpeed * Time.deltaTime;
}
//風發射子彈
public void RoleShoot() {
if (Input.GetMouseButtonDown(0)) {
Instantiate(_prefabBullet, transform.position, transform.rotation);
}
}
}
public class Enemy : MonoBehaviour {
//敵人被打到狀態
private bool _state = false;
//玩家與敵人距離
private float _distance;
//角色
public GameObject _role;
//生命值
private int _life = 10;
//敵人被攻擊次數
private int _timeAccack = 0;
//敵人狀態
public void EnemyState() {
if (_distance >= 10f) {
if (_life >= 1 && _state == true) {
_life -= 1;
_timeAccack++;
}
_state = false;
}
else if (_distance >= 0 && _state == false) {
_state = true;
}
}
//敵人與玩家距離
public void Distance() {
_distance = Vector3.Distance(transform.position, _role.transform.position);
}
void OnGUI() {
GUI.TextArea(new Rect(20, 50, 80, 30), _timeAccack.ToString());
GUI.TextArea(new Rect(20, 90, 80, 30), _timeAccack.ToString());
GUI.TextArea(new Rect(20, 130, 80, 30), _timeAccack.ToString());
}
}
**
**
使用transform.localRotation = Quaternion.Slerp(Quaternion a,Quaternion b,float c)實作物體平滑轉向
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276282.html
標籤:其他
上一篇:表白小游戲
