2d 자동 맵생성

맵 자동 생성(8)

게임만드는학생 2025. 5. 13. 15:15

https://tpree.tistory.com/237

 

맵 자동 생성(7)

https://tpree.tistory.com/236 맵 자동 생성(6)이전까지 방을 생성해서 다 펼쳐놓고 그 mst를 이용해 방 들을 연결하였다.그리고 그 간선들을 이용해 문과 벽을 생성하고 통로까지 만들었다. https://tpree.tis

tpree.tistory.com

 

지난 번 몬스터 추적기능에 이어서 룸 배틀 시퀀스에 대해 다뤄보겠다. 

 

먼저 플레이어가 방에 들어가게 되면 몬스터들이 활성화되고, 몬스터를 전부 처치하기 전까지는 방을 나갈 수 없다. 

 

이를 위해서는 플레이어가 방에 들어온건지, 해당방은 클리어가 된 상태인지, 문을 어떤식으로 열고 닫을 건지를 다 생각해야한다. 

 

먼저 플레이어가 방에 들어왔나? 를 체크할 때 문에 달려있는 콜라이더를 이용했다. 

각 방향에 대한 문 프리팹을 만들고, 콜라이더를 2개씩 달았다. enter,exit Collider 이다. 

이것으로 enter를 밟았는데 몬스터수가 0이아니다. 그럼 몬스터를 활성화 시키고,

0이다, 이미 클리어한 상태이다. 

그리고 enter를 밟으면 문이 열리고 exit은 방안에 있으니 이것까지 밟으면 들어왔다고 판단하고 문을 닫는다.

그리고 배틀을 시작할지 판단한다.

배틀이 시작되면 문 콜라이더는 비활성화시키고, 종료되면 활성화시킨다. 

 

코드로 보겠다. 

void ActionEnterDoor(Collider2D collision)
{
    if(collision.tag == "Player")
    {
        Debug.Log("before IsEntered" + isEntered + "in ActionEnterDoor");   
        if(isEntered == false)
            StartCoroutine(doorOpen());
        else
        {
            StartCoroutine(doorClose());
            isEntered = false;
        }
        Debug.Log("after IsEntered" + isEntered + "in ActionEnterDoor");
    }
}

void ActionExitDoor(Collider2D collision)
{
    if(collision.tag == "Player")
    {
        Debug.Log("before IsEntered" + isEntered + "in ActionExitDoor");
        if (isEntered == false)
        {
            StartCoroutine (doorClose());
            isEntered = true;
            rc.StartRoom();
        }
        else
            StartCoroutine(doorOpen());

        Debug.Log("after IsEntered" + isEntered + "in ActionExitDoor");
    }
}

각 콜라이더를 밟으면 여기있는 함수가 실행된다. 

코루틴은 알고리즘과 무관하게 그래픽효과이다. 

어쨋든 isEntered라는 bool변수를 통해 방에 들어왔는지 체크할 수 있고, RoomController에 있는 StartRoom 함수를 호출한다.

 

// 첫 입장 시 시작됨
public void StartRoom()
{
    if (curMonster == 0) return;
    GameManager.Instance.pc.transform.SetParent(transform, true);
    // 몬스터 활동 시작
    Invoke("TriggerMonster", 0.2f);

    foreach (DoorController dc in doors)
    {
        dc.EnterCollider.enabled = false;
        dc.ExitCollider.enabled = false;
        dc.EnterPlayer();
    }
}

만약에 몬스터 수가 0이라면 클리어 된 방이므로 전투를 시작할 필요가 없으며 만약 시작된다면

보다시피 for문으로 모든 문에 대해서 콜라이더 비활성화와 EnterPlayer 호출로 방에 player가 들어왔다고 알려준다. 

 

콜라이더를 이렇게 2개를 두고 열었다 닫았다 하는것이 더 효과적인 방법인지는 잘 모르겠다.

꽤나 복잡했기 때문이다. 

막상 이렇게 정리하니 간단한 것 같으면서도 구현전, 어떻게 할지 설계적으로 고민할때는 꽤 고생했다. 

 

결과를 간단하게 올려보겠다.

 

 

 

이제 몬스터 애니메이션과 공격, 그리고 복도 콜라이더, 미니맵 정도가 남았다. 

하나씩 올려보겠다.

'2d 자동 맵생성' 카테고리의 다른 글

맵 자동 생성(10)  (1) 2025.05.14
맵 자동 생성(9)  (0) 2025.05.13
맵 자동 생성(7)  (0) 2025.05.13
맵 자동 생성(6)  (0) 2025.05.12
맵 자동 생성(5)  (2) 2025.05.11