從零開始學基於ARKit的Unity3d遊戲開發系列6

歡迎回到我們的學習。

在這一課的內容中,我們將給殭屍敵人添加碰撞檢測機制。

當敵人碰到Main Camera(也就是玩家)時,敵人將發起攻擊。而為了實現這一點,我們需要添加碰撞檢測。

在Unity編輯器的Hierarchy視圖中選擇z@walk遊戲對象,然後在Inspector視圖中點擊Add Component,搜索Rigidbody,並將其添加到當前遊戲對象上。

此時還需要再添加一個Box Collider組件,添加完成後的Inspector視圖如下圖:

在添加了Box Collider之後,可以看到殭屍敵人的周圍出現一個綠色的盒子,接下來我們要設置Box Collider的大小。

點擊Box Collider組件下面的Edit Collider,然後直接調整相關的大小,到覺得合適位置。

現在已經給敵人添加好了Box Collider,還需要給代表玩家的Main Camera添加碰撞機制。

在Hierarchy視圖中選擇Main Camera,然後點擊Inspector視圖中的Add Component,並添加一個Box Collider。

接下來我們還需要給敵人添加一個新的互動腳本,用來處理碰撞檢測的相關事件。

在Hierarchy視圖中選擇z@walk遊戲對象,然後點擊Inspector視圖中的Add Componen

t,並添加一個新的腳本文件,將其命名為CollisionWithCamera。

我們將添加三個方法來實現碰撞檢測。雙擊在MonoDevelop中打開該文件,並更改其代碼如下:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CollisionWithCamera : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } //碰撞開始 void OnCollisionEnter (Collision col) { //判斷碰撞體中是否有主攝像機 if (col.gameObject.tag == "MainCamera") { Debug.Log ("enter"); } } //碰撞結束 void OnCollisionExit(Collision col){ //判斷碰撞體中是否有主攝像機 if (col.gameObject.tag == "MainCamera") { Debug.Log ("exit"); } } void Attack(){ } }

這裡我們添加了三個方法,其作用如下:

(1)OnCollisionEnter

該方法用來獲取碰撞開始事件,並作出相應的反應。

在這段代碼中我們獲取了碰撞體的tag標誌,如果該標誌和MainCamera一致,則表明碰撞體的另一方是主攝像機。

如果是,則輸出結果」enter」

(2)OnCollisionExit

該方法用來獲取碰撞結束事件,並作出相應的反應。

在這段代碼中我們獲取了碰撞體的tag標誌,如果該標誌和MainCamera一致,則表明碰撞體的另一方是主攝像機。

如果是,則輸出結果「exit」。

(3)Attack

該方法將在後面添加敵人的攻擊行為。

注意:

以上的OnCollisionEnter和OnCollisionExit方法的首字母必須是大寫,否則無法生效。

回到Unity的主編輯器,點擊Play按鈕來預覽效果。

現在敵人將朝著主攝像機的方向行走,拖動主攝像機,當其和敵人碰在一起時,在Unity編輯器下方的Console視圖中將輸出enter,當碰撞結束時,將輸出exit。

接下來讓我們定義幾個變數。

然後更改OnCollisionEnter和OnCollisionExit方法中的輸出結果代碼。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CollisionWithCamera : MonoBehaviour { //1.敵人是否在場 public bool zombieIsThere; //2.計時器 float timer; //3.兩次攻擊之間的間隔 int timeBetweenAttack; // Use this for initialization void Start () { //4.定義初始數值 timeBetweenAttack = 2; } // Update is called once per frame void Update () { //5.獲取系統時間 timer += Time.deltaTime; // print (timer); //6.判斷敵人是否在場,而且攻擊間隔大於2秒 if (zombieIsThere && timer >= timeBetweenAttack) { //7.開始攻擊動作 Attack (); } } //碰撞開始 void OnCollisionEnter (Collision col) { //判斷碰撞體中是否有主攝像機 if (col.gameObject.tag == "MainCamera") { // Debug.Log ("enter"); //8.確認敵人在現場 zombieIsThere = true; } } //碰撞結束 void OnCollisionExit(Collision col){ //判斷碰撞體中是否有主攝像機 if (col.gameObject.tag == "MainCamera") { // Debug.Log ("exit"); //9.設置敵人不在現場 zombieIsThere = false; } } //攻擊指令 void Attack(){ //10.恢復計時器為0 timer = 0; //11.輸出結果 Debug.Log ("attack"); } }

下面按照數字編號來解釋一下相關的代碼:

(1)public bool zombieIsThere;

這裡我們定義了一個public bool類型的變數,public表示其它類也可以訪問這個變數,而bool則是變數的具體類型。

所謂的bool類型是一種邏輯判斷類型,它只有兩個數值,true或者false,代表「是」與「否」。

(2)float timer;

這裡定義了一個float類型的變數,用來保存系統時間。

float是一種數據類型,用來保存浮點類的數據

(3)int timeBetweenAttack;

這裡定義了一個int類型的變數,用來保存兩次攻擊之間的時間間隔。

(4)在Start方法中,我們定義了timeBetweenAttack的初始值。

Start()是Unity提供的一種事件函數,在場景啟動的時候就會自動執行其中的代碼。

(5)我們使用Time.deltaTime來獲取系統時間

(6)這裡使用了邏輯判斷,&&是邏輯與的意思,表示符號左右的兩個條件必須同時滿足,才能執行後面的動作。

(7)調用攻擊動作的方法。

(8)當碰撞開始時,把zombieIsThere這個bool類型的變數數值設置為true

(9)當碰撞結束時,把zombieIsThere這個bool類型的變數數值設置為false

(10)當攻擊開始時,恢復計時器為0.

(11)輸出結果,表示攻擊開始。

接下來回到Unity的主編輯器,點擊Play來預覽遊戲效果。

當敵人開始攻擊時,可以看到Console視圖中出現了attack提示。

這樣,我們已經驗證了遊戲的基本邏輯。

接下來,我們讓敵人在攻擊時播放攻擊的動畫,而不僅僅在console中輸出一個提示。

更改Attack方法的代碼如下:

//攻擊指令 void Attack(){ //10.恢復計時器為0 timer = 0; //11.輸出結果 // Debug.Log ("attack"); //12.播放攻擊動畫 GetComponent<Animator>().Play("attack"); }

在編號12的代碼中,我們使用GetComponent<Animator>函數獲取了當前遊戲對象的Animator組件,然後讓其播放attack動畫。

問題來了,我們在設計敵人的Animator動畫控制器時,並沒有添加attack動畫。

因此讓我們回到Unity編輯器,在Project視圖中找到zombieController,雙擊打開Animator視圖。

從Project視圖中找到Assets-Components-Zombie-Model中的z@attack預設體,展開右三角,會看到裡面有一個attack動畫片段,將其拖動到Animator視圖中。

右鍵單擊attack動畫片段,選擇Make Transition,然後拖一條線到walk動畫片段上。

因為我們希望當攻擊動畫播放結束時,殭屍敵人會回到walk這個動作狀態上來。

在Unity編輯器中點擊Play按鈕,預覽遊戲效果,會看到如我們所設想的那樣,當敵人碰到主攝像機並滿足條件時,會開始播放攻擊動畫。而當我們移走主攝像機時,敵人又回到正常的行走動畫。

好了,今天的學習到此結束。

推薦閱讀:

比預想的更複雜——動態斷肢實現
Lua性能優化(一):Lua內存優化
Unity/C++混合編程全攻略!——基礎準備
UWA 兩周年慶活動第一彈!四場技術直播領跑六月充電季!
基於 Unity 引擎的遊戲開發進階之 全局光照

TAG:虚拟现实技术 | Unity游戏引擎 |