Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【アセット紹介】Crest Ocean System URP で海を作る【Unity】

今回はアセットの紹介をしていきます。
紹介するのはCrest Ocean System URP
高度な海洋シミュレーションアセットです。

f:id:Raspberly:20210720005913p:plain

f:id:Raspberly:20210720020351p:plain




 

お得なセール情報

現在アセットストアでは、サマーセールが開催中!
7週間にわたってテーマ別にセール対象アセットが変わります!

 

今週のテーマはファンタジーゲーム開発向けアセットです。
詳しくは↓のバナーからどうぞ!

f:id:Raspberly:20210719223803j:plain

今回紹介する「Crest Ocean System URP」もセール対象です!

 

セールのスケジュール

  • 1週目:低ポリゲーム-2021年6月22日-6月28日
  • 2週目:2Dゲーム-2021年6月29日-7月5日
  • 3週目:3Dゲーム-2021年7月6日-7月12日
  • 4週目:ファンタジーゲーム-2021年7月13日-7月19日
  • 5週目:SFゲーム-2021年7月20日-7月26日
  • 6週目:ドリームプロジェクト-2021年7月27日-8月9日

4週目の終了時間は日本時間で7月20日15:59までです。

blog.unity.com

 

 

 

どんなアセット?

とても高度な海洋シミュレーションアセットです。
波の表現、物理演算、水中エフェクトなど本格的な海を表現できます。

f:id:Raspberly:20210720003445g:plain

クレストは、PCおよびコンソールプラットフォームを対象とした、技術的に高度な機能豊富な海洋システムです。

 

ドキュメントはこちら

crest.readthedocs.io

 

注意点

Render Pipeline

URP専用アセットです。HDRP用は別売りになっています。
Built-inで使いたい場合はGithubで公開されているものを自由に使えます

github.com

対応プラットフォーム

PCとコンソールを対象にしたアセットです。
高機能なモバイル端末なら動くかもしれないようですが。

Compute Shader

ComputeShadersに依存したアセットです。
コンピューティング互換性のあるプラットフォームのみサポートしています(WebGLでは動かない)

対象プロジェクト

高度な水のシミュレーションを必要とするプロジェクトを対象にしています。
技術的設定・構成が必要なので、「手っ取り早く海を作りたい」といった場合には向いてません。

複数カメラの同時レンダリング

(現在)複数カメラの同時レンダリングをサポートしていません

 

 

 

 

 

開発環境

Unity 2020.3.14f1

Universal RP 1.5.1

Crest Ocean System URP ver4.12

 

 

 

 

インポートの確認

インポート前の準備

RenderPipelineAssetの設定

まずはRenderPipelineAssetを設定します。
これはレンダーパイプライン全体のグラフィックスを構成するアセットで、SRPでは必須です。

f:id:Raspberly:20210719145335p:plain

URPプロジェクトを作成した段階で自動的にセットされていますが、
Depth TextureとOpaqueTextureを有効にする必要があります。

f:id:Raspberly:20210719145430p:plain

Color Spaceの設定

ProjectSettingsからColorSpaceをLinearに設定します。

f:id:Raspberly:20210719150532p:plain

ここまでできたらアセットをインポートします。

 

デモシーンの確認

アセットインポート完了時はこんな感じです。
Crest-Examplesにデモシーンが含まれています。

f:id:Raspberly:20210719160737p:plain

BoatDev

ボートがあるシーンです。
プレイヤーが操作できるボートと、AIで走り回っているものがあります。

f:id:Raspberly:20210719232124g:plain

Main

シンプルなTerrainと海のシーン

f:id:Raspberly:20210719232219g:plain

PirateCove

海賊の入り江。島と船があります。

f:id:Raspberly:20210719232948g:plain

Whirlpool

ボートが渦潮に引き寄せられるシーン。

f:id:Raspberly:20210719233108g:plain

 

 

 

 

実際に試してみる

実際に海を作ってみます。
コンポーネントのパラメータについてはドキュメントをどうぞ。

海の作成

Materialの作成

OceanWater」という名前で新しいMaterialを作成します。(デフォルトのOceanマテリアルを使ってもいいですが)
ShaderはAssets/Crest/Crest/Shaders/Oceanを使用します。

f:id:Raspberly:20210717155839p:plain

Normal MapにはAssets/Crest/Crest/Textures/WaveNormals/WaveNormalsを割り当てます。

f:id:Raspberly:20210717160117p:plain

FoamのFoamにはAssets/Crest/Crest/Textures/Foam2を割り当てます。

f:id:Raspberly:20210717161639p:plain

CausticsにはAssets/Crest/Crest/Textures/Caustics/Caustics_tex_colorを割り当てます。

f:id:Raspberly:20210717161711p:plain

Oceanの作成

空のゲームオブジェクトを作成し名前を「Ocean」に変えます。
OceanにCrestOceanRendererコンポーネントをアタッチします。
Ocean ParamsにMaterialにOceanマテリアルが自動的に割り当てられていますが、
これを先ほど作ったOceanWaterマテリアルに差し替えます。

f:id:Raspberly:20210717160409p:plain

ゲームをプレイしてみると海ができているのが確認できます。

f:id:Raspberly:20210717160515p:plain

 

波を作る

海面はできたので波を発生させます。
空のゲームオブジェクトを作り名前を「OceanInput」に変えます。
OceanInputの子にさらに空のゲームオブジェクトを作り名前を「Waves」に変えます。

f:id:Raspberly:20210717163028p:plain

WavesにCrestShapeGerstnerBatchedコンポーネントをアタッチします。

f:id:Raspberly:20210717163047p:plain

ゲームを実行してみると海面が波打っているのが確認できます。

f:id:Raspberly:20210717175033g:plain

 

泡を発生させる

海面に泡を発生させます。
Projectビューの適当な所にCreateからFoamSimSettingsを作成します。

f:id:Raspberly:20210717163621p:plain

作成したらOceanRendererSimSettingsFoamに割り当てます。

f:id:Raspberly:20210717165558p:plain

 

これで海面に泡が発生します。

f:id:Raspberly:20210720001629g:plain

SimSettingsFoamのパラメータから泡の強さと範囲を変えるとよりわかりやすくなります。

f:id:Raspberly:20210717170228p:plain

 

動的な波の発生

オブジェクトの移動や回転に合わせて波が発生するようにしてみます。

マテリアルの作成

Assets/Crest/Crest/Shaders/OceanInputs/DynWavesObjectInteractionを使ったマテリアルを作成します。

f:id:Raspberly:20210719235911p:plain

 

オブジェクトの作成

波を発生させるコライダー専用オブジェクトを作成します。
今回はCapsuleを使います。名前を「WaterObjectInteraction」に変えておきます。

 

これにCrestObjectWaterInteractionコンポーネントCrestRegisterDynamicWavesInputコンポーネントをアタッチ。

f:id:Raspberly:20210720001554p:plain

このWaterObjectInteractionを動くオブジェクトの子オブジェクトにしておきます。

CrestOceanRendererの設定

CrestOceanRendererのCreateDynamicWaveSimにチェックを入れる

f:id:Raspberly:20210720002221p:plain


これでオブジェクトの動きに合わせて波が発生します。

f:id:Raspberly:20210720002629g:plain

 

 

 

オブジェクトを海に浮かべる

Cubeを浮かべてみます。

Cubeを作成し、RigidbodyCrestSimpleFloatingObjectをアタッチします。

f:id:Raspberly:20210717173803p:plain

これで完成です。簡単!
パラメータで浮力を調整できます。

f:id:Raspberly:20210720003445g:plain

 

 

 

 

まとめ

・Crest Ocean System URPを本格的な海を作ることができる

今回実際に作った部分はほんの一部です。
流れを制御したり、海の一部分だけ変化をつけたり、水中エフェクトをつけたりととても多機能なので、
ドキュメントやビデオチュートリアルを元にいろいろ遊んでみてください。

 

以上です。

 

 

参考資料

crest.readthedocs.io

www.youtube.com

www.youtube.com

www.youtube.com

 

HDRP版はこちら!

amaotolog.com

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

 

 

 

※本記事にはAssetStoreアフィリエイトリンクが含まれています。

他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。