[UNITY],[C#]/TIL : UNITY

2. DOTween 을 배워보자

네,가능합니다 2024. 11. 15. 21:42

1. DOTween의 경로 애니메이션(Path Animation)

곡선으로 이동하거나 내가 원하는 경로를 지정해두고 해당 경로를 움직이게 할 수 있다.

using DG.Tweening;
using UnityEngine;

public class PathMovement : MonoBehaviour
{
    public Vector3[] pathPoints; // 경로를 그려줄 점들을 정의합니다.

    private void Start()
    {
        // 지정된 경로를 따라 3초 동안 움직임
        transform.DOPath(pathPoints, 3f, PathType.CatmullRom)
                 .SetEase(Ease.Linear)
                 .SetLoops(-1, LoopType.Yoyo); // 무한 반복하며 왔다갔다 함 (요요 ㅋㅋ)
    }
}

 

2. 트윈 콜백과 이벤트

트윈 콜백을 사용하면 애니메이션 시작 전, 후, 혹은 특정상황에서 원하는 행동을 할 수 있습니다.

public class CallbackExample : MonoBehaviour
{
    private void Start()
    {
        // 2초 동안 오브젝트를 특정 위치로 이동시키고 완료 시 콜백 실행
        transform.DOMove(new Vector3(0, 5, 0), 2f)
            .OnStart(() => Debug.Log("애니메이션 시작"))
            .OnComplete(() => Debug.Log("애니메이션 완료"))
            .OnKill(() => Debug.Log("애니메이션 취소"));
    }
}

찾아보면 이 함수 외에도 아주 많다.

 

3. DOTween의 연속적인 애니메이션 (1편에서 배웠던 Sequence의 심화내용이다.)

여러 오브젝트를 동시에 제어하거나 연속적으로 제어할 수 있다.

public class AdvancedSequenceExample : MonoBehaviour
{
    public Transform box1;
    public Transform box2;

    private void Start()
    {
        Sequence sequence = DOTween.Sequence();

        // 첫 번째 상자가 오른쪽으로 이동 (1초)
        sequence.Append(box1.DOMoveX(3, 1f).SetEase(Ease.OutSine));

        // 첫 번째 상자가 이동한 후, 두 번째 상자가 위로 올라감 (1.5초)
        sequence.Append(box2.DOMoveY(2, 1.5f).SetEase(Ease.OutBounce));

        // 두 상자가 동시에 회전 (2초)
        sequence.Join(box1.DORotate(new Vector3(0, 180, 0), 2f, RotateMode.WorldAxisAdd));
        sequence.Join(box2.DORotate(new Vector3(0, -180, 0), 2f, RotateMode.WorldAxisAdd));
    }
}

이렇게 복잡한게 이렇게 간단한 코드로 되다니..미친놈..

 

4. Ease 함수 커스터마이징

기본적으로 제공해주는 Ease함수를 커스터마이징하여 개발자가 원하는 정밀한 애니메이션 연출이 가능하다.

public class CustomEaseExample : MonoBehaviour
{
    private void Start()
    {
        // 사용자 정의 Ease 함수로 애니메이션 실행
        transform.DOMoveX(5, 3f).SetEase(MyCustomEase);
    }

    // 사용자 정의 Ease 함수 (단순한 곡선)
    private float MyCustomEase(float time, float duration, float overshootOrAmplitude, float period)
    {
        return Mathf.Sin(time / duration * Mathf.PI * 0.5f); // 부드럽게 가속하는 커스텀 곡선
    }
}

 

이놈은 커스터마이징도 간단하다

 

5. Loops와 애니메이션 반복

DOTween은 트윈을 반복할 수 있는 SetLoops() 메서드를 제공한다. 반복횟수와 유형도 지정할 수 있다.

( LoopType에는 다양한 반복 방식이 있으니 필요하다면 검색해보자)

public class LoopExample : MonoBehaviour
{
    private void Start()
    {
        // 오브젝트를 좌우로 반복해서 이동
        transform.DOMoveX(3, 1f)
            .SetEase(Ease.InOutSine)
            .SetLoops(-1, LoopType.Yoyo); // 무한히 왔다갔다 반복
    }
}

 

6. Tweener의 조작 

DOTween은 생성된 트윈 객체를 관리 및 조작할 수 있다.

public class PausePlayExample : MonoBehaviour
{
    private Tweener moveTween;

    private void Start()
    {
        // 트윈을 생성하고 Tweener타입의 moveTween에 참조 저장
        moveTween = transform.DOMoveX(5, 2f).SetEase(Ease.Linear);
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.P))
        {
            moveTween.Pause(); // 애니메이션 일시 정지
        }
        else if (Input.GetKeyDown(KeyCode.R))
        {
            moveTween.Play(); // 애니메이션 재개
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            moveTween.Restart(); // 애니메이션 다시 시작
        }
    }
}

 

여기까지가 오늘 내용이다.

 

이런 저런 내용들을 보면서 느낀건 게임을 기획하는 기획자나 게임 디자이너가 상상한걸 구현해줄 수 있는 기능들이 많은것같다.

 

연출을 생각한다면 DOTween은 정말 좋은 녀석인것이 느껴진다.