128 lines
3.2 KiB
C#
128 lines
3.2 KiB
C#
// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
|
|
|
|
using UnityEngine;
|
|
|
|
namespace HutongGames.PlayMaker.Actions
|
|
{
|
|
[NoActionTargets]
|
|
[ActionCategory(ActionCategory.Input)]
|
|
[Tooltip("Gets a world direction Vector from 2 Input Axis. Typically used for a third person controller with Relative To set to the camera.")]
|
|
public class GetAxisVector : FsmStateAction
|
|
{
|
|
public enum AxisPlane
|
|
{
|
|
XZ,
|
|
XY,
|
|
YZ
|
|
}
|
|
|
|
[Tooltip("The name of the horizontal input axis. See Unity Input Manager.")]
|
|
public FsmString horizontalAxis;
|
|
|
|
[Tooltip("The name of the vertical input axis. See Unity Input Manager.")]
|
|
public FsmString verticalAxis;
|
|
|
|
[Tooltip("Input axis are reported in the range -1 to 1, this multiplier lets you set a new range.")]
|
|
public FsmFloat multiplier;
|
|
|
|
[RequiredField]
|
|
[Tooltip("The world plane to map the 2d input onto.")]
|
|
public AxisPlane mapToPlane;
|
|
|
|
[Tooltip("Make the result relative to a GameObject, typically the main camera.")]
|
|
public FsmGameObject relativeTo;
|
|
|
|
[RequiredField]
|
|
[UIHint(UIHint.Variable)]
|
|
[Tooltip("Store the direction vector.")]
|
|
public FsmVector3 storeVector;
|
|
|
|
[UIHint(UIHint.Variable)]
|
|
[Tooltip("Store the length of the direction vector.")]
|
|
public FsmFloat storeMagnitude;
|
|
|
|
public override void Reset()
|
|
{
|
|
horizontalAxis = "Horizontal";
|
|
verticalAxis = "Vertical";
|
|
multiplier = 1.0f;
|
|
mapToPlane = AxisPlane.XZ;
|
|
storeVector = null;
|
|
storeMagnitude = null;
|
|
}
|
|
|
|
public override void OnUpdate()
|
|
{
|
|
var forward = new Vector3();
|
|
var right = new Vector3();
|
|
|
|
if (relativeTo.Value == null)
|
|
{
|
|
switch (mapToPlane)
|
|
{
|
|
case AxisPlane.XZ:
|
|
forward = Vector3.forward;
|
|
right = Vector3.right;
|
|
break;
|
|
|
|
case AxisPlane.XY:
|
|
forward = Vector3.up;
|
|
right = Vector3.right;
|
|
break;
|
|
|
|
case AxisPlane.YZ:
|
|
forward = Vector3.up;
|
|
right = Vector3.forward;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var transform = relativeTo.Value.transform;
|
|
|
|
switch (mapToPlane)
|
|
{
|
|
case AxisPlane.XZ:
|
|
forward = transform.TransformDirection(Vector3.forward);
|
|
forward.y = 0;
|
|
forward = forward.normalized;
|
|
right = new Vector3(forward.z, 0, -forward.x);
|
|
break;
|
|
|
|
case AxisPlane.XY:
|
|
case AxisPlane.YZ:
|
|
// NOTE: in relative mode XY ans YZ are the same!
|
|
forward = Vector3.up;
|
|
forward.z = 0;
|
|
forward = forward.normalized;
|
|
right = transform.TransformDirection(Vector3.right);
|
|
break;
|
|
}
|
|
|
|
// Right vector relative to the object
|
|
// Always orthogonal to the forward vector
|
|
|
|
}
|
|
|
|
// get individual axis
|
|
// leaving an axis blank or set to None sets it to 0
|
|
|
|
var h = (horizontalAxis.IsNone || string.IsNullOrEmpty(horizontalAxis.Value)) ? 0f : Input.GetAxis(horizontalAxis.Value);
|
|
var v = (verticalAxis.IsNone || string.IsNullOrEmpty(verticalAxis.Value)) ? 0f : Input.GetAxis(verticalAxis.Value);
|
|
|
|
// calculate resulting direction vector
|
|
|
|
var direction = h * right + v * forward;
|
|
direction *= multiplier.Value;
|
|
|
|
storeVector.Value = direction;
|
|
|
|
if (!storeMagnitude.IsNone)
|
|
{
|
|
storeMagnitude.Value = direction.magnitude;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|