Files
2024-11-20 15:21:28 +01:00

141 lines
3.3 KiB
C#

// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Transform)]
[Tooltip("Rotates a Game Object around each Axis. Use a Vector3 Variable and/or XYZ components. To leave any axis unchanged, set variable to 'None'.")]
public class Rotate : FsmStateAction
{
[RequiredField]
[Tooltip("The game object to rotate.")]
public FsmOwnerDefault gameObject;
[Tooltip("A rotation vector specifying rotation around x, y, and z axis. NOTE: You can override individual axis below.")]
[UIHint(UIHint.Variable)]
public FsmVector3 vector;
[Tooltip("Rotation around x axis.")]
public FsmFloat xAngle;
[Tooltip("Rotation around y axis.")]
public FsmFloat yAngle;
[Tooltip("Rotation around z axis.")]
public FsmFloat zAngle;
[Tooltip("Rotate in local or world space.")]
public Space space;
[Tooltip("Rotation is specified in degrees per second. " +
"In other words, the amount to rotate in over one second. " +
"This allows rotations to be frame rate independent. " +
"It is the same as multiplying the rotation by Time.deltaTime.")]
public bool perSecond;
[Tooltip("Repeat every frame.")]
public bool everyFrame;
[Tooltip("Perform the rotation in LateUpdate. This is useful if you want to override the rotation of objects that are animated or otherwise rotated in Update.")]
public bool lateUpdate;
[Tooltip("Perform the rotation in FixedUpdate. This is useful when working with rigid bodies and physics.")]
public bool fixedUpdate;
public override void Reset()
{
gameObject = null;
vector = null;
// default axis to variable dropdown with None selected.
xAngle = new FsmFloat { UseVariable = true };
yAngle = new FsmFloat { UseVariable = true };
zAngle = new FsmFloat { UseVariable = true };
space = Space.Self;
perSecond = false;
everyFrame = true;
lateUpdate = false;
fixedUpdate = false;
}
public override void OnPreprocess()
{
if (fixedUpdate) Fsm.HandleFixedUpdate = true;
if (lateUpdate) Fsm.HandleLateUpdate = true;
}
public override void OnEnter()
{
if(!everyFrame && !lateUpdate && !fixedUpdate)
{
DoRotate();
Finish();
}
}
public override void OnUpdate()
{
if (!lateUpdate && !fixedUpdate)
{
DoRotate();
}
}
public override void OnLateUpdate()
{
if (lateUpdate)
{
DoRotate();
}
if (!everyFrame)
{
Finish();
}
}
public override void OnFixedUpdate()
{
if (fixedUpdate)
{
DoRotate();
}
if (!everyFrame)
{
Finish();
}
}
void DoRotate()
{
var go = Fsm.GetOwnerDefaultTarget(gameObject);
if (go == null)
{
return;
}
// Use vector if specified
var rotate = vector.IsNone ? new Vector3(xAngle.Value, yAngle.Value, zAngle.Value) : vector.Value;
// override any axis
if (!xAngle.IsNone) rotate.x = xAngle.Value;
if (!yAngle.IsNone) rotate.y = yAngle.Value;
if (!zAngle.IsNone) rotate.z = zAngle.Value;
// apply
if (!perSecond)
{
go.transform.Rotate(rotate, space);
}
else
{
go.transform.Rotate(rotate * Time.deltaTime, space);
}
}
}
}