156 lines
4.6 KiB
C#
156 lines
4.6 KiB
C#
using UnityEngine;
|
|
using NeoFPS.CharacterMotion.MotionData;
|
|
using NeoFPS.CharacterMotion.Parameters;
|
|
using NeoSaveGames.Serialization;
|
|
|
|
namespace NeoFPS.CharacterMotion.States
|
|
{
|
|
[MotionGraphElement("Misc/Move To Point", "Move To Point")]
|
|
[HelpURL("https://docs.neofps.com/manual/motiongraphref-mgs-movetopointstate.html")]
|
|
public class MoveToPointState : MotionGraphState
|
|
{
|
|
[SerializeField, Tooltip("The position to move to")]
|
|
private VectorParameter m_TargetPosition = null;
|
|
|
|
[SerializeField, Tooltip("The time required to reach the target")]
|
|
private float m_Duration = 0.25f;
|
|
|
|
[SerializeField, Tooltip("The interpolation method from start to end")]
|
|
private Interpolation m_Interpolation = Interpolation.EaseOutCubic;
|
|
|
|
[SerializeField, Tooltip("Should collisions be disabled for the duration of the movement")]
|
|
private bool m_DisableCollisions = true;
|
|
|
|
private Vector3 m_StartPoint = Vector3.zero;
|
|
private Vector3 m_OutMove = Vector3.zero;
|
|
private float m_Lerp = 0f;
|
|
private bool m_CollisionsEnabled = true;
|
|
|
|
public enum Interpolation
|
|
{
|
|
Linear,
|
|
EaseOutQuadratic,
|
|
EaseOutCubic,
|
|
Spring,
|
|
Bounce
|
|
}
|
|
|
|
public override bool applyGravity
|
|
{
|
|
get { return false; }
|
|
}
|
|
|
|
public override bool applyGroundingForce
|
|
{
|
|
get { return false; }
|
|
}
|
|
|
|
public override Vector3 moveVector
|
|
{
|
|
get { return m_OutMove; }
|
|
}
|
|
|
|
public override bool completed
|
|
{
|
|
get { return m_Lerp >= 1f; }
|
|
}
|
|
|
|
public override void OnValidate()
|
|
{
|
|
base.OnValidate();
|
|
|
|
if (m_Duration < 0.1f)
|
|
m_Duration = 0.1f;
|
|
}
|
|
|
|
public override void OnEnter()
|
|
{
|
|
base.OnEnter();
|
|
|
|
m_StartPoint = controller.localTransform.position;
|
|
m_Lerp = 0f;
|
|
|
|
// Disable collisions
|
|
if (m_DisableCollisions)
|
|
{
|
|
m_CollisionsEnabled = characterController.collisionsEnabled;
|
|
characterController.collisionsEnabled = false;
|
|
}
|
|
}
|
|
|
|
public override void OnExit()
|
|
{
|
|
base.OnExit();
|
|
|
|
m_OutMove = Vector3.zero;
|
|
m_Lerp = 0f;
|
|
|
|
// Restore collisions
|
|
if (m_DisableCollisions)
|
|
characterController.collisionsEnabled = m_CollisionsEnabled;
|
|
}
|
|
|
|
public override void Update()
|
|
{
|
|
base.Update();
|
|
|
|
// Get linear interp
|
|
m_Lerp += Time.deltaTime / m_Duration;
|
|
if (m_Lerp > 1f)
|
|
m_Lerp = 1f;
|
|
|
|
// Convert to eased
|
|
float eased = m_Lerp;
|
|
switch (m_Interpolation)
|
|
{
|
|
case Interpolation.EaseOutQuadratic:
|
|
eased = EasingFunctions.EaseOutQuadratic(eased);
|
|
break;
|
|
case Interpolation.EaseOutCubic:
|
|
eased = EasingFunctions.EaseOutCubic(eased);
|
|
break;
|
|
case Interpolation.Spring:
|
|
eased = EasingFunctions.EaseInSpring(eased);
|
|
break;
|
|
case Interpolation.Bounce:
|
|
eased = EasingFunctions.EaseInBounce(eased);
|
|
break;
|
|
}
|
|
|
|
// Get target position
|
|
Vector3 target = Vector3.Lerp(m_StartPoint, m_TargetPosition.value, eased);
|
|
|
|
// Get the offset from current
|
|
m_OutMove = target - controller.localTransform.position;
|
|
}
|
|
|
|
public override void CheckReferences(IMotionGraphMap map)
|
|
{
|
|
base.CheckReferences(map);
|
|
m_TargetPosition = map.Swap(m_TargetPosition);
|
|
}
|
|
|
|
#region SAVE / LOAD
|
|
|
|
private static readonly NeoSerializationKey k_LerpKey = new NeoSerializationKey("lerp");
|
|
private static readonly NeoSerializationKey k_StartKey = new NeoSerializationKey("start");
|
|
|
|
public override void WriteProperties(INeoSerializer writer)
|
|
{
|
|
base.WriteProperties(writer);
|
|
|
|
writer.WriteValue(k_LerpKey, m_Lerp);
|
|
writer.WriteValue(k_StartKey, m_StartPoint);
|
|
}
|
|
|
|
public override void ReadProperties(INeoDeserializer reader)
|
|
{
|
|
base.ReadProperties(reader);
|
|
|
|
reader.TryReadValue(k_LerpKey, out m_Lerp, m_Lerp);
|
|
reader.TryReadValue(k_StartKey, out m_StartPoint, m_StartPoint);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |