本文章是關(guān)于Unity3D官方Demo(Roll-A-Ball)的知識(shí)點(diǎn)總結(jié)。
移動(dòng)角色:
-
FixedUpdate只在有關(guān)物理計(jì)算時(shí)調(diào)用,所以有關(guān)物理效果的代碼寫在這里 -
Input.GetAxis:根據(jù)坐標(biāo)軸名稱返回虛擬坐標(biāo)系中的值,范圍在 -1 與 1 之間。有過渡效果 - 我們通過給角色施加力來移動(dòng)角色。我們首先需要獲取 Rigidbody 組件,然后調(diào)用
AddForce方法來施加力。AddForce方法參數(shù)為一個(gè)Vector3類型變量 -
Time.deltaTime:以秒計(jì)算,完成最后一幀的時(shí)間(只讀)。我們可以使用Time.deltaTime使移動(dòng)更加平滑
// 實(shí)例代碼
void FixedUpdate(){
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal , 0.0f, moveVertical ); // 因?yàn)橹辉谝粋€(gè)平面上移動(dòng),所以y設(shè)置為0.0f
GetComponent<Rigidbody>().AddForce(movement* speed*Time.deltaTime);
}
移動(dòng)攝像機(jī):
- 將 Camera 的父節(jié)點(diǎn)設(shè)置為角色,這樣當(dāng)角色移動(dòng)時(shí),Camera 也會(huì)跟著移動(dòng),但角色旋轉(zhuǎn)時(shí),Camera 也會(huì)跟著旋轉(zhuǎn),不符合需求
- 一般情況下,我們希望 Camera 以一個(gè)相對(duì)的距離跟隨角色移動(dòng),但不會(huì)跟著角色旋轉(zhuǎn)。那么,我們最好使用代碼進(jìn)行控制。
-
LateUpdate:LateUpdate是在所有Update函數(shù)調(diào)用后被調(diào)用。這可用于調(diào)整腳本執(zhí)行順序。例如:當(dāng)物體在Update里移動(dòng)時(shí),跟隨物體的相機(jī)可以在LateUpdate里實(shí)現(xiàn)。
// 相機(jī)控制腳本
public GameObject player; // 在編輯器里需要和對(duì)應(yīng)控件綁定。
private Vector3 offset;
void Start(){
offset = transform.position; // 獲取當(dāng)前坐標(biāo)作為offset
}
void LateUpdate(){
transform.position = player.transform.position + offset; // 使相機(jī)與角色保持一個(gè)相對(duì)的距離
}
游戲區(qū)域及拾取物體:
- 這個(gè)游戲中我們的游戲區(qū)域是正方形,我們可以使用 Cube 作為 Wall 來限定游戲的區(qū)域
- 拾取物體 有多個(gè)時(shí),我們可以使用 Prefab 來保存,這樣當(dāng)我們修改 Prefab 時(shí),所有的 拾取物體 都會(huì)修改
- 創(chuàng)建 Wall 與 拾取物體
- 我們可以修改 拾取物體 的 tag 來標(biāo)志改物體,這樣后續(xù)的碰撞檢測(cè)時(shí)我們就能區(qū)分拾取物體與其他
- 為了讓 拾取物體 更加顯眼,我們可以使用
Rotate旋轉(zhuǎn) 拾取物體
角色移動(dòng):
- 為了實(shí)現(xiàn)角色接觸到 拾取物體 時(shí),拾取物體 消失。我們需要把 拾取物體 的碰撞器設(shè)置為觸發(fā)器。然后使用
OnTriggerEnter方法來檢測(cè) - 需要注意的是,我們把 拾取物體 改為了每幀旋轉(zhuǎn)。計(jì)算碰撞時(shí),靜態(tài)物體不會(huì)被影響,動(dòng)態(tài)物體會(huì)被影響。物理引擎有"碰撞器"重疊發(fā)生時(shí),物理引擎還在計(jì)算碰撞器體積并追蹤碰撞器的重疊,但不會(huì)在碰撞重疊的物體上體現(xiàn)出來,因?yàn)檫@不叫碰撞。所以我們使用觸發(fā)器的方法。
- 任何含有Rigidbody的組件會(huì)被當(dāng)作動(dòng)態(tài)物體,反之則為靜態(tài)物體。
- 靜態(tài)物體不會(huì)移動(dòng),動(dòng)態(tài)物體可以移動(dòng),他們含有Rigidbody,標(biāo)準(zhǔn)的Rigidbody通過作用力移動(dòng),Kinematic Rigibody通過Transform移動(dòng)。
// 角色控制腳本
void OnTriggerEnter(Collider other){
if(other.gameObject.tag == "PickUp"){ // 這個(gè)PickUp 是我們拾取物體的 tag
other.gameObject.SetActive("false");
}
}
發(fā)布:
- “File -> Build Settings”,選擇需要發(fā)布的平臺(tái),添加需要包含的場(chǎng)景,點(diǎn)擊 build 就完成了