내일배움캠프/Unity

유니티 추가기능 - DOTween

서보훈 2024. 9. 10. 20:57

이번엔 유니티 자체기능이 아닌, 에셋스토어에서 받아서 사용하는 추가기능인 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

Dotween은 transform등을 사용해 구현하는 오브젝트의 이동을 더욱 쉽게 처리해주는 에셋으로, 오브젝트의 이동, 회전, 크기변경 등의 기능뿐만 아니라 텍스트에 애니메이션을 추가하는데도 사용할 수 있습니다.

 

 

해당 에셋을 받고 import를 하면 유틸리티 패널이 나오는데, 여기서 Setup 버튼을 누르고 에디터에서 작업이 끝나면 우측과 같은 창이 나옵니다.

여기서 Apply를 누르면 사용할 준비가 끝납니다.

 

이 에셋을 스크립트에서 사용하기 위해서는 DG.Tweening 네임스페이스를 불러올 필요가 있습니다.

using DG.Tweening;

 

이 네임스페이스를 사용하게 되면, transform에 추가적으로 DOMove, DORotate 등의 함수가 추가됩니다.

이 함수들은 기존 transform.Translate 등의 기능들을 대체하여 더 쉽게 오브젝트의 움직임을 구현할 수 있게 해줍니다.

 

DOMove를 사용하여 시작하면 이 스크립트가 붙은 오브젝트를 50, 50, 0 위치의 지점의 오브젝트에 이동하라는 명령을 내려보겠습니다.

public GameObject target;
private float moveSpeed = 10f;

// Start is called before the first frame update
void Start()
{
    this.transform.DOMove(target.transform.position, moveSpeed);
}

 

DOMove는 매개변수로 목적지의 Vector3값과 이동속도인 float값을 받습니다.

여기의 이동속도를 포함한 이후 모든 duration 값은 이동에 걸리는 시간을 뜻합니다.

(이동속도 10 == 해당위치까지 10초 걸림)

 

Start 에서 명령을 내려 한번의 작동으로 지정한 위치까지 움직이는것을 볼 수 있습니다.

이 외에도 추가적인 매개변수로 bool 변수인 snapping 을 선택할 수 있는데, true로 선택할경우 int 단위로 움직이게 할 수 있습니다.

 

DORotate를 사용하면 원하는 Vector3의 값과 회전 속도 float 값을 매개변수로 오브젝트를 회전시킬 수 있습니다.

10의 속도록 0,90,90 까지 정육면체를 회전시켜보겠습니다.

private float moveSpeed = 10f;

void Start()
{
    transform.DORotate(new Vector3(0, 90, 90), moveSpeed);
}

 

 

기존 transform.rotation 이나 Rotate() 함수를 사용할때 오일러값과 쿼터리언 값을 변경해가며 사용하는것보다 편하게 물체를 회전시킬 수 있습니다.

이 함수에도 추가적인 매개변수로 RotateMode 를 사용하는데, 기본적으로 가장 빠르게 회전하는 방향으로 회전하며 360를 넘도록 회전하게 지정하거나 회전 기준을 Local, World 중 선택할 수 있는 옵션을 제공합니다.

 

DOShake 기능이 존재하는데 이는 Position이나 Rotation을 무작위로 변경시키며 매개변수로 속도를 받게 됩니다.

private float moveSpeed = 10f;

void Start()
{
    transform.DOShakePosition(moveSpeed);
    transform.DOShakeRotation(moveSpeed);
}

 

두가지를 모두 적용시키면 이러한 모습이 됩니다.

 

이 옵션또한 추가적인 매개변수로 세기, 진동수, 무작위성, 페이드아웃, 무작위성 모드를 선택하여 넣을 수 있습니다.

 

transform의 구성요소중 3번째인 Scale 또한 변경시킬 수 있습니다.

먼저 매개변수로 float, float 값을 사용하여 목표 Scale값, 걸리는 시간을 지정할 수 있습니다.

private float moveSpeed = 1f;

void Start()
{
    transform.DOScale(3, moveSpeed);
}

목표값을 float 로 사용하면 Scale의 x,y,z 값이 모두 지정한 스케일이 되도록 변경할 수 있습니다.

 

이 함수는 오버로딩이 되어있는데 목표 Scale값의 매개변수로 Vector3값을 줄 수 있습니다.

이 경우에는 지정한 Vector3 값이 되도록 오브젝트가 변하게 됩니다.

 

마지막으로 지정한 움직임을 순서대로 수행하도록 만들어 줄 수도 있습니다.

    public GameObject target;
    private float moveSpeed = 1f;

    Sequence cubeMove;

    void Start()
    {
        cubeMove = DOTween.Sequence().SetAutoKill(false)
            .Append(transform.DOMove(target.transform.position, moveSpeed))
            .Append(transform.DORotate(new Vector3(90, 90, 0), moveSpeed))
            .Join(transform.DOScale(3, moveSpeed));
    }

 

Sequence 클래스로 변수를 선언하여 해당 변수에 움직임을 지정해준 모습입니다.

SetAutoKill 함수는 시퀀스가 종료된 후, 이 오브젝트를 파괴할것인지를 결정하며 Append 함수는 이 뒤에 재생하라는 요청, Join은 바로 앞의 동작과 같이 이 동작을 수행하라는 요청입니다.

 

해당코드를 실행했을때의 모습을 보면 이해하기 편할것이라고 생각합니다.

먼저 첫 움직임 요청인 DOMove를 처리한 뒤, DORotate 와 DOScale을 동시에 처리하는 모습을 볼 수 있습니다.

 

또한, Append 를 넣기전 Pause()를 사용하면 .Play() 가 나오기 전까지 작동하지 않도록 할 수 있습니다.

void Start()
{
    cubeMove = DOTween.Sequence().SetAutoKill(false).Pause()
        .Append(transform.DOMove(target.transform.position, moveSpeed))
        .Append(transform.DORotate(new Vector3(90, 90, 0), moveSpeed))
        .Join(transform.DOScale(3, moveSpeed));

    cubeMove.Play();
}

 

 

이 외에도 해당 에셋은 텍스트의 순차적인 입력이나 오브젝트의 색 변화등의 기능이 추가적으로 있는 유용한 도구입니다.

'내일배움캠프 > Unity' 카테고리의 다른 글

유니티 기능 - Rule Tile  (0) 2024.10.07
유니티 기능 - 타일맵  (0) 2024.10.07
유니티 추가기능 - DOTween 2  (0) 2024.09.13