Roll-A-Ball(Unity3D官方實(shí)例)

本文章是關(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)系中的值,范圍在 -11 之間。有過渡效果
  • 我們通過給角色施加力來移動(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 就完成了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容