Related Posts Plugin for WordPress, Blogger...

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:

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

留言