• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Instantiate 관한 질문입니다!

21.08.10 08:18 작성 조회수 181

0

안녕하세요 Rookies님
오픈월드 3D 유니티 게임을 제작중에 있습니다. 여러가지 몬스터, 보스, 던전, 퍼즐 및 협동 요소들이 있는 RPG게임입니다.
워낙 게임 Mpa을 크게 만들어서(거의 배틀 그라운드 정도의 수준입니다.. 7km x 7km) 일반 몬스터가 6종 정도가 있는데 서버에서
처음 Init할 때 EnterGame(몬스터)를 통해서 처음부터 미리 깔아놓을 생각이였습니다.
그런데 테스트를 위해 1000마리만 입장 시켜도 프레임이 너무 떨어지더라고요..
프레임이 떨어지는 원인은 서버로 받은 EnterGame을 통해 클라이언트가 ObjectManager에서 Instantiate를 1000번 해서 그런것인가요?
이거에 대한 해결책이 어떠한 방법이 있는지 조언 좀 해주실 수 있을까요??!!..
현재 멍청한 AI 몬스터는 서버에서 3초마다 가야할 방향을 몬스터의 현재 좌표 기준으로 사각형을 그린 다음 그 사각형의 위치에서
랜덤한 값을 줍니다. 그러면 클라이언트는 MoveToWard나 Nav를 사용하여 그 위치로 가게 만듭니다.
똑똑한 AI 몬스터는 자기 일정 범위안에 원을 그리고 FindWithtag를 통해 Player를 찾아 그 Player를 향해 Nav를 적용시키게 됩니다.
서버에서 처리하지 않고 클라에서 처리했지만 몬스터의 target이 모두 같기 때문에 해당 몬스터가 같은 사람을 따라오게 됩니다.
굉장히 꼼수를 써서 만들었습니다.. 입장은 서버에서 시키되 움직임은 클라에서 시키고 그 움직임은 코드상 동일할 수 밖에 없게 만들었습니다.
처음에 1000마리를 입장은 시키되 입장 시키자마자 모든 GameObject.setActive(false)로 하고
플레이어가 근처에 오면 해당 몬스터의 setActive(true)로 하는 방법을 생각해봤는데
이것도 결국 Player 입장에서 입장한 몬스터의 모든 CellPos와의 위치를 재야하다보니 방법이 아닌거 같기도 합니다..
MMO 오픈월드 게임에서 몬스터의 배치는 몬스터가 생성될 수 있는 최대 개수를 지정하고 그만큼 까지만 Spawn하고 죽으면 Despawn하고
Despawn된 몬스터를 다시 재사용해서 Spawn 시키고 이 방법이 최선인 것인가요??!!
몬스터를 배치하는 방식에 대한 방법이나 각각의 장단점들에 대해 알려주시면 정말 감사하겠습니다!

답변 1

답변을 작성해보세요.

0

우선 유니티는 오픈월드 게임에 적합하지 않습니다.
그렇게 거대한 맵을 실시간으로 띄우는 것도 문제이고
1000마리나 되는 몬스터를 스폰하는 것도 문제입니다.
MMO에서는 딱 유저의 시야 사이에 들어오는 애들만 스폰해주고
시야에서 벗어나면 디스폰해주는게 일반적입니다.
이 부분은 Part9에서 간략하게 실습하니 생략하도록 하겠습니다.