125 lines
3.2 KiB
C#
125 lines
3.2 KiB
C#
// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
|
|
|
|
using UnityEngine;
|
|
|
|
namespace HutongGames.PlayMaker.Actions
|
|
{
|
|
[ActionCategory(ActionCategory.Animation)]
|
|
[Tooltip("Captures the current pose of a hierarchy as an animation clip.\n\nUseful to blend from an arbitrary pose (e.g. a rag-doll death) back to a known animation (e.g. idle).")]
|
|
public class CapturePoseAsAnimationClip : FsmStateAction
|
|
{
|
|
[RequiredField]
|
|
[CheckForComponent(typeof(Animation))]
|
|
[Tooltip("The GameObject root of the hierarchy to capture.")]
|
|
public FsmOwnerDefault gameObject;
|
|
|
|
[Tooltip("Capture position keys.")]
|
|
public FsmBool position;
|
|
|
|
[Tooltip("Capture rotation keys.")]
|
|
public FsmBool rotation;
|
|
|
|
[Tooltip("Capture scale keys.")]
|
|
public FsmBool scale;
|
|
|
|
[RequiredField]
|
|
[UIHint(UIHint.Variable)]
|
|
[ObjectType(typeof(AnimationClip))]
|
|
[Tooltip("Store the result in an Object variable of type AnimationClip.")]
|
|
public FsmObject storeAnimationClip;
|
|
|
|
public override void Reset()
|
|
{
|
|
gameObject = null;
|
|
position = false;
|
|
rotation = true;
|
|
scale = false;
|
|
storeAnimationClip = null;
|
|
}
|
|
|
|
public override void OnEnter()
|
|
{
|
|
DoCaptureAnimationClip();
|
|
|
|
Finish();
|
|
}
|
|
|
|
void DoCaptureAnimationClip()
|
|
{
|
|
var go = Fsm.GetOwnerDefaultTarget(gameObject);
|
|
if (go == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var animClip = new AnimationClip();
|
|
|
|
foreach (Transform child in go.transform)
|
|
{
|
|
CaptureTransform(child, "", animClip);
|
|
}
|
|
|
|
storeAnimationClip.Value = animClip;
|
|
}
|
|
|
|
void CaptureTransform(Transform transform, string path, AnimationClip clip)
|
|
{
|
|
path += transform.name;
|
|
|
|
//Debug.Log(path);
|
|
|
|
if (position.Value)
|
|
{
|
|
CapturePosition(transform, path, clip);
|
|
}
|
|
|
|
if (rotation.Value)
|
|
{
|
|
CaptureRotation(transform, path, clip);
|
|
}
|
|
|
|
if (scale.Value)
|
|
{
|
|
CaptureScale(transform, path, clip);
|
|
}
|
|
|
|
foreach (Transform child in transform)
|
|
{
|
|
CaptureTransform(child, path + "/", clip);
|
|
}
|
|
}
|
|
|
|
void CapturePosition(Transform transform, string path, AnimationClip clip)
|
|
{
|
|
SetConstantCurve(clip, path, "localPosition.x", transform.localPosition.x);
|
|
SetConstantCurve(clip, path, "localPosition.y", transform.localPosition.y);
|
|
SetConstantCurve(clip, path, "localPosition.z", transform.localPosition.z);
|
|
}
|
|
|
|
void CaptureRotation(Transform transform, string path, AnimationClip clip)
|
|
{
|
|
SetConstantCurve(clip, path, "localRotation.x", transform.localRotation.x);
|
|
SetConstantCurve(clip, path, "localRotation.y", transform.localRotation.y);
|
|
SetConstantCurve(clip, path, "localRotation.z", transform.localRotation.z);
|
|
SetConstantCurve(clip, path, "localRotation.w", transform.localRotation.w);
|
|
}
|
|
|
|
void CaptureScale(Transform transform, string path, AnimationClip clip)
|
|
{
|
|
SetConstantCurve(clip, path, "localScale.x", transform.localScale.x);
|
|
SetConstantCurve(clip, path, "localScale.y", transform.localScale.y);
|
|
SetConstantCurve(clip, path, "localScale.z", transform.localScale.z);
|
|
}
|
|
|
|
void SetConstantCurve(AnimationClip clip, string childPath, string propertyPath, float value)
|
|
{
|
|
var curve = AnimationCurve.Linear(0, value, 100, value);
|
|
curve.postWrapMode = WrapMode.Loop;
|
|
|
|
clip.SetCurve(childPath, typeof(Transform), propertyPath, curve);
|
|
}
|
|
|
|
|
|
|
|
}
|
|
} |