Unity에서 어떻게 거대한 지형을 만들 수 있습니까?


19

Unity에서 매우 큰 지형을 만들려면 어떻게 해야합니까? 너비와 길이를 큰 값으로 설정할 수있는 것 같습니다. 그러나 하이트 맵 해상도는 4097까지 올라가고 디테일 해상도는 4048까지 올라갑니다.

어떤 아이디어?


버즈 킬이되어 죄송합니다 : sol.gfxile.net/mmorpg.html
Nailer

답변:


21

지형을 정사각형 "청크"로 분할하고 Update ()에서 관심있는 항목 (주로 현재 활성화 된 카메라 근처에있는 것)을로드합니다. .

시야 거리가 낮은 경우를 제외하고는 원거리 지형 LoD에 대해 사전 계산 된 저 폴리 모델을 사용하십시오. 또한 NPC 이동이나 다른 시뮬레이션과 같이 멀리 떨어진 지형의 지형 높이 맵이 필요한 경우 메모리에 보관할 지형의 저해상도 또는 가변 해상도 변형을 만듭니다. 전체 지형 데이터를 사용하지 마십시오. 게임로드시 자동으로 수행 할 수 있지만 일반적으로 빌드 또는 패키지 중에 사전 생성 된 데이터를 생성하는 도구를 만드는 것이 좋습니다.

마지막으로, 부동 소수점 정밀도 문제를 방지하려면 기본 카메라가 (0.0f, 0.0f, 0.0f)에서 멀어 질 때마다 전체 장면의 위치를 ​​변경해야합니다.

Unity 답변 http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html 에 대한 관련 질문


감사합니다! 좋은 대답입니다. 하나의 질문, 지형의 이웃을 설정할 때 지형의 가장자리 높이가 동일하지 않으면 어떻게됩니까?
Daniel Pendergast

1
@ 단 : 당신은 풍경에 구멍을 얻을 수 있습니다. 이 문제를 해결하는 방법에는 대략 "가로가 가로 가장자리의 높이가 동일해야합니다", "가장자리를 세로로 뻗어 치마를 추가하여 구멍을 가리기"및 "생성 된 삼각형 스트립 추가"가 있습니다. 구멍을 꿰매는 것입니다. " 당신이 사용하는 것은 당신에게 달려 있습니다 (그리고 엔진의 일부). 치마와 함께 두 번째는 내가 가장 자주 본 것입니다.
Martin Sojka

1
또는 내가 말했듯이, 지형을
심는

아무도 스크립트가 있습니까?
Daniel Pendergast

@ Dan : 답변의 Unity Answers 링크에 스크립트가 있습니다. 그 외에도 현재 Unity 용 코드로 도와 드릴 수는 없습니다. 제 모든 취미 수준의 게임 프로그래밍은 렌더링 엔진으로 Ogre3D를 사용하여 수행됩니다.
Martin Sojka

3

지형을 청크로 분할해야합니다. 여러 개의 작은 지형. 그들 사이에 '구멍'이 없도록 그 (것)들을 서로 다시 '재봉'할 필요가 있습니다. 그렇지 않으면 당신은 그것들을 바로 시작할 수 있습니다.

Unity3D ~ 3.0 이후로 (// 100000 단계 IIRC와 같이) 항목을 너무 멀리 이동할 수 없으므로 지형의 최대 크기에 영향을 줄 수 있습니다.

어쨌든 내 온라인 RPG 게임에서 이것을 사용하고 있습니다 (실제 게임이 아닌 레벨 디자인에만 Unity3D를 사용하는 것을 제외하고).

궁금한 점이 있기 때문에 게임에 관한 정보 (예 : 발전, 유형, 그래픽, 스타일 등)를 공유 하시겠습니까?


2

우리는 Unity5에서 지구 전체에 대한 SRTM 데이터를 TerrainData다른 수준의 세부 사항을 가진 객체의 높이 맵으로 처리하여 거대한 지형을 구현했습니다 [1]. 고려해야 할 몇 가지 사항이 있습니다.

  1. 높이 맵의 가장 자리는 하나 이상의 샘플과 겹치므로 지형을 적절하게 배치해야합니다. Terrain.SetNeighbors메시를 연결하지 않고 Unity가 수행하는 다양한 세부 수준 만 설명합니다.

  2. 반드시 TerrainData오브젝트 당 2 ^ n + 1 높이 샘플이 필요 합니다. 그렇지 않으면 Unity는 설정되지 않은 부분에 높이 0을 지정합니다.

  3. 의 용량이 2GB 미만인 경우 TerrainData자산을 리소스 폴더에 자산으로두고 Resource.Load런타임에 자산으로 가져갈 수 있습니다 . 2GB가 넘는 경우 Unity 빌드에 2GB 이상의 리소스가있을 수 없으므로이 방법은 더 이상 작동하지 않습니다. 이 경우 AssetBundles를 빌드하고 WWW오브젝트 와 함께 비동기 적으로로드해야 합니다. 이것은 Shader.Parse약 500ms의 오버 헤드로 각각 을 호출하는 부작용이 있습니다 . 나는 이것을 포럼에서보고했으며 [2] 여전히 답장을 기다리고있다. 결국 버그 보고서를 제출하겠습니다.

  4. 를 사용하는 것에 대해 생각하지 마십시오 AssetDatabase.LoadAssetAtPath. 에디터에서만 사용할 수 있으며 Unity 빌드에서는 사용할 수 없습니다.

[1] https://www.youtube.com/watch?v=2UsyVuWoFbQ
[2] http://forum.unity3d.com/threads/shader-parse-delays-loading-of-assetbundle-include-no-shader .358235 /


0

타사 솔루션이 있습니다.

이 코드는 너비가 99,999 미터 인 지형을 만들 수 있으며 산은 노이즈 공식이지만 원하는 경우 100 개의 노이즈 공식을 하나의 맵에 혼합 할 수 있습니다. 예를 들어이 지형에서지도에서 사용할 수있는 총 삼각형 수는 66million, 저해상도 및 200million medium 해상도입니다. 여기에는 6,600 만 개의 삼각형 맵이 있으며 카메라 주위에 0.7 백만 개의 삼각형이 업데이트됩니다. unityplayer 거대한 지형, WASD 및 우주


그것에 대한 소스 코드가 있습니까? 내가 보는 것은 단일 플러그인 게임입니다.
AttackingHobo

소스 코드가 있는데 작성하는 데 시간이 걸렸습니다. 나는 yahoo d0t com에 개미 d0t 스튜어트에있다
com.prehensible

0

지형을 청크로로드하는 것이 좋습니다. 더 작은 지형을 사용하면 아마도 스크립트가 transform.position-Terrain.transform.position을 사용하여 지형과 일정 거리에 있는지 확인할 수 있습니다. 실제로 게임 전체를 최적화하는 방법에 대한 블로그 게시물 을 작성했으며 청크로드에 대해 이야기했습니다. 도움이 되었기를 바랍니다.


이 조언은 6 년 전부터 Martin Sojka의 답변에 이미 있습니다. 관련 링크를 공유하려면 해당 답변에 대한 의견이 더 적절할 수 있습니다.
DMGregory

앞으로는하겠습니다. 감사합니다. 나는 여전히 스택 교환에 게시하는 것에 익숙하다 :)
Hudson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.