Files
BH3/Assets/Scripts/Assembly-CSharp/MoleMole/FollowAvatarPoleState.cs
2025-08-13 09:26:42 +08:00

99 lines
2.2 KiB
C#

using UnityEngine;
namespace MoleMole
{
public class FollowAvatarPoleState : BaseFollowBaseState
{
private float _enteringLerpDuration;
private bool _enteringLerp;
private float _startPolar;
private float _startForwardDelta;
private float _targetPolar;
private float _targetForwardDelta;
private float _lerpTimer;
public FollowAvatarPoleState(MainCameraFollowState followState)
: base(followState)
{
}
public void SetEnteringLerpTarget(float targetPolar)
{
_targetPolar = targetPolar;
maskedShortStates.Add(_owner.rotateToAvatarFacingState);
}
public void CancelEnteringLerp()
{
_enteringLerp = false;
}
public override void Enter()
{
if (_owner.lastBaseState == _owner.followAvatarAndTargetState)
{
_enteringLerp = true;
_lerpTimer = 0f;
_startPolar = _owner.anchorPolar;
_startForwardDelta = _owner.forwardDeltaAngle;
_targetForwardDelta = 0f;
_enteringLerpDuration = Miscs.AbsAngleDiff(_startPolar, _targetPolar) * 0.1f;
base.cannotBeSkipped = true;
}
}
private float GetPoleFollowAnchor()
{
Vector3 vector = _owner.followData.anchorPosition - _owner.followCenterXZPosition;
return Mathf.Atan2(vector.z, vector.x) * 57.29578f;
}
public override void Update()
{
if (_enteringLerp)
{
_lerpTimer += Time.deltaTime * _owner.mainCamera.TimeScale;
if (_lerpTimer > _enteringLerpDuration)
{
_owner.anchorPolar = _targetPolar;
_owner.forwardDeltaAngle = _targetForwardDelta;
_enteringLerp = false;
maskedShortStates.Remove(_owner.rotateToAvatarFacingState);
base.cannotBeSkipped = false;
}
else
{
float t = _lerpTimer / _enteringLerpDuration;
_owner.anchorPolar = Mathf.Lerp(_startPolar, _targetPolar, t);
_owner.forwardDeltaAngle = Mathf.Lerp(_startForwardDelta, _targetForwardDelta, t);
}
}
else
{
_owner.anchorPolar = GetPoleFollowAnchor();
}
}
public override void Exit()
{
if (maskedShortStates.Contains(_owner.rotateToAvatarFacingState))
{
maskedShortStates.Remove(_owner.rotateToAvatarFacingState);
}
_enteringLerp = false;
_owner.forwardDeltaAngle = 0f;
}
public override void ResetState()
{
_enteringLerp = false;
}
}
}