
유니티로 3D 플랫포머 예제를 만들던중 움직이는 발판을 만드는 상황이였다.
발판은 특정한 경로를 이동하는 발판은 다음과 같은 기능을 갖는다.

움직이는 발판은 빈 부모와 발판, 경로 지점으로 구성된다.


발판은 일단 큐브를 변경하여 만들었으며 추가로 이후 만들 스크립트와 스크립티에서 사용할 트리거를 추가하였다.
위 트리거는 발판위의 다른 오브젝트를 검사한다.

발판이 지나가는 각 지점은 단순한 빈 오브젝트이다.
[SerializeField] private Transform[] points;
[SerializeField] private float speed = 1f;
[SerializeField] private float waitTime = 1f;
[SerializeField] private float lastWaitTime = 0f;
private int i = 0;
private bool canMoving = true;
발판에 추가할 스크립트는 다음의 멤버 변수들을 갖는다.
points는 발판이 지나갈 지점을
speed는 발판의 이동속도
waitTime, lastWaitTime는 지점 도착시 대기 시간을 관리한다.
i는 발판의 인덱스를 저장하며
canMoving은 지점 도착시 발판이 움직이지 않도록 한다.
void Update()
{
if (canMoving)
{
// 위치 이동
if (Vector2.Distance(transform.position, points[i].position) < 0.02f)
{
i++;
canMoving = false;
lastWaitTime = Time.time;
if (i >= points.Length)
{
i = 0;
}
}
transform.position = Vector3.MoveTowards(transform.position, points[i].position, speed * Time.deltaTime);
}
else
{
if (Time.time - lastWaitTime > waitTime)
{
lastWaitTime = Time.time;
canMoving = true;
}
}
}
위 코드는 발판과 목표 지점과의 거리를 구하여 충분히 가까워졌다면 다음 발판으로 이동하는 코드이다.
이때 한번 지점에 도착하면 canMoving를 거짓으로 바꾸어 움직임을 막고 waitTime동안 대기한다.
if (i >= points.Length)
{
i = 0;
}
그리고 위 if문을 통해 지점을 반복해서 이동한다.
private void OnTriggerEnter(Collider other)
{
other.transform.SetParent(transform);
}
private void OnTriggerExit(Collider other)
{
other.transform.SetParent(null);
}
OnTriggerEnter를 통해 위에서 만든 발판의 트리거에 오브젝트가 진입하면 해당 오브젝트의 부모를 자신으로 하고 탈출하면 SetParent(null);을 통해 부모관계를 해제한다.
이를 위에 있는 오브젝트와 함께 이동할 수 있다.
