카테고리 없음

무한맵 이동

park-gom 2024. 9. 7. 18:57

맵을 이동하는 로직을 만들고 있는데 문제가 발생했다

잘 작동하는듯했는데 일부 타일이 자기 멋대로 뛰기 시작한다

계속 돌려보면서 문제를 확인해봤는데

 

플레이어와 맵타일의 좌표

발견한 문제점은 좌표의 이상이다

타일은 y축이 -15인데 플레이어는 -15.63이였다.

즉 두 오브젝트의 y축 차이는 0.63이다 근데 화면상에 플레이어는 누가봐도 4정도의 차이를 가지고있어야한다

grid위에 올라간 tile 오브젝트와 scene 오브젝트로 존재하는 player는 서로 다른 좌표를 사용한다는 결론을 내렸다.

서로 사용하는 좌표의 기준은 다른데, 좌표값을 단순비교하다보니 특정상황에서 완전히 틀린 결과가 나온다.

 

문제해결을 위해 chatGPT에서 물어봤다 tilemap에서 사용하는 새로운 함수 알았다.

각 함수가 어떤 값을 리턴하는지 확인하기 위해 디버그로 찍어봤다

 

WolrdToCell 함수를 통해 플레이어의 좌표를 셀좌표로 변환할수있다는것을 알았다

그럼 타일과의 x y좌표를 비교해서 이 값이 일정이상 넘어가면 맵을 이동하는 방식으로 수정해보자

 

using UnityEngine;
using UnityEngine.Tilemaps;

public class Reposition : MonoBehaviour
{
    Player player;
    Tilemap tilemap;
    Collider2D coll;

    private void Awake()
    {
        coll = GetComponent<Collider2D>();
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (!collision.CompareTag("Area"))
            return;
        
        player = GameManager.instance.player;
        Vector3 playerDir = player.inputVec;

        switch (transform.tag)
        {
            case "Ground":
                tilemap = GetComponent<Tilemap>();
                Vector3Int playerCellPos = tilemap.WorldToCell(player.transform.position);
                

                if (playerCellPos.y >= 25)
                {
                    transform.Translate(Vector3.up * 60);
                } else if (playerCellPos.y <= -36)
                {
                    transform.Translate(Vector3.up * -60);
                }
                if(playerCellPos.x >= 35)
                {
                    transform.Translate(Vector3.right * 60);
                }
                else if(playerCellPos.x <= -26)
                {
                    transform.Translate(Vector3.right * -60);
                }
                break;
            case "Enemy":
                if (coll.enabled)
                {
                    transform.Translate(playerDir * 20 + new Vector3(Random.Range(-3f, +3f), Random.Range(-3f, +3f), 0));
                }
                break;
        }

    }
}

먼저 어느정도 값을 넘겨야 하는지 디버그를 찍어보면서 그값을 구하고

좀 더럽긴하지만 x와 y값을 검증해서 방향에 따라 타일이 이동하도록 바꿨다.

이 값은 타일의 크기, 이동속도, Area오브젝트가 가진 rigid의 크기에 따라 달라질수있기에,

직접 디버그로 찍어보면서 적절하게 사용하면된다.