본문 바로가기
3D 콘텐츠 제작/[위저드 히어로] 제작 일지

[위저드 히어로 02] 무한맵 생성

by 잰쟁 2023. 9. 25.
728x90

 

무한맵

 

원래 Tilemap으로 맵을 생성하려 했으나,,

2D때와는 다르게 3D에서 사용하려니 맘대로 잘 안되었다ㅜㅡㅠ

 

 

그래서 Plane을 바닥에 깔아서 맵을 생성하고 Player가 이동할 때 마다 Trigger 체크를 한 후

Plane의 위치를 옮겨가며 무한으로 맵을 만들어주기로 하였다!

 


 

맵(Plane) 생성

 

1) 카메라 영역을 고려하여 적당한 크기로 Plane의 Scale을 조절

2) Trigger 감지를 위해 'Is Trigger' 체크

3) Plane을 복사하여 4개를 Player를 중심으로 배치

 

 

 

 



Plane 재배치 스크립트 작성

 

 

**무한맵 원리 : Trigger와의 충돌에서 벗어나면 Player의 이동 방향에 따라 Plane을 옮겨준다! 

(스크립트 작성은 이전에 했던 똑같은 장르의 '언데드 서바이벌'의 맵 재배치 스크립트를 참고하였다.)

 

 

Plane이 총 가로2, 세로2 이므로 옮길때는 크기에 x2를 해준만큼 옮겨야함!!

 

 

Reposition 스크립트

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

public class Reposition : MonoBehaviour
{
    [SerializeField]
    private Transform playerTrans;
    
    //Trigger 체크(충돌에서 벗어나면 실행)
    private void OnTriggerExit(Collider collision)
    {
        //..tag가 "Area" 아니면 함수 탈출
        if (!collision.CompareTag("Area"))
            return;

        //..player 위치, 현재 위치
        Vector3 playerPos = this.playerTrans.position;
        Vector3 myPos = this.transform.position;

        //..둘 사이(Player, Plane)의 거리 구하기(x,y)
        float dirX = playerPos.x - myPos.x;
        float dirZ = playerPos.z - myPos.z;

        //..거리값을 절대값으로 변환
        float diffX = Mathf.Abs(dirX);
        float diffZ = Mathf.Abs(dirZ);

        //..거리에 따라 값(방향) 지정하기(오른쪽 : 1, 왼쪽 : -1)
        dirX = dirX > 0 ? 1 : -1;
        dirZ = dirZ > 0 ? 1 : -1;


        //이동시키기
        //..switch ~ case : 변수의 값에 따라 다른 로직 실행
        switch (transform.tag)
        {
            case "Ground":
                //..대각선으로 이동시
                if (Mathf.Abs(diffX - diffZ) <= 0.1f)
                {
                    transform.Translate(Vector3.forward * dirZ * 400);
                    transform.Translate(Vector3.right * dirX * 400);
                }
                //..좌우로 이동시
                else if (diffX > diffZ)
                {
                    transform.Translate(Vector3.right * dirX * 400);
                }
                //..상하로 이동시
                else if (diffX < diffZ)
                {
                    transform.Translate(Vector3.forward * dirZ * 400);
                }
                break;
        }
    }
}

 

 

작성한 스크립트를 Plane들에게 추가

 

 

Trigger 체크를 위해 Player에 'Area'라는 빈오브젝트 생성 후

Box Collider  컴포넌트 및 'Area' 태그 추가

** Collider 크기 = Plane의 크기

Area 설정

 

 

 

실행 결과