角色动画系统
我们先思考一个问题,在游戏里面那些地方需要用到动画,技能释放的时候播放技能动画,走路的时候播放走路动画,攻击的时候播放攻击动画,待机的时候播放待机动画等,还有呢,动画播放的时候还会触发对应的事件行为,比如说,播放攻击动画的时候攻击敌人,当玩家的手离开操作摇杆时,从跑的动画切换到待机动画等。
经过分析呢,我们写两个类,一个类呢专门处理动画播放,叫CharacterAnimation,能给其他类提供 当前动画的参数,是否播放攻击动画,播放动画,另一个类呢专门处理与动画有关的事件行为,能给其他类提供 取消当前动画,播放默认动画。
那在unity里面有现成的动画组件Animator,不需要我们再去编写,我们只需要负责调用就好。
那我们把这两个类写一下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace ARPG.Character
{
/// <summary>
/// 角色动画控制类
/// </summary>
public class CharacterAnimation : MonoBehaviour
{
/// <summary>引用动画组件 </summary>
public Animator anim;
/// <summary>当前动画参数 </summary>
public string currentAnim = "idle";
/// <summary>是否在播放攻击类动画 </summary>
public bool isAttack = false;
public void Start()
{
anim = this.GetComponentInChildren<Animator>();
}
/// <summary>
/// 播放动画
/// </summary>
/// <param name="paramName">动画状态机bool型参数</param>
public void PlayAnimation(string paramName)
{
if (paramName.StartsWith("attack"))
isAttack = true;
anim.SetBool(currentAnim, false);
anim.SetBool(paramName, true);
currentAnim = paramName;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace ARPG.Character
{
public class AnimationEventsBehaviour : MonoBehaviour
{
private Animator anim = null;
private CharacterAnimation chAnim;
public void Start()
{
anim = this.GetComponent<Animator>();
chAnim = this.transform.parent.GetComponent<CharacterAnimation>();
}
#region 动画事件响应
/// <summary>
/// 取消当前动画,回到默认动画
/// </summary>
/// <param name="paramName">动画状态机bool型参数</param>
public void CancelAnim(string paramName)
{
if (paramName.StartsWith("attack") && chAnim != null)
chAnim.isAttack = false;
anim.SetBool(paramName, false);
}
#endregion
}
}
随着开发深度,还是会新增功能和重构部分代码的!!!
