[TIL] 29일 차 - Unity 움직이는 발판 만들기

ChangBeom·2025년 3월 7일

TIL

목록 보기
30/53
post-thumbnail

오늘은 개인 프로젝트 과제에서 도전 기능에 속해 있는 "움직이는 플랫폼 구현" 을 해보려고한다.

[움직이는 발판]

움직이는 발판의 핵심은 "지속적으로 반복해서 좌우로 이동한다.", "발판위에 플레이어가 올라갔을 때 발판의 이동을 자연스럽게 따라가도록 한다." 이렇게 2가지 이다. 이 2가지 핵심을 기억하며 하나씩 구현해보자.

[구현]

먼저 지속적으로 반복해서 좌우로 이동하는 부분은 DOTween을 활용해서 정말 간단하게 만들 수 있다.

링크 : DOTween이란?

using UnityEngine;
using DG.Tweening;

public class MovingPlatform : MonoBehaviour
{
    [SerializeField] Vector3 moveTo = Vector3.zero;			//	얼마나 이동할 것인지    
    [SerializeField] float moveTime = 1f;	    //	이동하는 데 걸리는 시간 (짧을수록 빠름)

    private void Start()
    {
        Move();
    }

    private void Move()
    {
    	transform.DOMove(transform.position + moveTo, moveTime).SetEase(Ease.InOutQuad).SetLoops(-1, LoopType.Yoyo);
    } 
}

위 코드를 간단하게 설명하자면 DOTween의 DOMove() 함수를 활용해서 오브젝트의 움직임을 구현한 것이다.

DOMove(Vector3, float, SetEas(Ease))

  • Vector3 : 이동하고 싶은 거리
  • float : 이동 하는 데 걸리는 시간
  • SetEas(Ease) : 해당 방법으로 이동
    • Ease.InOutQuad : 애니메이션이 시작할 때와 끝날 때는 느리게, 중간에는 빠르게 진행.
    • SetLoops() : 애니메이션의 반복횟수를 설정
      • -1은 무한 반복을 의미하며, LoopType.Yoyo는 애니메이션이 끝난 후 반대 방향으로 다시 진행되도록 설정한다.

이 코드를 미리 만들어 둔 MovingPlatform에 적용시키면 아래와 같이 잘 작동한다.


이렇게 만든 발판위에 올라서면 플레이어는 발판을 따라가지 않아 떨어지게 된다. 이제 발판에 올라서면 플레이어가 발판을 따라가도록 구현해보자.


이것 또한 매우 간단하게 구현할 수 있다. 방법은 플레이어가 발판에 닿았을 때, 플레이어를 발판의 자식 객체로 두는 것이다. 부모의 transform이 변하면 자식 객체의 transform도 따라서 변하는 특성을 이용하는 것이다.

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

public class MovingPlatform : MonoBehaviour
{
    [SerializeField] Vector3 moveTo = Vector3.zero;
    [SerializeField] float moveTime = 1f;

    private void Start()
    {
        Move();
    }

    private void Move()
    {
        transform.DOMove(transform.position + moveTo, moveTime).SetEase(Ease.InOutQuad).SetLoops(-1, LoopType.Yoyo);
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            collision.gameObject.transform.SetParent(this.transform);
        }
    }

    private void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            collision.gameObject.transform.SetParent(null);
        }
    }
}

OnCollisionEnter()를 활용해서 발판이 플레이어에 닿으면 플레이어의 부모객체를 발판으로 하고, OnCollisionExit()을 통해 플레이어가 발판에서 떨어지면 부모객체를 없애는 코드이다.

위 코드를 적용시키면 다음과 같이 잘 작동한다.

0개의 댓글