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

114 lines
2.5 KiB
C#

using UnityEngine;
namespace MoleMole
{
public class FollowStandBy : BaseFollowShortState
{
private enum State
{
Entering = 0,
StandBy = 1,
Exiting = 2
}
private const float RADIUS_LINEAR_LERP_ENTER_TIME = 1.5f;
private const float RADIUS_LINEAR_LERP_EXIT_TIME = 0.3f;
private float _origRadius;
private float _targetRadius;
private float _origCenterOffsetY;
private float _targetCenterOffsetY;
private float _timer;
private State _state;
public FollowStandBy(MainCameraFollowState followState)
: base(followState)
{
base.isSkippingBaseState = true;
}
public override void Enter()
{
if (_owner.recoverState.active)
{
_owner.recoverState.CancelPosAndForwardRecover();
}
_origRadius = _owner.anchorRadius;
_targetRadius = 3.84f;
_origCenterOffsetY = _owner.followCenterY;
_targetCenterOffsetY = _owner.followCenterY * 0.85f;
_timer = 0f;
_state = State.Entering;
_owner.posLerpRatio = 0.2f;
_owner.forwardLerpRatio = 0.2f;
}
public override void Update()
{
if (_state == State.Entering)
{
if (!_owner.avatar.IsAnimatorInTag(AvatarData.AvatarTagGroup.Stable))
{
_timer = 0f;
_owner.posLerpRatio = 1f;
_owner.forwardLerpRatio = 1f;
_state = State.Exiting;
return;
}
_timer += Time.deltaTime * _owner.mainCamera.TimeScale;
if (_timer < 1.5f)
{
float t = _timer / 1.5f;
_owner.anchorRadius = Mathf.Lerp(_origRadius, _targetRadius, t);
_owner.followCenterY = Mathf.Lerp(_origCenterOffsetY, _targetCenterOffsetY, t);
}
else
{
_owner.anchorRadius = _targetRadius;
_owner.followCenterY = _targetCenterOffsetY;
_state = State.StandBy;
}
}
else if (_state == State.StandBy)
{
if (!_owner.avatar.IsAnimatorInTag(AvatarData.AvatarTagGroup.Stable))
{
_owner.posLerpRatio = 1f;
_owner.forwardLerpRatio = 1f;
_timer = 0f;
_state = State.Exiting;
}
}
else if (_state == State.Exiting)
{
_timer += Time.deltaTime * _owner.mainCamera.TimeScale;
if (_timer < 0.3f)
{
float t2 = _timer / 0.3f;
_owner.anchorRadius = Mathf.Lerp(_targetRadius, _origRadius, t2);
_owner.followCenterY = Mathf.Lerp(_targetCenterOffsetY, _origCenterOffsetY, t2);
}
else
{
_owner.anchorRadius = _origRadius;
_owner.followCenterY = _origCenterOffsetY;
End();
}
}
}
public override void Exit()
{
_owner.recoverState.TryRecover();
_owner.posLerpRatio = 1f;
_owner.forwardLerpRatio = 1f;
}
}
}