做了一个非常简单的demo,用来演示上一次封装框架的用法,只用了三个动作。这个框架够用,但是还是要完善一下,目前来说最大的缺陷是切换动作时会打断其他动作的播放,在OnStay返回值改为bool,ChangeState的时候如果动作没有完成就return这样应该就可以了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StoneIdle : FSMBase
{
Animator animator;
public StoneIdle(Animator animator)
{
this.animator = animator;
}
public override void OnEnter()
{
animator.SetInteger("Index", (int)StoneCtrl.StoneStates.StoneIdle);
}
}
public class StoneHit3: FSMBase
{
//判断该动画是否播放完毕
Animator animator;
public StoneHit3(Animator animator)
{
this.animator = animator;
}
public override void OnEnter()
{
animator.SetInteger("Index", (int)StoneCtrl.StoneStates.StoneHit3);
}
//扩展
//像攻击这样的特殊动作 可以在这里写攻击判定
public override void OnStay()
{
base.OnStay();
if (timeCount>3.3f)
{
timeCount = 0;
StoneCtrl.Instance.ChangeStoneAnimation(StoneCtrl.StoneStates.StoneIdle);
}
}
}
public class StoneWalk : FSMBase
{
Animator animator;
public StoneWalk(Animator animator)
{
this.animator = animator;
}
public override void OnEnter()
{
animator.SetInteger("Index", (int)StoneCtrl.StoneStates.StoneWalk);
}
}
public class StoneCtrl : MonoBehaviour
{
public static StoneCtrl Instance;
Animator animator;
FSMManager fsmMrg = new FSMManager((int)StoneStates.Max);
//石头人各种状态 这里就先写三个 代码可视化
private void Awake()
{
Instance = this;
}
public enum StoneStates
{
StoneIdle,
StoneHit3,
StoneWalk,
Max//数组长度时用到
}
public void ChangeStoneAnimation(StoneStates states)
{
fsmMrg.ChangeState((int)states);
}
void AddStates()
{
animator = GetComponent<Animator>();
fsmMrg.AddState(new StoneIdle(animator));
fsmMrg.AddState(new StoneHit3(animator));
fsmMrg.AddState(new StoneWalk(animator));
}
void Start()
{
AddStates();
}
void Update()
{
if (fsmMrg!=null)
{
fsmMrg.Update();
}
}
}