よくゲームでキャラクターが歩いたときに草が動的にキャラクターをよけるようになっていることがあると思います。わかりやすいように極端にしていますが、以下の画像のような感じです。
UE4でこの仕組みを実装する方法を解説していきます。
UE4で草がキャラクターをよける仕組みを実装する方法
マテリアルでプレイヤーの座標を取得
まずマテリアルでプレイヤーの座標を取得したいので、マテリアルパラメーターコレクションを使います。コンテンツブラウザで右クリック→「マテリアルテクスチャ」→「マテリアルパラメータコレクション」から作成しましょう。名前はPlayerPosにします。
マテリアルパラメーターをダブルクリックで開いて、Vector ParametersのプラスボタンでVectorを追加します。名前をpositionに変更しておきましょう。
レベルブループリントを開いて、「GetPalyerCharacter」→「GetWorldLocation」→「Set Vector Parameter Value」とノードを作成してつなぎます。
「Set Vector Parameter Value」のCollectionを先程作成したPlayerPosにして、Prameter Nameをpositionに変更します。そして「イベント Tick」につなげましょう。以下のようなノード構成になっていればOKです。
ここではプレイヤーキャラクターの位置情報をマテリアルパラメーターコレクションのpositionに渡しています。これでマテリアル内でプレイヤーの位置情報を扱うことができます!
マテリアルを組む
草のマテリアルを開いて、マテリアルパラメーターコレクションをドラッグオンドロップしましょう。Prameter NameをPositionに変更します。
まずキャラクターの周囲にだけ影響を及ぼしたいので、マスクを生成します。以下のようにノードを組んでください。
まずブループリントから受け取るpositionは4vectorなので、ComponentMaskで3Vectorにしてあげます。
Distanceノードで「キャラクターの位置」と「ワールドの位置」の距離をみて、欲しい値になるように任意の値でDivideしてあげてます。clampで0~1にしてあげて、マスクにしたいので最後に「1-x」で反転しています。
こうすることで以下のようにキャラクターの周囲にマスクを作成することができます。Distanceの値を変えることでマスクの影響範囲を変更することができます。
次にすることはワールド位置からキャラクターの位置を引き算して、キャラクターから外側に向けてのベクトルを作成してあげます。方向だけほしいので「Normalize」します。強さを自由に変更できるようにパラメーターを作成してMultipllyします。
上記の2つのノードを最終的にMultipllyで合体します。これでキャラクターの一定の周囲だけ、外向きのベクトルを持っている状態にできます。これをマテリアルの「ワールド位置オフセット」に接続しましょう。
これで完成です!Distanceを変更すると半径を変更。Intensityを変更すると強さを変更できます。結構簡単ですね。
草の上の方だけ揺れるようにする
上の方だけ揺れるようにしたいので、草の下から上のマスクをMultipllyします。最終的に以下のようなノードになりました。
さらにこれをもともと作っていた草の揺れと合体させましょう。これは単純にMultipllyすれば大丈夫です。草のゆれについて知りたい方は以下の記事を参照してください。
-
UE4のSimpleGrassWindを使って簡単に草をゆらす方法
こんにちは、CGフリーランスとして活動している西川です!Youtubeと ツイッター、インスタもやってます。お問い合わせはこちら。 ゲームの背景によく使われる草。けどただ配置しただけだと味気ないですよ ...
続きを見る
まとめ
この仕組みをステップで分けると
まとめ
- キャラクターとワールドの距離からマスク生成
- キャラクターとワールドの位置を引き算してベクトル生成
- 上の2つを組合わせる
でした。理屈がわかると結構かんたんですね。
以上になります。もしご質問等ありましたら、お気軽にツイッターから聞いてください。新しいことに挑戦していきましょう!それでは。