언리얼로 플랫폼을 앞뒤로 이동 시켜 보았다.
그럼 지금 만들고 있는 유니티에서도 한번 적용시켜볼까?
새로운 타일맵을 생성한 뒤 움직일 플랫폼을 생성하고 새로운 C# 스크립트를 작성한다.
Vector2.MoveTowards(Vector2 current, Vector2 target, float maxDistanceDelta);
Update()에서 MoveTowards()를 사용하여 오브젝트를 현재 위치에서 목표 위치로 이동하게 만들어준다.
우선 현재 플랫폼의 위치, 움직일 이동 거리를 통해 목표 위치를 구해보자.
public class MovingPlatform : MonoBehaviour
{
private Vector2 startPosition; //플랫폼이 움직이기 시작한 위치
[SerializeField] float speed;
[SerializeField] float distanceMoved = -1; //플랫폼이 이동한 거리
public float moveDistance = 10; //플랫폼이 이동할 거리
void Start()
{
//startPosition을 처음 플레이가 시작할 때의 오브젝트의 위치로 저장
startPosition = transform.position;
}
void Update()
{
//매 프레임마다 움직이기 시작한 거리와 움직인 거리를 비교한다
distanceMoved = Vector2.Distance(startPosition, transform.position);
//움직인 거리가 이동하도록 지정할 거리를 넘어서면
//속도에 -1를 곱하여 반대로 이동하게 만든다
//시작 위치를 반대로 움직이기 시작한 위치로 지정
if(distanceMoved > moveDistance)
{
speed *= -1;
startPosition = transform.position;
}
transform.position =
Vector2.MoveTowards(transform.position, new Vector2(moveDistance, transform.position.y), speed * Time.deltaTime);
}
}
플랫폼이 좌우로 움직이기는 하나 플레이어가 플랫폼이랑 같이 움직이지 않는다.
플레이어가 플랫폼 위에 있어도 플레이어의 위치값이 움직이는 플랫폼에 따라 변경되지 않기 때문이다.
플레이어가 플랫폼에 닿으면 플랫폼의 자식으로 들어가도록 만들어보자.
private void OnCollisionEnter2D(Collision2D collision)
{
if(collision.gameObject.CompareTag("Player"))
{
collision.transform.SetParent(transform);
}
}
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
collision.transform.SetParent(null);
}
}
플레이어 오브젝트가 플랫폼에 올라서면 플랫폼의 자식으로 들어가는 것을 확인할 수 있었다.
부모 오브젝트에 따라 자식 오브젝트가 같이 움직이기 때문에 플레이어는 플랫폼을 따라 같이 움직인다.