71 lines
2.7 KiB
C#
71 lines
2.7 KiB
C#
|
#if !NEOFPS_FORCE_QUALITY && (UNITY_ANDROID || UNITY_IOS || UNITY_TIZEN || (UNITY_WSA && NETFX_CORE) || NEOFPS_FORCE_LIGHTWEIGHT)
|
|||
|
#define NEOFPS_LIGHTWEIGHT
|
|||
|
#endif
|
|||
|
|
|||
|
using UnityEngine;
|
|||
|
using NeoFPS.CharacterMotion.MotionData;
|
|||
|
using NeoSaveGames.Serialization;
|
|||
|
using NeoFPS.CharacterMotion.Parameters;
|
|||
|
|
|||
|
namespace NeoFPS.CharacterMotion.States
|
|||
|
{
|
|||
|
[MotionGraphElement("Swimming/Wading Movement", "Wading")]
|
|||
|
[HelpURL("https://docs.neofps.com/manual/motiongraphref-mgs-wadingstate.html")]
|
|||
|
public class WadingMovementState : MovementState
|
|||
|
{
|
|||
|
[SerializeField, Tooltip("The transform parameter which contains the transform of the water zone object")]
|
|||
|
private TransformParameter m_WaterZoneParameter = null;
|
|||
|
[SerializeField, Tooltip("The multiplier for the standard movement speed when submerged to min speed depth")]
|
|||
|
private FloatDataReference m_MinSpeedMultiplier = new FloatDataReference(0.25f);
|
|||
|
[SerializeField, Tooltip("The depth the character must be submerged to move at minimum speed")]
|
|||
|
private float m_MinSpeedDepth = 1f;
|
|||
|
[SerializeField, Tooltip("The submersion depth of the character where their speed is not affected")]
|
|||
|
private float m_MaxSpeedDepth = 0.3f;
|
|||
|
|
|||
|
private Transform m_WaterZoneTransform = null;
|
|||
|
private IWaterZone m_WaterZone = null;
|
|||
|
|
|||
|
public override void OnValidate()
|
|||
|
{
|
|||
|
base.OnValidate();
|
|||
|
m_MinSpeedMultiplier.ClampValue(0.05f, 0.95f);
|
|||
|
}
|
|||
|
|
|||
|
protected override Vector3 GetTargetVelocity(float directionMultiplier)
|
|||
|
{
|
|||
|
Vector3 result = base.GetTargetVelocity(directionMultiplier);
|
|||
|
|
|||
|
CheckWaterZone();
|
|||
|
if (m_WaterZone != null)
|
|||
|
{
|
|||
|
var belowWater = -WaterZoneHelpers.CompareLowestToSurface(controller, m_WaterZone);
|
|||
|
belowWater -= m_MaxSpeedDepth;
|
|||
|
belowWater /= m_MinSpeedDepth - m_MaxSpeedDepth;
|
|||
|
|
|||
|
float multiplier = Mathf.Lerp(1f, m_MinSpeedMultiplier.value, belowWater);
|
|||
|
result *= multiplier;
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
void CheckWaterZone()
|
|||
|
{
|
|||
|
if (m_WaterZoneParameter != null)
|
|||
|
{
|
|||
|
if (m_WaterZoneTransform != m_WaterZoneParameter.value)
|
|||
|
{
|
|||
|
m_WaterZoneTransform = m_WaterZoneParameter.value;
|
|||
|
m_WaterZone = m_WaterZoneTransform.GetComponent<IWaterZone>();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void CheckReferences(IMotionGraphMap map)
|
|||
|
{
|
|||
|
base.CheckReferences(map);
|
|||
|
m_WaterZoneParameter = map.Swap(m_WaterZoneParameter);
|
|||
|
m_MinSpeedMultiplier.CheckReference(map);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|