로그라이크 게임 제작 06

로그라이크 게임 제작 06

Summary 맵 로드시 랜덤 디자인 패턴을 적용하여 다양한 맵을 구현하는 방법을 설명합니다. 여러 패턴을 enum으로 정의하고, 맵 이동 시 랜덤으로 활성화하여 다채로운 경험을 제공합니다. 코드는 GameObject 리스트를 초기화하고, 맵 이동 시 랜덤 패턴을 불러오는 기능을 포함합니다.


enum 으로 여러개의 패턴 디자인을 넣어두고

기존 프리팹에는 전부 비활성화 해둠

맵이 이동했을때 랜덤으로 비활성화해둔 패턴 중 하나가 즉 enum의 요소중 하나가 case문으로 (확률) 활성화되도록하여 다채로운 맵이라고 느껴지게함

랜덤맵 디자인이 저장될 GameObject 리스트를 선언 및 초기화

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Reposition.cs

// ... 프리팹 보관할 변수
public GameObject[] prefabs;

// ... 풀 담당을 하는 리스트들
//리스트도 프리팹의 개수만큼 생성되어야하니 배열로 선언해준다
List<GameObject>[] prefabsList;

void Awake() 
{
    //리스트기때문에 new를 만들어줘야함
    //List 배열의 크기는 prefabs배열과 동일하기때문에 배열에 Prefabs의 길이를 넣어준다
    prefabsList = new List<GameObject>[prefabs.Length];

    //for문으로 배열 내부 오브젝트들을 모두 초기화해준다
    for (int index = 0; index < prefabsList.Length; index++)
    {
        //각각의 리스트들도 전부 초기화해줌
        prefabsList[index] = new List<GameObject>();
    }
}

맵이 이동할때마다 저장된 디자인패턴을 랜덤으로 불러오는 기능을 **randTile()** 함수로 선언

Awake() 에도 포함시켜야합니

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//Reposition.cs


void moveMap()
{
    Vector3 mapSize = groundSize.transform.localScale;
    Vector3 playerPos = GameManager.instance.player.transform.position;
    
    Vector3 tilePos = transform.position; 
void setRandTile()
    {
        for (int index = 0; index < prefabsList.Length; index++)
            prefabs[index].SetActive(false);
        
        prefabs[Random.Range(0, prefabsList.Length)].SetActive(true);
    }
    float diffX = Mathf.Abs(playerPos.x - tilePos.x);

    Vector3 playerDir = GameManager.instance.player.inputVec;
    float dirX = playerDir.x < 0 ? -1 : 1;

    //맵이 이동할때마다 맵 디자인이 랜덤으로 변합니다
    if (diffX >= (mapSize.x * 3))
    {
        transform.Translate(Vector3.right * dirX * (mapSize.x * 5));
        **randTile();**
    }
}

**//prefab에 등록한 프리팹을 초기화하고 랜덤으로 Active 하는 코드
void randTile()
{
    for (int index = 0; index < prefabsList.Length; index++)
        prefabs[index].SetActive(false);
    
    prefabs[Random.Range(0, prefabsList.Length)].SetActive(true);
}**

💬 댓글

GitHub 계정으로 로그인하여 댓글을 남겨보세요. GitHub 로그인

🔧 댓글 시스템 설정이 필요합니다

GitHub Discussions 기반 댓글 시스템을 활성화하려면:

  1. Giscus 설정 페이지에서 설정 생성
  2. GISCUS_SETUP_GUIDE.md 파일의 안내를 따라 설정 완료
  3. Repository의 Discussions 기능 활성화

Repository 관리자만 설정할 수 있습니다. 설정이 완료되면 모든 방문자가 댓글을 남길 수 있습니다.