2D Moving Platform

Jihyun·2023년 12월 13일
0

Unity 2D

목록 보기
3/10

언리얼로 플랫폼을 앞뒤로 이동 시켜 보았다.


그럼 지금 만들고 있는 유니티에서도 한번 적용시켜볼까?

좌우로 이동하는 플랫폼

새로운 타일맵을 생성한 뒤 움직일 플랫폼을 생성하고 새로운 C# 스크립트를 작성한다.

Vector2.MoveTowards(Vector2 current, Vector2 target, float maxDistanceDelta);

Update()에서 MoveTowards()를 사용하여 오브젝트를 현재 위치에서 목표 위치로 이동하게 만들어준다.

우선 현재 플랫폼의 위치, 움직일 이동 거리를 통해 목표 위치를 구해보자.

  1. 게임이 시작할 때 플랫폼의 처음 위치를 구한다.
  2. 타겟 위치는 new Vector2(x, y)를 사용하여 정해준다.
    x축으로 moveDistance 만큼 이동할 것이고 y축으로는 이동하지 않기에 현재 오브젝트의 y축 위치를 그대로 사용
  3. 매 프레임마다 처음 위치에서부터 움직인 위치의 거리를 비교한다.
  4. 움직인 거리가 moveDistance의 값을 넘어서면 속도에 -1를 곱하여 반대로 이동, 시작 위치를 업데이트 한다.
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);
            
        }
}


플레이어 오브젝트가 플랫폼에 올라서면 플랫폼의 자식으로 들어가는 것을 확인할 수 있었다.
부모 오브젝트에 따라 자식 오브젝트가 같이 움직이기 때문에 플레이어는 플랫폼을 따라 같이 움직인다.

profile
잊어버려도 다시 리마인드 할 수 있도록 공부한 것을 기록합니다

0개의 댓글