내일배움캠프/TIL

개인프로젝트 - 맵 생성중 발생한 오류

서보훈 2024. 11. 12. 20:35

맵을 생성한 뒤 특정 위치에 캐릭터 프리팹을 생성, NavMeshAgent 를 통해 이동을 시도할때 Agent 에서 오류가 발생

 

캐릭터를 생성한 뒤, navMeshOwner를 확인 할 경우 정의되지 않은 내용 참조 오류가 발생함

 

문제 원인 : 캐릭터 프리팹을 생성한 뒤, 생성한 프리팹의 스크립트에 이동 로직을 호출하지 않고 등록한 프리팹 객체의 스크립트를 호출하여 발생한 문제.

 

이를 해결하기 위해 프리팹 오브젝트를 생성한 뒤, 여기서 캐릭터 스크립트를 얻어서 별도로 등록

등록한 스크립트를 호출하는 방식으로 문제 해결

GameObject character = Instantiate(PlayerManager.Instance.ReturnEntryCharacterPrefab(i), StageManager.Instance.room.spawnPoints[i].position, Quaternion.identity);
PlayerManager.Instance.characters.Add(character.GetComponent<Character>());

 

NevMeshSurface : 동적 생성

임시로 하나의 패턴만 사용하여 맵을 생성중이지만, 맵 종류를 추가하면 무작위로 맵을 생성하는 기능 추가.

이때, bake 된 NavMesh를 사용할경우 맵이 서로 이어지지 않아 캐릭터가 이동할 수 없는 상황이 발생함

→ 맵 생성 후 NavMeshSurface 클래스의 BuildNavMesh() 메서드를 호출하면 스크립트를 통해 NavMesh를 생성할 수 있음

public void CreateStages(int currntMapIndex)
{
    room = Instantiate(waitingRoomPrefab, Vector3.zero, Quaternion.identity).GetComponent<WaitingRoom>();
    Vector3 createPosition = room.stageCreatePoint.position;

    for(int i = 0; i < maps[currntMapIndex].stageCount; i++)
    {
        int index = Random.Range(0, maps[currntMapIndex].stagePrefabs.Count);
        Stage stage = Instantiate(maps[currntMapIndex].stagePrefabs[index], createPosition, Quaternion.identity).GetComponent<Stage>();
        createPosition = stage.stageCreatePoint.position;

        stages.Add(stage);
    }
    
    GetComponent<NavMeshSurface>().BuildNavMesh();
    
    //네비매시 생성후 캐릭터 생성
    room.CreateCharacters();
    CurrentStage = 0;
    stages[CurrentStage].CreateEnemy();

    gameStart = true;
    StartStage();
}

 

이를 통해 모든 맵을 생성한 뒤, NavMesh를 재생성함으로써 캐릭터가 모든 맵에서 움직일 수 있음