Files
SVSimServer/SVSim.BattleEngine/Engine/Wizard/ChatOpenCloseAnimation.cs
gamer147 824309ec44 feat(battle-engine): close the AI-simulation subsystem (verbatim)
Copied the 89 uncopied AI*SimulationUtility/extension files defining the
AIVirtualCard/AIVirtualField extension methods; the compile loop then auto-closed
the revealed type deps (~3049 files total, drift-clean). 10.0k -> 62 errors.
2026-06-05 20:30:59 -04:00

188 lines
4.1 KiB
C#

using System;
using System.Collections;
using Cute;
using UnityEngine;
namespace Wizard;
public class ChatOpenCloseAnimation : MonoBehaviour
{
public enum eState
{
CLOSED,
OPENED,
CLOSING,
OPENING
}
public const float CLOSE_HEIGHT = 0f;
[SerializeField]
private GameObject _animationObj;
[SerializeField]
private bool _isActiveUpdate;
[SerializeField]
private float _openPositionY;
[SerializeField]
private float _closePositionY = -60f;
[SerializeField]
private float _openAnimationTime = 0.3f;
[SerializeField]
private float _closeAnimationTime = 0.2f;
private Coroutine _coroutinAnimation;
public eState State { get; private set; }
public bool IsOpen
{
get
{
if (State != eState.OPENED)
{
return State == eState.OPENING;
}
return true;
}
}
public bool IsMoving { get; private set; }
public float CurrentPosHeight => _animationObj.transform.localPosition.y - _closePositionY;
public float OpenHeight => _openPositionY - _closePositionY;
public float AnimationTime
{
get
{
if (!IsOpen)
{
return _closeAnimationTime;
}
return _openAnimationTime;
}
}
public bool IsAnimationStartFromOpenedOrClosed
{
get
{
if (State != eState.OPENING || !Mathf.Approximately(CurrentPosHeight, 0f))
{
if (State == eState.CLOSING)
{
return Mathf.Approximately(CurrentPosHeight, OpenHeight);
}
return false;
}
return true;
}
}
public void Init(bool isOpenedDefault)
{
ChangeOpenedClosedState(isOpenedDefault);
}
public void ToggleStateAndStartAnimation()
{
switch (State)
{
case eState.CLOSED:
case eState.CLOSING:
StartOpenAnimation();
break;
case eState.OPENED:
case eState.OPENING:
StartCloseAnimation();
break;
}
}
public void StartCloseAnimation(Action onAnimationEndCallBack = null)
{
if (IsOpen)
{
if (_coroutinAnimation != null)
{
StopCoroutine(_coroutinAnimation);
}
_coroutinAnimation = StartCoroutine(CloseAnimation(onAnimationEndCallBack));
}
}
public void StartOpenAnimation()
{
if (!IsOpen)
{
if (_coroutinAnimation != null)
{
StopCoroutine(_coroutinAnimation);
}
_animationObj.SetActive(value: true);
_coroutinAnimation = StartCoroutine(OpenAnimation());
}
}
private IEnumerator OpenAnimation()
{
State = eState.OPENING;
Vector3 basePos = _animationObj.transform.localPosition;
IsMoving = true;
float durationTime = _openAnimationTime * (1f - CurrentPosHeight / OpenHeight);
CustomEasing easing = new CustomEasing(CustomEasing.eType.outQuad, basePos.y, _openPositionY, durationTime);
while (easing.IsMoving)
{
yield return null;
float curVal = easing.GetCurVal(Time.deltaTime);
_animationObj.transform.localPosition = new Vector3(basePos.x, curVal, basePos.z);
if (State != eState.OPENING)
{
yield break;
}
}
IsMoving = false;
ChangeOpenedClosedState(isOpened: true);
}
private IEnumerator CloseAnimation(Action onAnimationEndCallBack)
{
State = eState.CLOSING;
Vector3 basePos = _animationObj.transform.localPosition;
IsMoving = true;
float durationTime = _closeAnimationTime * CurrentPosHeight / OpenHeight;
CustomEasing easing = new CustomEasing(CustomEasing.eType.outQuad, basePos.y, _closePositionY, durationTime);
while (easing.IsMoving)
{
yield return null;
float curVal = easing.GetCurVal(Time.deltaTime);
_animationObj.transform.localPosition = new Vector3(basePos.x, curVal, basePos.z);
if (State != eState.CLOSING)
{
yield break;
}
}
IsMoving = false;
ChangeOpenedClosedState(isOpened: false);
onAnimationEndCallBack.Call();
}
private void ChangeOpenedClosedState(bool isOpened)
{
State = (isOpened ? eState.OPENED : eState.CLOSED);
Vector3 localPosition = _animationObj.transform.localPosition;
float y = (isOpened ? _openPositionY : _closePositionY);
_animationObj.transform.localPosition = new Vector3(localPosition.x, y, localPosition.z);
if (_isActiveUpdate)
{
_animationObj.SetActive(isOpened);
}
}
}