Unity/정보

[Unity] DOTween 사용하기

달시_Dalsi 2023. 11. 27. 17:28

 

DOTween 소개

DOTween을 사용하면 코드로 간단하게 애니메이션을 만들고 조작할 수 있습니다. 주로 개체의 이동, 회전, 크기 조절 등의 애니메이션을 쉽게 구현할 수 있습니다. 또한, 간단한 코드 작성으로 시간에 따른 값의 변경을 부드럽게 처리할 수 있는 등의 기능을 제공합니다. 간단하고 효과적인 애니메이션 및 트윈 처리를 위한 강력한 도구로 평가받고 있습니다.

 

https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676

 

DOTween (HOTween v2) | 애니메이션 도구 | Unity Asset Store

Use the DOTween (HOTween v2) tool from Demigiant on your next project. Find this & more animation tools on the Unity Asset Store.

assetstore.unity.com


주요 기능

https://dotween.demigiant.com/documentation.php

 

DOTween - Documentation

Nomenclature Tweener A tween that takes control of a value and animates it. Sequence A special tween that, instead of taking control of a value, takes control of other tweens and animates them as a group. Tween A generic word that indicates both a Tweener

dotween.demigiant.com

위 dotween 홈페이지에 들어가면 다양한 기능들을 살펴볼 수 있다.

 

1. DOScale, DOMove, DORotate

 

DoScale - 오브젝트를 2초 동안 x축으로 3배로 확대

using DG.Tweening;

transform.DOScale(new Vector3(3, 1, 1), 2f);

 

 

DOMove - 오브젝트를 2초 동안 원하는 방향으로 이동

using DG.Tweening;

transform.DOMove(new Vector3(3, 1, 1), 2f);

 

 

DORotate - 오브젝트를 2초 동안 회전

using DG.Tweening;

transform.DORotate(new Vector3(0, -90, 0), 2f);

 

 

 

 

2. OnComplete

 

OnComplete를 사용하여 이전 효과가 완료된 것을 알 수 있다.

using DG.Tweening;

transform.DOScale(new Vector3(2, 2, 2), 1f).OnComplete(() =>
{
    transform.DORotate(new Vector3(0, 180, 0), 1f);
});

 

 

3. Sequence

 

Sequence는 DoTween에서 여러 트윈 애니메이션을 조합하여 연속적으로 실행할 때 사용되는 기능입니다. Sequence를 사용하면 여러 애니메이션을 간편하게 연결하고, 실행 순서를 지정할 수 있습니다.

 

Prepend(동작) 가장 앞쪽에 추가하고자 할 때
Append(동작) 가장 뒤에 추가하고자 할 때
Join(동작) 앞에 추가된 동작과 동시에 작동할 때
Insert(시간, 동작) 순서와 상관없이 일정 시간이 되면 동작할 때

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    void Start()
    {
        // Sequence 생성
        Sequence mySequence = DOTween.Sequence();

        // 트윈 애니메이션을 Sequence에 추가
        mySequence.Append(transform.DOMoveX(5f, 1f));
        mySequence.Append(transform.DOScale(new Vector3(2, 2, 2), 1f));
        mySequence.Append(transform.DORotate(new Vector3(0, 180, 0), 1f));

        // 트윈 애니메이션이 완료된 후 콜백 함수 실행
        mySequence.OnComplete(() =>
        {
            Debug.Log("Sequence가 완료되었습니다!");
        });

        // Sequence 실행
        mySequence.Play();
    }
}

 

 

4. RectTransform

 

RectTransform을 사용하여 오브젝트 뿐만아니라 UI에도 적용 가능하다.

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    void Start()
    {
        RectTransform rectTransform = GetComponent<RectTransform>();
        rectTransform.DOAnchorPosY(150, 2);
    }
}

 

 

 

사용 예시

간단하게 DOTween을 사용하여 만들어봤다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class Manager : MonoBehaviour
{
    [SerializeField] Transform[] prefabs_card;
    [SerializeField] Transform tf_cardDeck;
    [SerializeField] Transform tf_handCard;
    [SerializeField] GameObject g_getCardButton;

    int numCards;                // 손패에 표시할 카드 수
    float maxHandWidth = 5.0f;  // 손패의 최대 폭
    float minCardSpacing = 0.4f; // 카드 간격 최소치
    float cardSpacing;

    void Start()
    {
        Deckshuffle();
    }

    void Deckshuffle()
    {
        Sequence mySequence = DOTween.Sequence();

        for (int i = 0; i < prefabs_card.Length; i++)
        {
            mySequence.Join(prefabs_card[i].DOMove(tf_cardDeck.position, 1.5f));
            mySequence.Join(prefabs_card[i].DOScale(new Vector3(1, 1, 1), 1.5f));
            mySequence.Join(prefabs_card[i].DORotate(new Vector3(0, 180, 0), 1.5f));
        }
        mySequence.Play().OnComplete(() =>
        {
            g_getCardButton.SetActive(true);
        });
    }

    public void getCard()
    {
        if(tf_cardDeck.childCount <= 0)
        {
            return;
        }
        Transform tf = tf_cardDeck.GetChild(0);
        tf.SetParent(tf_handCard.transform);
        Sequence mySequence = DOTween.Sequence();
        for (int i = 0; i < prefabs_card.Length; i++)
        {
            mySequence.Join(tf.DOMove(tf_handCard.position, 0.5f));
            mySequence.Join(tf.DORotate(new Vector3(0, 0, 0), 0.2f));
        }
        mySequence.Play().OnComplete(() =>
        {
            ArrangeCards();
        });
    }

    private void ArrangeCards()
    {
        // 손패 수 확인
        numCards = tf_handCard.childCount;

        // 카드 간격 초기화
        cardSpacing = maxHandWidth / Mathf.Max(1, numCards - 1);

        // 최대 간격을 넘어가면 간격을 조절
        if (cardSpacing > maxHandWidth)
        {
            cardSpacing = maxHandWidth;
        }

        // 최소 간격을 유지
        cardSpacing = Mathf.Max(cardSpacing, minCardSpacing);

        float totalWidth = (numCards - 1) * cardSpacing;
        float startX = -totalWidth / 2f;

        for (int i = 0; i < numCards; i++)
        {
            // 카드 인스턴스 생성
            Transform card = tf_handCard.GetChild(i);

            // 카드의 위치 조정 (가로로 일정한 간격으로 배치)
            float xPos = startX + i * cardSpacing;
            card.transform.DOMove(new Vector3(xPos, 0f, 0f), .2f); 
        }
    }
}

'Unity > 정보' 카테고리의 다른 글

[Unity] 사운드 매니저  (0) 2023.12.03
[Unity] AOS Fog of War 에셋  (0) 2023.12.02
[Unity] 구글 스프레드시트 연동  (0) 2023.11.14
[Unity] 스텐실 버퍼(Stencil Buffer)  (0) 2023.10.26
[Unity] Boids 군집 알고리즘  (0) 2023.10.16