發表文章

目前顯示的是有「Untiy 敵人攻擊與移動」標籤的文章
Related Posts Plugin for WordPress, Blogger...

4-18 Create A Magic Wand And Spawn Fireball

圖片
今天要來製作魔法杖!這是要用來給大Boss使用的,但如果大家還記得我們製作的Weapon System的話,就知道製作的武器不但能給Enemy使用,也能給Player使用唷! 當玩家打完大Boss以後,就會掉落一根魔法杖在地上,玩家可以撿拾起來並更換成魔法杖,使用Boss的武器應該都是每個RPG要有的橋段吧!如果對玩家撿拾武器並跟換的系統不熟悉的話,請先參考以前的文章唷: 4-3 Weapon Pickup Points https://rpgcorecombat.blogspot.tw/2018/01/4-3-weapon-pickup-points.html 另外魔法杖的製作,也牽涉到之前做的弓箭武器,也可以先複習這篇文章: 4-15 Finishing The Weapon System https://rpgcorecombat.blogspot.tw/2018/01/4-15-finishing-weapon-system.html 首先,我用網球的3D模型當作火球的基底,這顆網球模型在Unity Standard Asset裡面有提供唷。 接著,我將Unity提供的粒子系統範例(FlamesParticleEffect)拉進火球中,效果如下圖。 接著,我再拉一個爆炸效果的粒子系統(BigExplosionEffect)到火球中。 記得在BigExplosionEffect的設定中,要將Looping跟Play On Awake關掉唷! 接著來修改Projectile.cs的程式碼吧! using System.Collections; using System.Collections.Generic; using UnityEngine; using RPG.Core; using RPG.Character; namespace RPG.Weapons{ public class Projectile : MonoBehaviour { [SerializeField] AudioClip shotSound; [SerializeField] AudioClip collisionSound; [SerializeField] GameObject explo...

4-13 Automatic Repeat Attacking

圖片
繼上一章我們成功建立了Enemy AI後,本章要來撰寫讓敵人、玩家在鎖定目標後自動攻擊的方法。首先,我們先解決之前發生在Enemy AI的一些Bug。 第一個Bug是敵人死後,物件無法成功銷毀。後來發現在KillCharacter中開頭的StopAllCoroutines,這段程式碼會導致KillCharacter方法於執行yield return後就會被自動關閉,所以後面的玩家重載關卡以及敵人死亡要銷毀物件,都不會執行。 先前這段方法是放在Player中,所以為了讓Player在死亡後不再繼續攻擊,才使用StopAllCoroutines,如今重構後的程式碼,已將攻擊程式移動到WeaponSystem,所以請大家放心將這段刪除吧。 所以,我們會在WeaponSystem內撰寫這段程式,需要讓角色停止攻擊時,便呼叫WeaponSystem.StopRepeatedlyAttack。 如下圖,PlayerMovement中的OnMouseOverWalkable方法,當玩家點擊地面要進行移動時,我們要取消Player的自動攻擊。 好的,簡單介紹一下要撰寫在WeaponSystem的自動攻擊方法,首先while迴圈的條件式需確認攻擊者跟目標都活著,若有一方死亡就會停止自動攻擊。再來計算自動攻擊的間隔時間,我們會從Weapon設定中取得MinTimeBetweenHits參數,並將動畫加速的倍率乘以間隔時間,取得真正的間隔時間。確認目前時間大於間隔時間後,呼叫AttackTargetOnce方法進行攻擊。 AttackTargetOnce的大部分程式碼皆有撰寫註解,主要注意的是我們應該延遲一小段時間在再呼叫Target的TakeDamage方法,不然玩家剛開始揮劍,還未碰到敵人便看見敵人的血量減少,實在很奇怪!延遲時間應該從Weapon設定取得,由設計師決定延遲多久。不過於此我們先暫時設定0.25秒吧。 OK!以上就是自動攻擊的寫法,以下提供有修改到的完整程式碼: WeaponSystem.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Assertions; usi...

4-12 Enemy AI Behaviour

圖片
本章要來製作新的Enemy AI啦!分為巡邏、追擊、攻擊三種狀態,敵人一開始會在原地的附近巡邏,當玩家靠近敵人以後便會開始追擊,一旦進入攻擊範圍就會開始攻擊玩家。 首先,我們將Enemy更名為EnemyAI。記得因為Class名稱改變的關係,有使用到Enemy的地方都會變成Nothing Selected,前幾章都有教大家如何更換,所以就不再贅述了。 以下針對幾行關鍵的程式碼進行解說,然後會再放完整程式碼給大家。我們先定義一個enum型別名為State,裡面有四種狀態idle, patrolling, attacking, chasing。 在Update中,我們先是判斷玩家與敵人之間的距離,若距離小於『追擊半徑』,便停止其他狀態,啟動追擊狀態。同理,若距離小於『攻擊半徑』,同樣停止其他的狀態並啟動攻擊狀態。 如下圖為追擊狀態的程式碼,我們使用character系統提供的移動功能追擊玩家。 如下圖為攻擊狀態的程式碼,使用Weapon System攻擊玩家,Weapon System會自動根據武器的動作更換Attack Animation。所以說,前半段我們如此辛苦的重構,在這邊就馬上體現出價值了!Enemy的攻擊模式跟自由度比過去高非常多。 接著來製作巡邏狀態吧。如下圖,請大家在場景中新增一個Empty GameObject,取名為Patrol Path,並於底下新增幾個GameObject取名為WayPoint,這些WayPoint將作為Enemy的巡邏座標。 如圖,讓我們佈置一下巡邏點吧。 是否發現這些巡邏點很不容易看到呢! 所以,接下來我們使用Gizmos來繪製巡邏點!請於Project視窗新增Script,名為WaypointContainer。 WaypointContainer程式碼如下: using System.Collections; using System.Collections.Generic; using UnityEngine; namespace RPG.Character{ public class WaypointContainer : MonoBehaviour { void OnDrawGizmos(){ Vector3 fir...

4-11 Extracting WeaponSystem

圖片
今天的重構要來分離PlayerMovement中的武器設定到WeaponSystem,包含攻擊、致命一擊、更換武器等功能,如此一來,往後的Enemy也能夠裝上武器系統了呢,就能讓Enemy的手中套用武器跟攻擊動作了! 首先,我在Character新增了一個Base Script資料夾,往後不管是Player, Enemy, NPC等角色都能到此資料夾選擇加裝不同的系統。然後請大家新增一個Script名為WeaponSystem。 如下圖為重構完成後的WeaponSystem,大家應該能夠從參數中看出來本次要從PlayerMovement中移動哪些程式碼到WeaponSystem吧,可以先自行試試看唷。 以下提供修改好的PlayerMovement與WeaponSystem程式碼。 PlayerMovement: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using RPG.CameraUI; using RPG.Core; using RPG.Weapons; namespace RPG.Character{ public class PlayerMovement : MonoBehaviour { [SerializeField] float walkMoveStopRadius = 0.2f; [SerializeField] float attackMoveStopRadius = 5f; float currentHealthPoint; Enemy currentEnemy; Character character; SpecialAbilities abilities; WeaponSystem weaponSystem; void Start(){ abilities = GetComponent (); character = GetComponent (); weaponSystem = GetComponent (); RegisterForMouseClcik ...

4-4 Eliminate AICharacterControl

圖片
今天繼續來重構!這次要簡化AICharacterControl,請大家先注意本篇文章的重構會導致Enemy暫時無法追蹤玩家,不過沒關係,因為本次重構計畫將Player與Enemy相似的部分程式碼合併,所以後續的文章會再補上這個功能,就請一直跟著每篇文章進行重構吧。 首先請將Player中的PlayerMovement.cs改名為CharacterMovement.cs,這要讓Player跟Enemy都共用。更名完成後,應該會發現Player中原本的元件寫著Nothing Selected,就請放心的移除他吧。 AI Character Control這個元件,也同樣放心的移除吧! 然後,下列是將AICharacterControl與CharacterMovement合併後的程式碼: using System; using UnityEngine; using UnityEngine.AI; using UnityStandardAssets.Characters.ThirdPerson; using RPG.CameraUI; namespace RPG.Character{ [RequireComponent(typeof (NavMeshAgent))] [RequireComponent(typeof (ThirdPersonCharacter))] public class CharacterMovement : MonoBehaviour { [SerializeField] float walkMoveStopRadius = 0.2f; [SerializeField] float attackMoveStopRadius = 5f; ThirdPersonCharacter character = null; NavMeshAgent agent = null; private void Start() { CameraRaycaster cameraRaycaster = Camera.main.GetComponent (); character = GetComponent (); agent = GetComponent (); agen...

3-6 Enemy Mesh Antics

圖片
總算要讓Enemy的造型擺脫Ethan了!首先請大家下載課程提供的Enemy檔案: https://drive.google.com/open?id=18CragjBPbgWaCSPs2a2sL2VDTzPzfQJt 然後匯入: 大家可以試著將模型拉進場景中看看,不要懷疑,因為現在的模型還未完全完成,所以是純白的樣子。 接著,我來示範替換Archer的造型,首先將原本的Archer拉進場景中,跟我們新的Archer重疊在一起。 將舊的Archer中屬於Ethan的部分刪除,如EthanBody、EthanGlasses、EthanSkeleton。 再將Archer底下的Archer跟Armature的拉進去。 然後,要記得Avater的部分要將舊的EthanAvatar更換為ArcherAvatar,否則無法正常運作唷。 因為純白色的Archer醜醜的,我先用專案內現有的Material裝飾一下。 最後,我們執行遊戲看看!發現Archer可以正常跑步嘍!就算原本用預設的Ethan來製作Enemy,事後都還是可以換成其他模型,而且原本的程式跟數值都不用重新調整!記得,改完以後要記得按下Apply套用到其他prefab。