Unityで木が風になびく機能を追加する

今回はUnityで木が風になびく機能を追加します。

Terrainで追加した草はTerrainのWind Setting for Grassで設定する事が出来ますが、
木には風の設定が出来ません。

草は揺れているのに木の枝や葉が揺れないのは少し違和感が生じてしまいます。
そこで今回は木にも風の設定をしたいと思います。

これは新しくスクリプトを組んだりする必要がなく、元々機能として用意されているのでそれを使います。

スポンサーリンク

風を吹かせる機能を追加する

風の元となるゲームオブジェクトにAdd Component→Miscellaneous→Wind Zoneを選択します。

風1

デフォルトの設定では上のようになっています。
ModeをDirectionalとすると、ゲームの世界全体に風を吹かせます。
全体に風を吹かせたい場合は全体を管理するゲームオブジェクトに設定するとわかりやすいと思います。

Mainはゆっくりと変化する風力
Turbulenceは急激に変化する風力
Pulse Magnitudeは時間の経過で変化する度合い
Pulse Frequencyは時間の経過で変化する頻度

みたいです。

ここら辺は調整しながらいい設定を見つける必要がありそうですね。

風2

ModeをSphericalにすると設定したゲームオブジェクトからの設定した半径の円内に風を吹かせる事が出来ます。

それではUnityの実行ボタンを押して確認してみましょう。

風3

風で木の枝や葉がなびくようになりました。
ずいぶんリアルになりましたね。

コメント

  1. 坂本龍 より:

    Tree Creator製の木だと、Random Tree RotationとWind Zoneを併用できず、困っています。
    LOD Groupコンポーネントを使用しない場合、TerrainでTreeをペイントするときにRandom Tree Rotationのオプションが消えて、Color Variationのオプションに変わってしまいます。
    LOD Groupコンポーネントを使用する場合、Edit Tree画面からBend Factorの数値入力欄が消えて、Wind Zoneに反応せず風に揺れなくなってしまいます。
    SpeedTree製の木ならば、Bend Factorが無くても風で揺れるのですが……
    Tree Creator製の木をTerrainにペイントするとき、Random Tree Rotationでランダムに回転させつつ、Wind Zoneによって風で揺れるようにするには、どうすれば良いでしょうか?

    • 色々調べてみたんですが、わかりません。
      Unityの海外フォーラムでも同じような問題が投稿されていました。

      バグなんでしょうか。

      木を手っ取り早くランダムに回転させて配置したいけどRandamTreeRotationが通常は表示されないのもおかしいですし、LODを付けた場合ColorVariationが表示されないのも辛いですねぇ。

      面倒ではありますが現状は手動で木のプレハブをシーンに配置し回転させるしかないかもしれません。

      手動で配置した木であればWindZoneの影響も受けますし。

      しかしかなり木の設置が大変ではありますが・・・・(^_^;)

      –(2017/05/21 21:07追記)–

      根本的な解決ではないですが、LODを使用しないのであればRandomTreeRotationを諦め、AssetStoreに無料でTree Randomizerというプラグインがあるのでそれを利用すると作成した木から指定した数のバリエーションがある木を作成する事が出来るので、それで作成した形状の違う木をいくつかTerrainのTreesに追加し、木にバリエーションを持たせてマウスで配置するか、Mass Places Treesボタンを使えば登録した木の中からランダムに指定数配置してくれるので大ざっぱに木を植える事も出来ます。

  2. 坂本龍 より:

    ありがとうございます。実は、UnityのRandom Tree Rotation機能にはもう一つバグらしきものがあります。
    キャラクターが木をすり抜けないように、木の子要素としてCapsule Collider付きのオブジェクトをいくつか付ける方法があります。しかし、Random Tree Rotationをオンにしてその木を配置した場合、木の外観が回転しているのに、子要素のコライダーは回転していません。自分でコライダーを設定した木オブジェクトだけでなく、公式のSpeedTree製の木オブジェクトでも同様の現象がおきてしまい、キャラクターが木にめりこんだり、木の周辺の何も無い空間にジャンプで乗ることができてしまったりします。
    いずれにしても、TerrainのTree関連の機能はきわめて不便ですね。通常のオブジェクトとして一本ずつ配置したほうがまだ良いかもしれません。

    • コライダが一緒に回転しないのは痛いですね・・・。
      シーン上で木を回転しプレハブにしてTerrainでTreesにその回転したプレハブを使っても回転していない木と同じ角度で配置されてしまうので、
      おそらく木のモデルだけを元に回転しているからコライダが回転していないのかもしれません。

      Random Tree Rotationについては結構前のバージョンから言われてるみたいですが、5バージョンでは直ってないみたいですね。
      わたくしは5.3.4f1からバージョンアップ出来ないので現在の最新バージョンではどうだかわかりませんが。

      せっかくの優れた機能なのでUnity6への大幅アップデートの時に直っているとありがたいですね。(-_-)

      • 木を一つ一つ配置するのは大変なので数を指定してランダムに設置出来るツールを作ってみました。

        http://gametukurikata.com/customize/editor/setgameobject

        木のプレハブを設置出来るのでコライダの回転やランダムに回転も出来ます。

        コライダの内部データとしての木を設置する事は出来ませんでした。

        木以外のゲームオブジェクトも数を指定してランダムに設置出来るので精度を上げれば使い勝手がいいかもしれません。

        よければ使ってみてください。