【Unity】パーリンノイズの概要とブログで作ったサンプル集のまとめ
ここ最近パーリンノイズに興味を持って色々と調べていました。パーリンノイズそのものについての話から、パーリンノイズを使って地形を配置してみたりするサンプル、そこからメッシュの結合などにも触れることができたので、この一連の流れをまとめておこうと思います。
必要な部分だけ見てもらうのでもいいですし、全体を眺めてもらってどんな感じで変更、修正していったのかの考えをトレースしてもらうとかでもいいかもしれません。
なお、記事を書くために使ったOSやUnityのバージョンについては各記事に記載しています。
パーリンノイズとは
パーリンノイズは主にテクスチャを作成する際に使われるノイズで、完全にランダムではなく隣り合う値が近いものになっているノイズです。
例えばRandomクラスを使って値を取得すると、以下のように分散グラフのような見た目になります。
パーリンノイズを使って値を取得すると、以下のように波のような見た目になります。急激に変化するのではなく、徐々に変化していく値を取得することができるので、自然な揺れ(カメラの手振れ)などを表現するのに向いています。
パーリンノイズについて話が出る場合は以下のように2Dのテクスチャ画像をイメージすると分かりやすいかもしれません。パターンが計算されて、隣の座標では値がなだらかに変化している様子も掴みやすいかも。
パーリンノイズを使うとこんな感じで地形を生成することもできます。自動的にこんな感じの地形を作れると、ある程度作業も楽になるかなと思います。
パーリンノイズの概要とブログで作ったサンプル集
パーリンノイズに関してブログで書いた記事についてまとめます。
パーリンノイズの概要
パーリンノイズについては以下の記事で概要を紹介しています。
ノイズ生成の仕組み等には触れていませんが、Unityで使う場合にどんな感じでMathfクラスのPerlinNoiseメソッドを使えばいいのかのサンプルを紹介しています。
パーリンノイズといえば2Dのテクスチャとして確認するのが分かりやすいので、ゲームの実行中にパーリンノイズによるテクスチャを生成し、RawImageのコンポーネントで表示するサンプルもあるので、この辺りから触れてみるとイメージもしやすくなるかなと思います。
地形を作るサンプル
パーリンノイズを使って、インスタンス化した地形の高さをセットしていきます。
パーリンノイズの特徴として、完全にランダムな値を取得するのではなく、隣り合う座標ではなだらかに変化する値を取得するので、地形自体もなだらかに変化するように配置されます。現実の地形に近い形で自動的に配置できるとステージ作成の手間も少し減らせるかなと思います。
メッシュの結合
直接パーリンノイズとは関係がないのですが、上記のサンプルでたくさんのオブジェクトを地形として配置することによって、ドローコールの数が尋常じゃないくらいに増えました。なので、MeshクラスのCombineMeshesのメソッドを使ってメッシュを結合することに。
メッシュを結合する際は、実はインデックスバッファのビット数が問題になったりします。デフォルトの16bitだと、メッシュ数が多い場合に全てのメッシュを結合することができずに思った通りに結合できませんでした。
解決策としては処理を1行追加するだけなのですが、メッシュのインデックスバッファについても簡単に触れています。
上記の方法でメッシュを結合する場合、結合対象となるメッシュが元々持っているマテリアルではなく、インスペクターウィンドウからセットしたマテリアルをセットする形になっていました。なので、地形オブジェクトが持っているマテリアルを使って、マテリアルごとにメッシュを結合することで、見た目を変化しないようにしました。
ドローコールの話
メッシュを結合するきっかけとなったのはドローコールの多さでした。このドローコールってなんだっけ? というのを整理する意味でまとめたのが以下の記事です。ドローコールの話はCPU、グラフィックスAPI、ドライバ、GPUと登場人物が多いので最初は混乱するかもしれませんが、誰が何をするのかを覚えておくとイメージもしやすいかなと思います。
関係性を理解すると、どこで処理が重くなっているのかが分かりやすくなりますからね。
パーリンノイズを使ってもうちょっと応用する
パーリンノイズを1回計算するだけでもある程度なだらかな地形を生成することができますが、複数回パーリンノイズを計算して組み合わせることでよりメリハリのついた地形を生成することができます。
以下の記事では、パーリンノイズを複数回加算する方法と、複数回乗算する方法を試しています。個人的な好みとしては乗算で計算した地形が良かったです。事前にイメージしていたのがこちらでしたので。
シーン内にゲームオブジェクトを配置する方法でもパーリンノイズを使えますが、Unityでは地形といえばTerrainの機能があります。なので、Terrainのデータに対してパーリンノイズを使ってなだらかに変化する値を渡すことで、自動的になだらかな地形を生成することを目指したのが以下の記事です。
TerrainではHeightMap(ハイトマップ)という形で座標ごとの高さを管理していて、ハイトマップを自分で生成してセットするとその通りに画面で表示してくれます。Terrainは画面上で地形を設定するもの、と思っていたのでスクリプトからセットできるのは感動でした(笑)
Editor拡張から使う
地形オブジェクトの生成やメッシュの結合をエディタ上で行うサンプルも作成しました。基本的な流れは上記のページのものになっていて、それをエディタから使えるようにしたものです。事前に地形オブジェクトを作成しておくことでライトのベイクもできるようになるので、必要に応じて使い分けすると良いかもしれません。
まとめ
パーリンノイズはなだらかに変化するランダムなパターンを生成するのに最適です。2Dのテクスチャを生成する用途でも使えますし、ゲームオブジェクトを配置するためにも便利に使えます。
いわゆるマイクラ的な地形を作るのにも便利なので、自分用に使いやすいメソッドをいくつか用意しておくとなにかと実装しやすくなるかもしれません。
ゲーム開発の攻略チャートを作りました!
-
前の記事
サガフロンティアのリマスター版が出るそうで懐かしさを感じたので思い出を 2021.01.11
-
次の記事
サガフロの術とキャラ設定のマッチがとても良かったのでおさらいする 2021.01.13
コメントを書く