4-14 Special Ability Animations
今天要來製作發動技能時的動作,非常簡單,原理與之前武器系統使用的Animator Override Controller相同,我們會在Weapon內放置新的Animation Clip,當發動技能時替換掉預設的攻擊用的Animation Clip。
我們在AbilityBehaviour中撰寫PlayAbilityAnimation方法,然後於繼承的子類別中繼承該方法便可以成功套用動畫。
以下提供修改後的AbilityConfig、AbilityBehaviour,以及需要套用動畫的技能SelfHealBehaviour。
AbilityConfig.cs
AbilityBehaviour.cs
SelfHealBehaviour.cs
修改好程式碼後,我在Self Heal L1中指定Ability Animation為2 Hand-Sword-Fall。

實際執行遊戲看看吧!發動補血技能時,角色有成功擺出滑稽的動作!
我們在AbilityBehaviour中撰寫PlayAbilityAnimation方法,然後於繼承的子類別中繼承該方法便可以成功套用動畫。
以下提供修改後的AbilityConfig、AbilityBehaviour,以及需要套用動畫的技能SelfHealBehaviour。
AbilityConfig.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RPG.Core;
namespace RPG.Character{
public abstract class AbilityConfig : ScriptableObject {
[Header("Special Ability General")]
[SerializeField] float energyCost = 10f;
[SerializeField] GameObject particlePrefab = null;
[SerializeField] AnimationClip abilityAnimatin = null;
[SerializeField] AudioClip audioClip = null;
public AbilityBehaviour AttachAbilityTo (GameObject gameObjectAttachTo){
AbilityBehaviour behaviourComponent = GetBehaviourComponent(gameObjectAttachTo);
behaviourComponent.SetConfig (this);
return behaviourComponent;
}
public abstract AbilityBehaviour GetBehaviourComponent(GameObject gameObjectAttachTo);
public float GetEnergyCost(){
return energyCost;
}
public GameObject GetParticlePrefab(){
return particlePrefab;
}
public AnimationClip GetAbilityAnimation(){
return abilityAnimatin;
}
public AudioClip GetAudioClip(){
return audioClip;
}
}
}
AbilityBehaviour.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace RPG.Character{
public abstract class AbilityBehaviour : MonoBehaviour {
protected AbilityConfig config;
const string ATTACK_TRIGGER = "Attack";
const string DEFAULT_ATTACK = "DEFAULT ATTACK";
const float PARTICLE_CLEAN_UP_DELAY = 20f;
public abstract void Use(GameObject target = null);
public void SetConfig(AbilityConfig config){
this.config = config;
}
protected void PlayEffectAudio(){
// 取得音效Component
AudioSource myAudioSource = GetComponent();
// 從config取得技能音效
AudioClip audioClip = config.GetAudioClip ();
// 使用PlayOnShot播放技能音效,可避免和其他技能音效重疊在一起
myAudioSource.PlayOneShot (audioClip);
}
protected void PlayAbilityAnimation(){
AnimatorOverrideController animatorOverrideController =
GetComponent().GetOverrideController ();
Animator animator = GetComponent ();
animator.runtimeAnimatorController = animatorOverrideController;
animatorOverrideController [DEFAULT_ATTACK] = config.GetAbilityAnimation ();
animator.SetTrigger (ATTACK_TRIGGER);
}
protected void PlayParticleEffect(){
// 初始化粒子系統,綁定到『自己』身上
GameObject particlePrefab = Instantiate(config.GetParticlePrefab(),
transform.position,
Quaternion.identity,
transform);
// 啟動粒子系統
particlePrefab.GetComponent().Play();
// 播放完後自我銷毀
StartCoroutine(DestroyParticleWhenFinished(particlePrefab));
}
protected void PlayParticleEffectOnTarget(GameObject target){
// 初始化粒子系統,綁定到『目標』身上
GameObject particlePrefab = Instantiate(config.GetParticlePrefab(),
target.transform.position,
Quaternion.identity,
target.transform);
// 啟動粒子系統
particlePrefab.GetComponent().Play();
// 播放完後自我銷毀
StartCoroutine(DestroyParticleWhenFinished(particlePrefab));
}
IEnumerator DestroyParticleWhenFinished(GameObject particlePrefab){
while (particlePrefab.GetComponent ().isPlaying) {
yield return new WaitForSeconds (PARTICLE_CLEAN_UP_DELAY);
}
Destroy (particlePrefab);
yield return new WaitForEndOfFrame ();
}
}
}
SelfHealBehaviour.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RPG.Core;
namespace RPG.Character{
public class SelfHealBehaviour : AbilityBehaviour {
PlayerMovement player;
void Start(){
player = GetComponent ();
}
public override void Use(GameObject target){
player.GetComponent ().Heal ((config as SelfHealConfig).GetExtraHealth ());
PlayParticleEffect ();
PlayEffectAudio ();
PlayAbilityAnimation ();
}
}
}
修改好程式碼後,我在Self Heal L1中指定Ability Animation為2 Hand-Sword-Fall。

實際執行遊戲看看吧!發動補血技能時,角色有成功擺出滑稽的動作!

留言
張貼留言