3-21 Add An Effect Audio On Special Abilities
本章要介紹如何在發動技能時播放音效,實作方式還滿簡單的。首先,請大家下載免費音效,或是自己在網路上找也可以。
Fantasy SFX for Particle Distort Texture Effect Library
https://www.assetstore.unity3d.com/en/#!/content/42146
我挑選sfx_chrono_gale當作發動範圍技的音效。
接著修改SpecialAbilityConfig.cs及AreaEffectBehaviour.cs。我們會在SpecialAbilityConfig中新增一個AudioClip用來存放該技能的音效,並在AreaEffectBehaviour的Use方法中取得該音效並播放。
SpecialAbilityConfig.cs:
AreaEffectBehaviour.cs:
上述的方法有點笨,如果我們要再其他技能上新增播放音效的功能,就必須要複製相同的程式碼到其他技能中。比方說PowerAttackBehaviour跟SelfHealBehaviour的Use都必須加上如下圖的這段程式碼,後面的文章我們再來看看如何重構。
接下來,讓我們回到AOE L1的設定中,可見多了一個Audio Clip欄位。
讓我們將想要的音效放上去吧。
最後到遊戲中實際測試看看,按下數字鍵1發動範圍技能以後,發現音效能正常播放!粒子效果跟音效都一起進行了以後,發動技能看起來就帥多了吧。
Fantasy SFX for Particle Distort Texture Effect Library
https://www.assetstore.unity3d.com/en/#!/content/42146
我挑選sfx_chrono_gale當作發動範圍技的音效。
接著修改SpecialAbilityConfig.cs及AreaEffectBehaviour.cs。我們會在SpecialAbilityConfig中新增一個AudioClip用來存放該技能的音效,並在AreaEffectBehaviour的Use方法中取得該音效並播放。
SpecialAbilityConfig.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using RPG.Core; namespace RPG.Character{ public struct AbilityParams{ public IDamageable target; public float baseDamage; public AbilityParams(IDamageable 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; } } }
AreaEffectBehaviour.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using RPG.Core; namespace RPG.Character{ public class AreaEffectBehaviour : MonoBehaviour, ISpecialAbility { AreaEffectConfig config; AudioSource audioSource; void Start(){ audioSource = GetComponent(); } public void SetConfig(AreaEffectConfig config){ this.config = config; } public void Use(AbilityParams useParams){ DealRadiaDamage (useParams); PlayParticleEffect (); // 從config取得技能音效 audioSource.clip = config.GetAudioClip (); // 播放技能音效 audioSource.Play (); } 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跟SelfHealBehaviour的Use都必須加上如下圖的這段程式碼,後面的文章我們再來看看如何重構。
接下來,讓我們回到AOE L1的設定中,可見多了一個Audio Clip欄位。
讓我們將想要的音效放上去吧。
最後到遊戲中實際測試看看,按下數字鍵1發動範圍技能以後,發現音效能正常播放!粒子效果跟音效都一起進行了以後,發動技能看起來就帥多了吧。
留言
張貼留言