쫑가 과정

쉽게 플레이어 맵 이동, 맵 변경 본문

Unity 따라 배우기/Topdown 2D RPG In Unity

쉽게 플레이어 맵 이동, 맵 변경

쫑가 2022. 2. 23. 19:39

오늘 결과

 

1. 타일 맵 깔기

새롭게 씬에 타일을 깐다.

 

2. Collider를 이용한 플레이어 이동.

텔레포트로 사용할 새로운 GameObject를 생성

오른쪽->왼쪽 / 왼쪽 -> 오른쪽
두 게임오브젝트에 collider를 넣고 Trigger.
적당한 곳에 위치시킨다.

3. 이동(텔레포트) Script 생성

using UnityEngine;

public class AreaTransitionScript : MonoBehaviour
{
	// 카메라 스크립트 변수
    private MainCameraController cam;
    // 새로운 맵 카메라 최소, 최대 범위 설정
    [SerializeField] Vector2 newMinCameraBoundary;
    [SerializeField] Vector2 newMaxCameraBoundary;
    // 플레이어가 새로운 맵으로 이동된 후 위치 조절.
    [SerializeField] Vector2 playerPosOffset;
    // 출구 위치 변수
    [SerializeField] Transform exitPos;
    private void Awake()
    {
        cam = Camera.main.GetComponent<MainCameraController>();
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "Player")
        {
            cam.minCameraBoundary = newMinCameraBoundary;
            cam.maxCameraBoundary = newMaxCameraBoundary;

            cam.player.position = exitPos.position +(Vector3)playerPosOffset;
        }
    }
}

OnTriggerEnter2D를 사용해

Player라는 태그를 가진 콜라이더와 겹친다면

MainCameraController에 있는 최소/최대 카메라 범위를 새로운 카메라 범위로 지정.

플레이어의 위치는 ExitPos변수 위치에서 playerPosOffset 만큼 이동된다. (텔레포트)

4. Unity 내 설정

오른쪽 이동 세팅

새로운 카메라 최대 최소 경계설정은 앞에서 했던 것처럼 하면 된다.

출구 위치를 지정해준다.

결과

5.프리팹화

프리팹화 해두면 다음 사용할 때 손쉽게 사용 가능하다.

 

---------22.03.11 오류 수정---------

장소 이동 시 Clamp함수로 정한 최소, 최댓값을 벗어나 Clamp값이 0이 되는 현상.

잘 작동했던 이유는 0이 된 후 새로운 경계값이 들어갔기 때문.(프레임 순서는 동일하기에 결과가 0이 되기도 한다.)

아래 코드를 추가했다.

 

Clamp함수를 사용하는 한 0이 되지 않게 할 수 없겠더라. 최대한 Clamp를 사용하면서 할 방법을 고민했다.

// 플레이어 스크립트
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "Boundary")
        {
            boundaryScript = collision.GetComponent<AreaTransitionScript>();
            saveMaxPos = boundaryScript.newMaxCameraBoundary;
            saveMinPos = boundaryScript.newMinCameraBoundary;
        }
    }
// 카메라 스크립트
        if(minCameraBoundary == Vector2.zero && maxCameraBoundary == Vector2.zero)
        {
            minCameraBoundary = player.GetComponent<Movement>().saveMinPos;
            maxCameraBoundary = player.GetComponent<Movement>().saveMaxPos;
        }

플레이어가 밟은 오브젝트의 새로운 경계값을 변수에 저장하고 Clamp값이 0이 된다면 변수값을 꺼내 쓴다.

효율은 좋지 못하다고 생각된다. Clamp함수를 쓰지 않거나 더 좋은 방법을 찾아서 사용해야 할 듯하다.

Comments