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發動範圍技能以後,發現音效能正常播放!粒子效果跟音效都一起進行了以後,發動技能看起來就帥多了吧。




留言
張貼留言