Unityで巨大な地形を作成するにはどうすればよいですか?


19

Unityで非常に大きな地形を作成するにはどうすればよいですか?幅と長さを大きな値に設定できるようです。ただし、ハイトマップの解像度は4097までしか上がりません。詳細の解像度は4048までしか上がりません。

何か案は?


私はbuzzkillあることのためすみません:sol.gfxile.net/mmorpg.html
ネイラー

回答:


21

地形を正方形の「チャンク」に分割し、気になるもの(主に現在アクティブなカメラの近くのもの)をUpdate()でロードします-スペースに縛られている場合(おそらくそうなります)、不要なものを遠くにアンロードします。

遠景の距離を気にしない限り、遠く離れた地形のLoDには、事前に計算された低ポリゴンモデルを使用します。また、NPCの動きやその他のシミュレーションなど、遠くの地形の地形の高さマップが必要な場合は、メモリに保持するために地形の低解像度または可変解像度のバリアントを作成します。完全な地形データを使用しないでください。これはゲームのロード時に自動的に実行できますが、一般的には、ビルドまたはパッケージ中にこの事前生成データを作成するツールを作成することをお勧めします。

最後に:浮動小数点の精度の問題を回避するには、メインカメラが(0.0f、0.0f、0.0f)から遠く離れるたびにシーン全体を再配置する必要があります。

Unity Answersに関連する可能性のある質問http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html


ありがとうございました!素晴らしい答え。ひとつだけ質問があります。地形の隣を設定すると、地形の端が同じ高さにない場合はどうなりますか?
ダニエルペンダーガスト

1
@ダン:風景に穴を開けます。これには、「ランドスケープのエッジの高さが同じであることを確認する」、「穴をマスクするためにエッジから下に垂直に走るスカートを追加する」、「生成された三角形のストリップを追加する」穴を縫い合わせます。」どちらを使用するかはあなた次第です(エンジンも一部)。2番目のスカートは、私が最も頻繁に見たものです。
マーティンソイカ

1
または私が言ったように、あなたは地形を縫い合わせるためにスクリプトを使用したいと思います:
ヴァルモンド

誰かスクリプトを持っていますか?
ダニエルペンダーガスト

@Dan:回答のUnity Answersリンクにいくつかのスクリプトがあります。それに加えて、現時点ではUnityのコードを手伝うことはできません。私の(趣味レベルの)ゲームプログラミングはすべて、レンダリングエンジンとしてOgre3Dを使用して行われます。
マーティンソイカ

3

地形をチャンクに分割する必要があります。いくつかの小さな地形。(スクリプトを使用して)それらを再び「シーム」する必要があるので、それらの間に「穴」はありませんが、そうでなければすぐにそれらを行うことができます。

Unity3D〜3.0以降では、アイテム(地形やアイテムを読む)を遠くに移動できない(+/- 100000ステップIIRCなど)ことで、これが世界の最大サイズに影響することも知っておくとよいでしょう。

とにかくこれをオンラインRPGゲームで使用しています(ただし、実際のゲームではなく、レベルデザインにのみUnity3Dを使用しています)。

好奇心が強いからといって、あなたのゲームに関する情報(進歩、タイプ、グラフィックス、スタイルなど)を共有しませんか?


2

Unity5では、地球全体のSRTMデータTerrainDataをさまざまな詳細レベルのオブジェクトの高さマップに処理することで、巨大な地形を実装しました[1]。考慮すべきことがいくつかあります。

  1. 高さマップのエッジは、少なくとも1つのサンプルでオーバーラップする必要があり、それに応じて地形を配置する必要があります。Terrain.SetNeighborsメッシュを接続せず、Unityによって行われるさまざまな詳細レベルのみを考慮します。

  2. 必然的に、TerrainDataオブジェクトごとに2 ^ n + 1の高さのサンプルが必要です。そうしないと、Unityは未設定の部分に0の高さを割り当てます。

  3. のサイズが2GB未満の場合TerrainData、リソースフォルダー内のアセットとしてResource.Load、また実行時にそれらを保持することで問題を回避できます。2GBを超える場合、Unityビルドでは2GBを超えるリソースを使用できないため、このアプローチは機能しません。この場合、AssetBundlesを構築し、WWWオブジェクトで非同期に読み込む必要があります。これには、Shader.Parse約500ミリ秒のオーバーヘッドでそれぞれを呼び出すという好ましくない副作用があります。私はこれをフォーラム[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-taining-no-shader .358235 /


0

サードパーティのソリューションがあります。

このコードは、幅99,999メートルの地形を作成でき、山は任意のノイズ式ですが、必要に応じて100個のノイズ式を1つのマップに混在させることができます。たとえば、この地形では、マップで使用可能な三角形の総数は、6600万、低解像度、2億の中解像度です。これは、カメラの周りに0.7mnの三角形が更新された66百万の三角形マップです。 ユニティプレイヤージャイアントテレイン、WASD、およびスペース


そのためのソースコードはありますか?私が見るのは、統一プラグインゲームです。
AttackingHobo 14

私はソースコードを持っていますが、書くのに時間がかかりました。私はアリd0tスチュワートでヤフーd0t com
com.prehensible 14

0

地形をまとめて読み込むことをお勧めします。より小さな地形を使用することで、おそらくスクリプトは、transform.position-terrain.transform.positionを使用して、地形に特定の近接があるかどうかを確認できます。実際にゲーム全体を最適化する方法についてのブログ投稿を書いて、チャンクの読み込みについて話しました。お役に立てれば。


このアドバイスは、6年前のMartin Sojkaからの受け入れられた回答に既に存在していることに注意してください。関連するリンクだけを共有したい場合は、その回答に対するコメントがより適切な場合があります。
DMGregory

将来的には。ありがとうございました。私はまだスタック交換に投稿するのは初めてです:)
ハドソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.