UI 호출 시에 너무 밋밋해서 이 부분을 좀 개선해보기로 했다.

public class UIBase : MonoBehaviour
{
[Header("UI Animations")]
public UIAnimationSO[] OpenAnim;
public UIAnimationSO[] CloseAnim;
public AnimationSetting AnimSetting;
public CanvasGroup CanvasGroup;
public virtual void Open()
{
for (int i = 0; i < OpenAnim.Length; i++)
UIManager.AnimFactory.Get(OpenAnim[i].Anim).Open(this, i);
}
public virtual void Close()
{
for (int i = 0; i < CloseAnim.Length; i++)
UIManager.AnimFactory.Get(CloseAnim[i].Anim).Close(this, i);
}
}
public enum UIAnimation
{
Default,
FadeInOut,
SizeUpDown,
MoveUpDown,
}
public class UIAnimationFactory
{
Dictionary<UIAnimation, IUIOpenClosable> animations = new ();
public UIAnimationFactory()
{
animations.Add(UIAnimation.Default, new UIDefaultAnimation());
animations.Add(UIAnimation.FadeInOut, new UIFadeInOut());
animations.Add(UIAnimation.SizeUpDown, new UISizeUpDown());
animations.Add(UIAnimation.MoveUpDown, new UIMoveUpDown());
}
public IUIOpenClosable Get(UIAnimation animation)
{
return animations[animation];
}
}
using DG.Tweening;
using UnityEngine;
public class UIMoveUpDown : IUIOpenClosable
{
public void Open(UIBase ui, int idx)
{
if(idx==0)
ui.gameObject.SetActive(true);
Vector3 pos = ui.transform.localPosition + ui.AnimSetting.PositionOffset;
Vector3 from = pos + ui.AnimSetting.PositionAnim;
Vector3 to = pos;
ui.transform.localPosition = from;
ui.transform.DOLocalMove(to, ui.AnimSetting.Duration)
.SetEase(ui.OpenAnim[idx].Curve);
}
public void Close(UIBase ui, int idx)
{
Vector3 pos = ui.transform.localPosition;
Vector3 from = pos;
Vector3 to = pos + ui.AnimSetting.PositionAnim;
ui.transform.localPosition = from;
var tween =
ui.transform.DOLocalMove(to, ui.AnimSetting.Duration)
.SetEase(ui.CloseAnim[idx].Curve);
if(idx==0)
tween.OnComplete(() => { ui.gameObject.SetActive(false); });
}
}
[CreateAssetMenu(fileName = "UIAnimationSO", menuName = "UI Anim/UIAnimationSO")]
public class UIAnimationSO : ScriptableObject
{
public UIAnimation Anim;
public AnimationCurve Curve;
}



위처럼 이동하는 애니메이션이지만 속도감은 curve에 따라 달라지도록 만들었다.
이런 식으로 범용적으로 사용할 수 있는 일종의 프리셋을 아래와 같이 만들어두고 사용할 것이다.

[Serializable]
public class AnimationSetting
{
[Range(0.1f, 5f)] public float Duration = 0.5f;
public Vector3 PositionOffset = Vector3.zero;
public Vector3 PositionAnim = Vector3.zero;
}

인벤토리 UI의 프리팹을 보면 표시한 구간과 같이 애니메이션 SO를 넣고, 애니메이션 세팅을 통해서 세부적으로 조절할 수 있게 해두었다.