130 lines
2.9 KiB
C#
130 lines
2.9 KiB
C#
// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
|
|
|
|
using System;
|
|
using UnityEngine;
|
|
|
|
namespace HutongGames.PlayMaker.Actions
|
|
{
|
|
[ActionCategory(ActionCategory.Animation)]
|
|
[Tooltip("Plays an Animation on a Game Object. You can add named animation clips to the object in the Unity editor, or with the Add Animation Clip action.")]
|
|
public class PlayAnimation : BaseAnimationAction
|
|
{
|
|
[RequiredField]
|
|
[CheckForComponent(typeof(Animation))]
|
|
[Tooltip("Game Object to play the animation on.")]
|
|
public FsmOwnerDefault gameObject;
|
|
|
|
[UIHint(UIHint.Animation)]
|
|
[Tooltip("The name of the animation to play.")]
|
|
public FsmString animName;
|
|
|
|
[Tooltip("How to treat previously playing animations.")]
|
|
public PlayMode playMode;
|
|
|
|
[HasFloatSlider(0f, 5f)]
|
|
[Tooltip("Time taken to blend to this animation.")]
|
|
public FsmFloat blendTime;
|
|
|
|
[Tooltip("Event to send when the animation is finished playing. NOTE: Not sent with Loop or PingPong wrap modes!")]
|
|
public FsmEvent finishEvent;
|
|
|
|
[Tooltip("Event to send when the animation loops. If you want to send this event to another FSM use Set Event Target. NOTE: This event is only sent with Loop and PingPong wrap modes.")]
|
|
public FsmEvent loopEvent;
|
|
|
|
[Tooltip("Stop playing the animation when this state is exited.")]
|
|
public bool stopOnExit;
|
|
|
|
private AnimationState anim;
|
|
private float prevAnimtTime;
|
|
|
|
public override void Reset()
|
|
{
|
|
gameObject = null;
|
|
animName = null;
|
|
playMode = PlayMode.StopAll;
|
|
blendTime = 0.3f;
|
|
finishEvent = null;
|
|
loopEvent = null;
|
|
stopOnExit = false;
|
|
}
|
|
|
|
public override void OnEnter()
|
|
{
|
|
DoPlayAnimation();
|
|
}
|
|
|
|
private void DoPlayAnimation()
|
|
{
|
|
var go = Fsm.GetOwnerDefaultTarget(gameObject);
|
|
if (!UpdateCache(go))
|
|
{
|
|
Finish();
|
|
return;
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(animName.Value))
|
|
{
|
|
LogWarning("Missing animName!");
|
|
Finish();
|
|
return;
|
|
}
|
|
|
|
anim = animation[animName.Value];
|
|
|
|
if (anim == null)
|
|
{
|
|
LogWarning("Missing animation: " + animName.Value);
|
|
Finish();
|
|
return;
|
|
}
|
|
|
|
var time = blendTime.Value;
|
|
if (time < 0.001f)
|
|
{
|
|
animation.Play(animName.Value, playMode);
|
|
}
|
|
else
|
|
{
|
|
animation.CrossFade(animName.Value, time, playMode);
|
|
}
|
|
|
|
prevAnimtTime = anim.time;
|
|
}
|
|
|
|
public override void OnUpdate()
|
|
{
|
|
var go = Fsm.GetOwnerDefaultTarget(gameObject);
|
|
if (go == null || anim == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!anim.enabled || (anim.wrapMode == WrapMode.ClampForever && anim.time > anim.length))
|
|
{
|
|
Fsm.Event(finishEvent);
|
|
Finish();
|
|
}
|
|
|
|
if (anim.wrapMode != WrapMode.ClampForever && anim.time > anim.length && prevAnimtTime < anim.length)
|
|
{
|
|
Fsm.Event(loopEvent);
|
|
}
|
|
}
|
|
|
|
public override void OnExit()
|
|
{
|
|
if (stopOnExit)
|
|
{
|
|
StopAnimation();
|
|
}
|
|
}
|
|
|
|
private void StopAnimation()
|
|
{
|
|
if (animation != null)
|
|
{
|
|
animation.Stop(animName.Value);
|
|
}
|
|
}
|
|
}
|
|
} |