(유니티) 움직이는 플랫폼 위에 주인공도 같이 움직이게 할 때

  • DKLaw 

움직이는 플랫폼 위에 주인공이 타 있는 경우, 플램폿과 주인공이 같이 움직여야 할 것입니다. 이렇게요.

움직이는 플랫폼
움직이는 플랫폼

그런데 단순히 플랫폼만 움직여주는 코드를 구현하면 당연하게도 주인공은 같이 움직이지 않습니다.

그렇다고 일일히 콜라이더로 플레이어 판단을 해주자니, 매번 오브젝트를 만들 때마다 콜라이더 크기도 정해줘야 하고, 플레이어가 오브젝트보다 약간 붕 떠 있고… 고민이 많을 겁니다.

이럴 떈 레이어 마스클 이용하여 플레이어가 오브젝트 위에 있는 판정을 내려주면 됩니다.

즉, 플레이어의 레이어를 ‘Player’로 설정해 놓았다면, 오브젝트에게는 플레이어 레이어를 터치하는 판정을 내려준다음, 플레이어와 같이 움직이게 하는 코드를 짜면 되는거죠.

코드는 이렇습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovingObject : MonoBehaviour
{
    [SerializeField] private float leftCap = -24; 
    [SerializeField] private float rightCap = -17;

    protected enum Direction {Right, Up, Left}
    protected Direction direction = Direction.Left;

    private BoxCollider2D coll;

    // Inspector variables 
    private LayerMask player ;

    // Start is called before the first frame update
    void Start()
    {
        coll = GetComponent<BoxCollider2D>();
        player = LayerMask.GetMask("Player");
    }

    // Update is called once per frame
    void Update()
    {
        direction =  MoveDirection(transform.position.x , leftCap, rightCap, direction);   // 패트롤 하는 위치에 따라 방향 조정 

        if (direction == Direction.Left ) 
        {
            MoveObject(Vector3.left * Time.deltaTime); 
        }else if (direction == Direction.Right )
        {
            MoveObject(Vector3.right * Time.deltaTime); 
        }else
        {    }
    }

    void MoveObject(Vector3 delta)
    {
        transform.Translate( delta); 
        if (coll.IsTouchingLayers(player))
        {
            GameObject.FindGameObjectWithTag("Player").transform.Translate( delta); 
        }
    }

    Direction MoveDirection(float x, float left, float right, Direction dir)
    {
        Direction output = dir;

        if(x < left) output =Direction.Right; 
        if (x > right) output = Direction.Left;

        return output;
    }
}