3-24 Finishing The AOE And Self Heal Particle Effect
本章要來做最後的技能效果美化啦,將會有絢麗的粒子特效跟技能音效,同時也會跟大家介紹下載位置跟匯入方式。首先先貼上下載的位址吧,若是有看過舊文章的人應該已經下載過了:
Unity Particle Pack
https://www.assetstore.unity3d.com/en/#!/content/73777
Fantasy SFX for Particle Distort Texture Effect Library
https://www.assetstore.unity3d.com/en/#!/content/42146
如果不懂技能系統的話,大家可以從本網誌的標籤觀看一系列相關的文章唷!
https://rpgcorecombat.blogspot.tw/search/label/Unity%20%E7%AF%84%E5%9C%8D%E6%94%BB%E6%93%8A%E6%8A%80%E8%83%BD
OK!接下來進入正題吧。首先,我先從Unity Particle Pack中選擇了BigExplosionEffect,拉入場景中調整一下大小跟位置,先看看這個效果是不是我想要的。
設定完成後,拉進Project視窗內變成Prefab,並取名為Power Attack L1 VFX。
點選Power Attack L1的設定,將Power Attack L1 VFX拉進Particle Prefab的參數中,Audio Clip我挑選了msfx_explosion_1_explode。
執行遊戲試玩看看吧!哇,煙硝瀰漫、塵土飛揚,這個爆炸效果做得真好。
火焰都從煙霧中彈射出來了,很漂亮的效果。另外,因為我調整了Power Attack的Script,讓粒子系統可以綁定在Enemy身上,使得效果更炫也更合理,最下面會再提供修改後的完整程式碼給大家。
再來是治癒技能要使用的效果,由於在Unity Particle Pack挑選不到我喜歡的特效,所以我上網找了個教學自行製作,大概只要花20分鐘左右就可以做好。
Unity 5 - Game Effects VFX - Healing Spell
https://www.youtube.com/watch?v=O8Qm8DQZv5A
滿推薦這個作者的教學,效果很炫,製作時間也不長。
製作好以後存成Prefab,我取名為Self Heal L1 VFX,然後Audio Clip選擇sfx_shield。
再來簡單介紹一下播放技能音效的部分有更改,改成AddComponent的方式,新增AudioSource播放音效,等音效播放完以後再刪除。原先舊的寫法會導致前一個音效還沒播放完畢,玩家施放下一個技能時音效立即就被蓋過去了。
完成,接下來補齊三個技能的完整程式碼,以及為了讓粒子系統綁定到Enemy身上,也稍稍修改了AbilityParams:
AreaEffectBehaviour.cs:
PowerAttackBehaviour.cs:
SelfHealBehaviour.cs:
SpecialAbilityConfig.cs:
Unity Particle Pack
https://www.assetstore.unity3d.com/en/#!/content/73777
Fantasy SFX for Particle Distort Texture Effect Library
https://www.assetstore.unity3d.com/en/#!/content/42146
如果不懂技能系統的話,大家可以從本網誌的標籤觀看一系列相關的文章唷!
https://rpgcorecombat.blogspot.tw/search/label/Unity%20%E7%AF%84%E5%9C%8D%E6%94%BB%E6%93%8A%E6%8A%80%E8%83%BD
OK!接下來進入正題吧。首先,我先從Unity Particle Pack中選擇了BigExplosionEffect,拉入場景中調整一下大小跟位置,先看看這個效果是不是我想要的。
設定完成後,拉進Project視窗內變成Prefab,並取名為Power Attack L1 VFX。
點選Power Attack L1的設定,將Power Attack L1 VFX拉進Particle Prefab的參數中,Audio Clip我挑選了msfx_explosion_1_explode。
執行遊戲試玩看看吧!哇,煙硝瀰漫、塵土飛揚,這個爆炸效果做得真好。
火焰都從煙霧中彈射出來了,很漂亮的效果。另外,因為我調整了Power Attack的Script,讓粒子系統可以綁定在Enemy身上,使得效果更炫也更合理,最下面會再提供修改後的完整程式碼給大家。
Unity 5 - Game Effects VFX - Healing Spell
https://www.youtube.com/watch?v=O8Qm8DQZv5A
滿推薦這個作者的教學,效果很炫,製作時間也不長。
製作好以後存成Prefab,我取名為Self Heal L1 VFX,然後Audio Clip選擇sfx_shield。
再來簡單介紹一下播放技能音效的部分有更改,改成AddComponent的方式,新增AudioSource播放音效,等音效播放完以後再刪除。原先舊的寫法會導致前一個音效還沒播放完畢,玩家施放下一個技能時音效立即就被蓋過去了。
完成,接下來補齊三個技能的完整程式碼,以及為了讓粒子系統綁定到Enemy身上,也稍稍修改了AbilityParams:
AreaEffectBehaviour.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using RPG.Core; namespace RPG.Character{ public class AreaEffectBehaviour : MonoBehaviour, ISpecialAbility { AreaEffectConfig config; public void SetConfig(AreaEffectConfig config){ this.config = config; } public void Use(AbilityParams useParams){ DealRadiaDamage (useParams); PlayParticleEffect (); PlayEffectAudio (); } private void PlayEffectAudio(){ // 生成新的音效Component AudioSource myAudioSource = gameObject.AddComponent(); // 從config取得技能音效 myAudioSource.clip = config.GetAudioClip (); // 播放技能音效 myAudioSource.Play (); // 銷毀音效物件 Destroy (myAudioSource, myAudioSource.clip.length); } private void PlayParticleEffect(){ // 初始化粒子系統,綁定到Player身上 GameObject particlePrefab = Instantiate(config.GetParticlePrefab(),transform.position ,Quaternion.identity,transform); // 取得粒子系統物件 ParticleSystem myParticle = particlePrefab.GetComponent (); // 啟動粒子系統 myParticle.Play(); // 播放完後自我銷毀 Destroy(particlePrefab, myParticle.main.duration); } private void DealRadiaDamage(AbilityParams useParams){ RaycastHit[] hits = Physics.SphereCastAll ( transform.position, // 以Player為中心點 config.GetRadius (), // 掃描的球體半徑範圍 Vector3.up, // 掃描的方向不重要,因為我們發動的是Player為原點的範圍技 config.GetRadius () // 掃描距離設定成跟掃描半徑一樣即可 ); foreach (RaycastHit hit in hits) { Enemy enemy = hit.collider.gameObject.GetComponent (); if (enemy != null) { float damageToDeal = useParams.baseDamage + config.GetDamageToEachTarget (); enemy.TakeDamage (damageToDeal); } } } } }
PowerAttackBehaviour.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; namespace RPG.Character{ public class PowerAttackBehaviour : MonoBehaviour, ISpecialAbility { PowerAttackConfig config; public void SetConfig(PowerAttackConfig config){ this.config = config; } public void Use(AbilityParams useParams){ DealDamage (useParams); PlayParticleEffect (useParams); PlayEffectAudio (); } private void PlayEffectAudio(){ // 生成新的音效Component AudioSource myAudioSource = gameObject.AddComponent(); // 從config取得技能音效 myAudioSource.clip = config.GetAudioClip (); // 播放技能音效 myAudioSource.Play (); // 銷毀音效物件 Destroy (myAudioSource, myAudioSource.clip.length); } private void PlayParticleEffect(AbilityParams useParams){ // 初始化粒子系統,綁定到Enemy身上 GameObject particlePrefab = Instantiate(config.GetParticlePrefab(), useParams.target.transform.position, Quaternion.identity, useParams.target.transform); // 取得粒子系統物件 ParticleSystem myParticle = particlePrefab.GetComponent (); // 啟動粒子系統 myParticle.Play(); // 播放完後自我銷毀 Destroy(particlePrefab, myParticle.main.duration); } private void DealDamage(AbilityParams useParams){ float damageToDeal = config.GetExtraDamage () + useParams.baseDamage; useParams.target.TakeDamage (damageToDeal); } } }
SelfHealBehaviour.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using RPG.Core; namespace RPG.Character{ public class SelfHealBehaviour : MonoBehaviour, ISpecialAbility { SelfHealConfig config; Player player; void Start(){ player = GetComponent(); } public void SetConfig(SelfHealConfig config){ this.config = config; } public void Use(AbilityParams useParams){ player.Heal (config.GetExtraHealth ()); PlayParticleEffect (); PlayEffectAudio (); } private void PlayEffectAudio(){ // 生成新的音效Component AudioSource myAudioSource = gameObject.AddComponent (); // 從config取得技能音效 myAudioSource.clip = config.GetAudioClip (); // 播放技能音效 myAudioSource.Play (); // 銷毀音效物件 Destroy (myAudioSource, myAudioSource.clip.length); } private void PlayParticleEffect(){ // 初始化粒子系統,綁定到Player身上 GameObject particlePrefab = Instantiate(config.GetParticlePrefab(),transform.position ,Quaternion.identity,transform); // 取得粒子系統物件 ParticleSystem myParticle = particlePrefab.GetComponent (); // 啟動粒子系統 myParticle.Play(); // 播放完後自我銷毀 Destroy(particlePrefab, myParticle.main.duration); } } }
SpecialAbilityConfig.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using RPG.Core; namespace RPG.Character{ public struct AbilityParams{ public Enemy target; public float baseDamage; public AbilityParams(Enemy target, float baseDamage){ this.target = target; this.baseDamage = baseDamage; } } public abstract class SpecialAbilityConfig : ScriptableObject { [Header("Special Ability General")] [SerializeField] float energyCost = 10f; [SerializeField] GameObject particlePrefab = null; [SerializeField] AudioClip audioClip = null; abstract public ISpecialAbility AddComponent (GameObject gameObjectAttachTo); public float GetEnergyCost(){ return energyCost; } public GameObject GetParticlePrefab(){ return particlePrefab; } public AudioClip GetAudioClip(){ return audioClip; } } }
留言
張貼留言