오늘은 개인 프로젝트 과제에서 도전 기능에 속해 있는 "움직이는 플랫폼 구현" 을 해보려고한다.
움직이는 발판의 핵심은 "지속적으로 반복해서 좌우로 이동한다.", "발판위에 플레이어가 올라갔을 때 발판의 이동을 자연스럽게 따라가도록 한다." 이렇게 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))
이 코드를 미리 만들어 둔 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()을 통해 플레이어가 발판에서 떨어지면 부모객체를 없애는 코드이다.
위 코드를 적용시키면 다음과 같이 잘 작동한다.
