發表文章

目前顯示的是 2017的文章
Related Posts Plugin for WordPress, Blogger...

3-13 Player Damage & Death Sound

圖片
本章要教大家播放受傷跟死亡的音效。首先請大家下載角色的音效,花了很多時間才找到滿意的免費音效: http://www.affordableaudio4everyone.com/Affordable%20SFX%204%20Everyone/Samples/ActionRPG_Characters/ActionRPG_Char_Samples.zip 另外這是該音效的官網,介紹是說有4290個音效,只要約600元的樣子,大家有興趣可以參考看看: http://www.affordableaudio4everyone.com/Affordable%20SFX%204%20Everyone/ActionRPG_Characters.html 但我還沒買,在目前的階段中,我們使用免費音效來測試程式是否能正常運作即可。往後要優化遊戲體驗時,再找更好的資源檔進行更換。 首先,先開啟File/Build Settings選項。 按下「Add Open Scenes」將目前的開啟的Scene加入,因為我們要製作當玩家死亡後會重新讀取關卡的功能,必須先將Scene登記在Build Settings中。 然後,在Player中加入Audio Source,這是用來播放音效的組件。 將Play On Awake選項關掉。 接著,請將剛剛下載的音效檔匯入,或者匯入自己預先準備的音效檔。 主要修改Player.cs及Enemy.cs。於Player.cs的TakeDamage方法中新增條件式判斷血量,血量不足時呼叫KillPlayer方法,這邊使用StartCoroutine的呼叫方式,是為了讓程式等待死亡音效播放完畢後,再重新載入場景。播放音效的部分,則用Random隨機函數挑選其中一個音效檔。 Enemy.cs的Update中,則增加了判斷玩家是否已死的條件式,當玩家死了以後就不要再攻擊玩家了。不然會發生Player喊著死亡音效的時候,Enemy還在拚命鞭屍的窘境。(ˊˋ) 最後,將音效拉入Damage Sounds跟Death Sounds即可。 以下提供本章修改的完整程式碼。 Player.cs: using System.Collections; using System.Collection

3-12 Game Feel

圖片
Game Feel是指遊戲的感覺,或是遊戲體驗,這種概念比較抽象,簡單來說是玩遊戲的體驗是否有符合你心中的『期望』,找出哪些要素會影響到你的遊戲?遊玩時有哪些問題影響遊戲的體驗? 比方說,我希望我的遊戲: Player的攻擊動作流暢,攻速快,被Enemy打中時會被打出去。 Player的動作要有翻滾,可以躲避Enemy的招式。 Player的技能要有補血、範圍技。 Player點擊怪物的時候會自動鎖定跟攻擊,玩家只要專注在翻滾跟施放技能 。 Enemy的攻擊速度較慢,體積大,被Player打時不會被中斷。 列出遊戲體驗以後,接著試玩自己的遊戲,看看還有哪些不符合的部分。 我現在玩遊戲時發現,敵人發射Projectile時,會一直射到自己,然後彈開,無法對Player造成傷害,畫面看起來又很滑稽。 或者是走到某個角落的時候,攝影機就會剛好卡在Terrain的畫面,結果Player就再也不能夠移動了。 最後是我的遊戲中,Player還不能翻滾,Enemy打中Player時也不會被打出去。諸如此類跟遊戲體驗的功能,是首先要完成的。完成以後再試玩看看,才能決定遊戲的感覺是不是跟想像中的畫面一樣,如果不一樣就還需要再修正。 再來是關於遊戲體驗中,我們要設計遊戲關卡、角色、技能時的三個參考要素: Soul :思考Enemy被打『幾次』就會死,思考數字就好。如Level 1打3次,Level 7打10次。如果是Level 7打Level 1的話是打1次。 Spine :排列遊戲的流程,Level 1...Level 2...Level 3。 Flesh :填滿每道關卡的內容,如Level 1要有3個Enemy,Level 2要有4個Enemy,Level 5讓玩家獲得新武器,Level 7讓玩家獲得新技能,原本Enemy用普攻要打10次,施放技能只要打3次。 上述三個要素是有順序性的,先從靈魂角度出發,再逐步完成骨架,填補血肉。填補血肉的時候,重視豐富度,我們要替關卡逐漸新增多個元素,增加新的武器、新的技能、新的Enemy,讓玩家可以選擇。 獲得新武器的時候,玩家就會思考,我現在是否該換掉舊的武器。通常新武器的設計會讓玩家更順利地打贏下一個敵人,但玩家也可能將舊的武器強化到足以應

3-11 Regenerating Energy Over Time

今天要來介紹一個小功能,讓Energy隨著時間慢慢回復。本章直接貼上程式碼,只要在Energy.cs的Update中加個條件式判斷,並再增加兩行程式碼即可完成功能。 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using RPG.CameraUI; namespace RPG.Character{ public class Energy : MonoBehaviour { [SerializeField] RawImage energyBarRawImage; [SerializeField] float maxEnergyPoints = 100f; [SerializeField] float regenPointPerSecond = 1f; float currentEnergyPoints; void Start () { currentEnergyPoints = maxEnergyPoints; } void Update(){ if (currentEnergyPoints < maxEnergyPoints) { AddEnergyPoint (); UpdateEnergyBar (); } } private void AddEnergyPoint(){ // 每秒自動恢復能量,由於Update是每個Frame都會執行,故須使用deltaTime取得Frame的間隔時間 float pointsToAdd = regenPointPerSecond * Time.deltaTime; currentEnergyPoints = Mathf.Clamp (currentEnergyPoints + pointsToAdd, 0, maxEnergyPoints); } public bool IsEnergyAvailable(float amount){ return amount <= currentEnergyPoints; } // 消耗

3-10 Create An Area Of Effect Ability

圖片
延續上一章跟大家介紹特殊技能系統,本章要製作範圍攻擊的技能,如果大家看不懂下面做的事情,請先看前一章唷。 3-9 Special Abilities System Overview https://rpgcorecombat.blogspot.tw/2017/12/3-9-special-abilities-system-overview.html 首先,請大家在Special Abilities資料夾中新增Area Effect資料夾。 在Area Effect資料夾中,新增兩個Script,AreaEffectBehaviour跟AreaEffectConfig。 由於本次要製作範圍攻擊,請大家先閱讀一下Untiy官方的介紹: https://docs.unity3d.com/ScriptReference/Physics.SphereCastAll.html Casts a sphere against all colliders in the scene and returns detailed information on each collider which was hit. This is useful when a Raycast does not give enough precision, because you want to find out if an object of a specific size, such as a character, will be able to move somewhere without colliding with anything on the way. 簡而言之,就是可以對場景中投射出一個球體,並返回所有碰撞到這個球體的詳細訊息。比方說我想要測試看看特定大小GameObjecy如Player角色,是否能夠在某處和其他的物件碰撞,就能使用SphereCastAll測試看看,本章要介紹的範圍攻擊亦能適用。可惜找不太到中文教學,似乎撰寫這方面介紹的中文文章不多。 AreaEffectBehaviour.cs: using System.Collections; using System.Collections.Generic; using UnityE

3-9 Special Abilities System Overview

圖片
本章要來介紹在Unity實作特殊技能系統,之前的文章已經向大家介紹過如何製作Energy Bar,並使用滑鼠的右鍵進行發動了。但是,舊的做法太過死板,無法動態的新增與更換技能,所以本次要來改進這個問題,依此利用ScriptableObject概念設計新的技能系統,可以在Inspector視窗進行各種客製化與增刪,非常方便。 如果不知道怎麼做Energy Bar,或是不知道什麼是ScriptableObject的話,請先看以下文章: 2-25 Introducing Scriptable Objects https://rpgcorecombat.blogspot.tw/2017/12/2-25-introducing-scriptable-objects.html 3-7 Adding An Energy Mechanic  https://rpgcorecombat.blogspot.tw/2017/12/3-7-adding-energy-mechanic.html 首先,請大家在專案中新增Special Abilities資料夾,並新增兩個Script檔案,分別為ISpecialAbility、SpecialAbilityConfig,再新增一個Power Attack資料夾。 先介紹ISpecialAbility,單純是一個interface定義了Use方法,為的是讓其他的Script呼叫這邊定義的Use方法來發動技能。如不懂interface的妙用,大家可以參考這篇文章: 2-14 Using Interfaces In C# https://rpgcorecombat.blogspot.tw/2017/12/2-14-using-interfaces-in-c.html 以下說明為了方便,將程式碼截圖一部份,最後面會提供所有修改的程式碼。 SpecialAbilityConfig則是用來儲存技能的設定,如energyCost就是發動技能要消耗的能量、AddComponent方法則是為了將技能發動後的持續發動效果套用至Player。更詳細地來說,AddComponent可以將繼承MonoBehaviour的物件套用到Player,如補血技能要每個Frame都持續加血,就會需要用到Update,故借用Add

3-8 Simplifying Click To Move And Click To Attack

圖片
本章主要是來重構一下我們的程式碼,由於過去的大幅增修使得CameraRaycaster過於繁瑣,這次要大幅簡化CameraRaycaster的程式碼。這章不會有太多的解說,總之重構的方向就是將Mouse Click的部分更專注於Walkable跟Enemy。 因為舊版的CameraRaycaster考量到新增Layer的需求,撰寫上多了很多額外的程式碼,原意上是為了未來增加Layer的彈性但如今卻是程式碼繁雜的主因。目前認為Layer只會分成Walkable跟Player,甚至連原本的Enemy Layer都會刪除。 如對舊版的CameraRaycaster有興趣,可以看以前的文章: 2-10 Fully Event Based Raycasting https://rpgcorecombat.blogspot.tw/2017/12/2-10-fully-event-based-raycasting.html 新版的CameraRaycaster將會使用兩個委派方法,OnMouseOverWalkable及OnMouseOverEnemy,好處將如下圖所示。PlayerMovement.cs省去了Switch方法,提高程式碼的可讀性。 同樣Energy.cs的程式也略為修改。 Player.cs的部分則因OnMouseOverEnemy回傳Enemy物件,使得程式碼更加簡潔。 另外的好處是,CursorAffordance.cs已經不需要了。那麼,接下來提供這次重構改掉的程式碼: CameraRaycaster.cs: using UnityEngine; using UnityEngine.EventSystems; using System.Collections.Generic; using RPG.Character; namespace RPG.CameraUI{ public class CameraRaycaster : MonoBehaviour { [SerializeField] Texture2D walkCursor = null; [SerializeField] Texture2D enemyCursor = null; [SerializeField] Vector2

3-7 Adding An Energy Mechanic

圖片
本章要來製作Energy Bar,當玩家按下滑鼠右鍵的時候會施放技能,導致Energy被消耗,Energy Bar也必須要有反應。由於我們之前已經製作過Health Bar,原理上相差不多,本次教學也大多是利用之前的素材,如有部分原理尚不了解的話,請先看看下列文章: 2-2 Player Health Bar UI https://rpgcorecombat.blogspot.tw/2017/12/2-2-player-health-bar-ui.html 2-10 Fully Event Based Raycasting  https://rpgcorecombat.blogspot.tw/2017/12/2-10-fully-event-based-raycasting.html 首先新增一個Energy.cs的Script檔。 Energy.cs的程式碼如下: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using RPG.CameraUI; namespace RPG.Character{ public class Energy : MonoBehaviour { [SerializeField] RawImage energyBarRawImage; [SerializeField] float maxEnergyPoints = 100f; [SerializeField] float pointPerHits = 10f; float currentEnergyPoints; CameraRaycaster cameraRaycaster; void Start () { cameraRaycaster = Camera.main.GetComponent (); currentEnergyPoints = maxEnergyPoints; cameraRaycaster.notifyRightMouseClickObservers += ProcessRightClcik; } pri

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。