endpoint를 직접 설정하여, 해당 구간을 움직이는 발판을 만들어 보고자 한다.
나는 2D 게임에 사용될 발판이라 image를 넣었는데 3D 게임에 사용한다면 그게 맞는 3D mesh를 넣으면 된다.
FootBoard
: 발판 image, 움직임의 시작점 (startPoint), 스크립트가 들어가는 오브젝트 (발판에 적절한 Collider를 추가하는 것을 잊지 말자!)
EndPoint
: 움직일 구간의 끝
이 발판은 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);
transform.DOMove(targetPos, duration)
targetPos까지 duration동안 움직인다.
SetLoops(int loops, LoopType loopType = LoopType.Restart)
loops : 반복할 수, 무한대로 하길 원하면 -1
loopType : 여기서는 Yoyo를 사용했다.
SetEase(Ease easeType)
플레이어가 발판을 밟았을 때 함께 움직이길 원한다면 이에 관련된 설정을 해주어야 한다.
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);
}
해당 프리팹을 시작하길 원하는 위치에 배치한다.
프리팹 안에 있는 endPoint를 움직이길 원하는 위치에 배치한다.
FootBoard
에 들어가 디테일 설정을 한다.
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);
}
}