DOTween 소개
DOTween을 사용하면 코드로 간단하게 애니메이션을 만들고 조작할 수 있습니다. 주로 개체의 이동, 회전, 크기 조절 등의 애니메이션을 쉽게 구현할 수 있습니다. 또한, 간단한 코드 작성으로 시간에 따른 값의 변경을 부드럽게 처리할 수 있는 등의 기능을 제공합니다. 간단하고 효과적인 애니메이션 및 트윈 처리를 위한 강력한 도구로 평가받고 있습니다.
https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676
주요 기능
https://dotween.demigiant.com/documentation.php
위 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 |