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

歡迎回到我們的學習。

到目前為止,敵人的各種功能可以說是比較齊備了,但是作為玩家,卻只能被動挨打,不能主動攻擊。

因此,在本課的內容中,我們將實現對敵人的反擊。為此,我們需要學習Unity中Physics.Raycast的概念。

首先在官方API文檔中查看與之相關的定義:

docs.unity3d.com/Script

可以看到,在Unity中,Phys

ics.Raycast是從origin位置沿著direction的方向,發出一條長度為maxDistance的射線,而目標則是檢測場景中的所有碰撞體。

其中layerMask參數用來選擇性的過濾某些碰撞體。

queryTriggerInteraction參數用來指定該查詢是否應命中trigger。

具體可以參考下圖。

在了解了相關原理之後,接下來就是具體來實現了。

打開Unity編輯器,在Project視圖中,找到Assets-_Scripts文件夾,然後右鍵單擊,創建一個新的腳本文件,將其命名為ShootEnemy,在MonoDevelop中打開。

更改其中的代碼如下:

using System.Collections; nusing System.Collections.Generic; nusing UnityEngine; n//1.import namespacenusing UnityEngine.UI;nnpublic class ShootEnemy : MonoBehaviour {nn//2.創建到Button對象的引用npublic Button shootBtn;n//3.創建到主攝像機的引用npublic Camera fpsCam;nn// Use this for initializationnvoid Start () {nn}nn// Update is called once per framenvoid Update () {nn}n}n

以上代碼中只有注釋行1,2,3相關的代碼是我們添加的,大家直接看注釋就明白每行代碼的作用了,這裡就不再贅述。

接下來回到Unity編輯器,在Hierarchy視圖中找到Canvas對象,

然後右鍵單擊,選擇UI-Button,創建一個新的按鈕,並將其命名為btn_Shoot。刪除按鈕所對應的文本,然後切換到Game視圖。

保持選中btn_Shoot對象,在Rect Transform中設置錨點類型為bottom right。

然後設置Pos X和Pos Y,使得按鈕顯示在合適的位置。

然後更改按鈕的Image組件的Source Image屬性為UIMask,更改

Rect Transform中的Width 和Height 為300,300

設置好了按鈕之後,在Hierarchy視圖中選擇CameraParent對象下面的MainCamera,然後右鍵單擊,創建一個空的遊戲對象,將其命名為weapon1。

在Inspector視圖中點擊Add Component,然後選擇ShootEnemy。

在Shoot Enemy組件的屬性中,將Shoot Btn設置為btn_Shoot按鈕,將Fps Cam設置為Main Camera。

接下來打開ShootEnemy.cs,並添加對事件的響應代碼,更改後的代碼如下:

using System.Collections;nusing System.Collections.Generic;nusing UnityEngine;n//import namespacenusing UnityEngine.UI;nnpublic class ShootEnemy : MonoBehaviour {nn//創建到Button對象的引用npublic Button shootBtn;n//創建到主攝像機的引用npublic Camera fpsCam;nn// Use this for initializationnvoid Start () {nn//1.添加按鈕的響應事件nshootBtn.onClick.AddListener (OnShoot);n}nnvoid OnShoot(){nn//2.定義一個RaycastHit類型變數,用於保存檢測信息nRaycastHit hit;nn//3.判斷是否檢測到命中敵人nif (Physics.Raycast (fpsCam.transform.position, fpsCam.transform.forward, out hit)) {nn//destroy enemynn//instantiate blood effectnn//load shooting effectnn//4.輸出所命中的對象名稱nDebug.Log (hit.transform.name);n}nn}nn// Update is called once per framenvoid Update () {nn}n}n

按照注釋行編號簡單解釋一下:

1.這裡添加射擊按鈕的響應方法,OnShoot 2.這裡定義了一個RaycastHit類型的變數,用於保存檢測信息

3.使用Physics.Raycast方法來判斷是否檢測到命中敵人

4.在實現具體的效果之前,先在Console中輸出所命中的對象名稱。

回到Unity編輯器,點擊Play按鈕預覽遊戲效果。在Game視圖中點擊Start Game,移動主攝像機的位置,然後點擊屏幕右下角的按鈕,可以在Console面板中看到所命中的對象名稱。

接下來讓我們完善命中敵人後的具體效果。

首先在Project視圖中找到Assets-_Prefabs文件夾,選擇zombieEnemy這個預設體,然後在Inspector面板中點擊Add Component,添加一個新的腳本,命名為Enemy。

在MonoDeve

lop中將其打開,並更改代碼如下:

using System.Collections; nusing System.Collections.Generic; nusing UnityEngine; nnpublic class Enemy : MonoBehaviour { nn//1.設置敵人的生命值 npublic float health = 30f; nn// Use this for initialization nvoid Start () { n} nn//敵人受到傷害後的處理 npublic void TakeDamage(float damage){ nn//2.敵人生命值減少特定的數值 nhealth -= damage;nn//輸出敵人生命值 print (health); nn//3.當敵人生命值變為0的時候,就死亡 nif (health <= 0) { nn//4.Enemy Die nDie (); n} n} n//敵人死亡 nvoid Die(){ nn//5.在1秒鐘後銷毀敵人對象 nDestroy (gameObject, 1f); n} n} n

這裡還是按照注釋行的數字編號來解釋下相關代碼。

1.設置敵人的生命值變數

之所以設置為public類型,是因為我們將在Enemy.cs之外的代碼中訪問該變數

2.讓敵人的生命值減少特定的數值

3.當敵人生命值減少為0時,就進入死亡狀態

4.調用敵人死亡的方法

5.使用Destroy方法,在1秒鐘後銷毀當前敵人對象。

接下來切換到ShootEnemy.cs,更改後的代碼如下:

using System.Collections; nusing System.Collections.Generic; nusing UnityEngine; n//import namespace nusing UnityEngine.UI; nnpublic class ShootEnemy : MonoBehaviour { n//創建到Button對象的引用 npublic Button shootBtn; nn//創建到主攝像機的引用 npublic Camera fpsCam; nn//1.設置敵人每次受到傷害的數值 npublic float damage = 10f; nn// Use this for initialization nvoid Start () { nn//1.添加按鈕的響應事件 nshootBtn.onClick.AddListener (OnShoot); n} nnvoid OnShoot(){ n n//定義一個RaycastHit類型變數,用於保存檢測信息 nRaycastHit hit; nn//判斷是否檢測到命中敵人 nif (Physics.Raycast (fpsCam.transform.position, fpsCam.transform.forward, out hit)) { n//2.獲取所受攻擊的敵人 nEnemy target = hit.transform.GetComponent<Enemy>(); nn//3.destroy enemy nif (target != null) { nntarget.TakeDamage (damage); nn } n//instantiate blood effect n//load shooting effect n//輸出所命中的對象名稱 nDebug.Log (hit.transform.name); n } n} n// Update is called once per framenvoid Update () {nn}n}n

按照注釋行的數字編號來簡單解釋一下:

1.這裡設置了敵人每次受到傷害的數值

2.使用hit信息獲取所受攻擊的敵人對象

3.如果敵人對象不為空,那麼調用Enemy.cs中的TakeDamage方法,讓其生命值減少。

回到Unity編輯器,點擊工具欄上的Play按鈕預覽遊戲效果。

可以看到每次敵人受到攻擊時,都會在Console中顯示敵人的當前生命值。

為了讓我們方便攻擊敵人,這裡我們再添加一個準星。

在Unity編輯器中切換到Asset Store,搜索crosshair,然後找到下面這個插件。

下載並導入該插件,並將其歸入Components文件夾。

在Hierarchy視圖中選擇Canvas,右鍵單擊,選擇UI-Image,添加一個新的I

mage控制項,將其更名為Crosshair。然後在Inspector視圖中將Image組件的Source Image屬性更改為3這個紋理圖片。

好了,此時在Game視圖中可以看到多了一個準星。

推薦閱讀:

Unity 內存優化 和 內存池使用實踐
Unity3D熱更新LuaFramework入門實戰(2)——資源熱更新
【補遺】基於體積的大氣散射Shader
聚焦9.8直播 | UI製作大師初養成!

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