[Unity] DOTween으로 움직이는 발판 만들기

SYiee·2024년 1월 27일
1

Unity

목록 보기
11/13

📌 움직이는 발판 만들기

endpoint를 직접 설정하여, 해당 구간을 움직이는 발판을 만들어 보고자 한다.
나는 2D 게임에 사용될 발판이라 image를 넣었는데 3D 게임에 사용한다면 그게 맞는 3D mesh를 넣으면 된다.

💭 Prefab 만들기

  • FootBoard : 발판 image, 움직임의 시작점 (startPoint), 스크립트가 들어가는 오브젝트 (발판에 적절한 Collider를 추가하는 것을 잊지 말자!)

  • EndPoint : 움직일 구간의 끝

💭 Scripts

이 발판은 DOTween API를 사용하여 만들었다. DOTween이 무엇인지, 어떻게 다운 받아 유니티에 적용하는지는 여기서 확인하길 바란다.

✔ 변수 선언

  • endPoint : 움직일 구간의 끝
  • time : 왕복 거리에 드는 시간
  • Mode : 어떤 움직임으로 동작할지 결정하는 enum
    public Transform endPoint;
    [SerializeField] private float time = 3;

    public enum Mode { Linear, InOutQuad };
    public Mode mode = Mode.Linear;

✔ 발판 움직이게 하기

endPoint의 위치까지 time시간동안 움직이고, Ease.Linear 모드로 이를 무한시간동안 Loop해라.

transform.DOMove(endPoint.position, time).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear);
  1. transform.DOMove(targetPos, duration)

    targetPos까지 duration동안 움직인다.

  2. SetLoops(int loops, LoopType loopType = LoopType.Restart)

    • loops : 반복할 수, 무한대로 하길 원하면 -1

    • loopType : 여기서는 Yoyo를 사용했다.

      • LoopType.Restart: When a loop ends it will restart from the beginning.
      • LoopType.Yoyo: When a loop ends it will play backwards until it completes another loop, then forward again, then backwards again, and so on and on and on.
      • LoopType.Incremental: Each time a loop ends the difference between its endValue and its startValue will be added to the endValue, thus creating tweens that increase their values with each loop cycle. This loop type works only with Tweeners.
  3. SetEase(Ease easeType)

✔ SerParant 설정하기

플레이어가 발판을 밟았을 때 함께 움직이길 원한다면 이에 관련된 설정을 해주어야 한다.

SetParant 기능을 활용해 작성해주면 된다.

public void SetParent(Transform p);

자식으로 들어갈 obj의 transform . Setparant ( 부모로 설정하고 싶은 obj의 transform

  • Transform p 를 null로 해주면 해제된다.

2D에 사용될 발판이기 때문에 OnCollisionEnter2D를 사용했는데 만약 3D라면 OnCollisionEnter를 사용해주면 된다. Exit의 경우에도 마찬가지이다.

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if(collision.gameObject.tag == "Player")
            collision.gameObject.transform.SetParent(this.transform);
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        collision.gameObject.transform.SetParent(null);

    }

✔ Editor에서 할당하고 설정하기

  1. 해당 프리팹을 시작하길 원하는 위치에 배치한다.

  2. 프리팹 안에 있는 endPoint를 움직이길 원하는 위치에 배치한다.

    • 양 옆으로 움직이길 원하는 경우 다음과 같이 배치
    • 위 아래로 움직이길 원하는 경우
    • 대각선도 응용 가능 !
  3. FootBoard 에 들어가 디테일 설정을 한다.

    • Time : 해당 발판이 왕복하는데 드는 시간을 의미한다.
    • Mode : 발판이 움직이는 모드
      • Linear : 처음부터 끝까지 동일하게 움직임
      • InOutQuad : 처음과 끝에서는 살짝 느려진다.

📑 전체코드

using UnityEngine;
using DG.Tweening;


public class FootBoard_wEndPoint : MonoBehaviour
{
    public Transform endPoint;
    [SerializeField] private float time = 3;

    public enum Mode { Linear, InOutQuad };
    public Mode mode = Mode.Linear;
    

    private void Start()
    {
        if(mode == Mode.Linear)
            transform.DOMove(endPoint.position, time).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear);
        else
            transform.DOMove(endPoint.position, time).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.InOutQuad);


    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        collision.gameObject.transform.SetParent(this.transform);
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        collision.gameObject.transform.SetParent(null);

    }

}
profile
게임 개발자

0개의 댓글