News Activity Product Learning red Event Contact
Devblog top img

開発ブログ

2017-09-19

松明の点火・時間消滅

UE4

writer : yuga

 僕がゲーム制作に関わった中で主な役割だった松明(たいまつ)に火を点けて時間が経つと火が大きくなったり小さくなったりするプログラムを記録していきます。松明は上記画像のようにゲーム制作のメンバーに作っていただきましたので、今回は適当に木のようなものを作ってそれに点火しようと思います。


さっそく作っていきましょう。

まずUE4を起動します(この文章ではver.4.15を使用しています)。そして新規プロジェクトを選択しブループリント内のFirst Personを選択し、プロジェクトを作成します。(Third Personでも構いません...!多分!)

画面が開けたら、画面左の基本欄にある「キューブ」を真ん中の画面へドラッグ&ドロップします(これが今回燃えてくれる木になります。)それでは木を適当に作っていきます。
画面右下の「Static Mesh」の今「Cube」と書いてあるところをクリックし「rock」と検索し、それをクリックしましょう。次に「Static Mesh」の下の「Material」を同様に「rust」と検索しクリックします。The 岩が出来上がりました。

大きさをいじればそれっぽくなるので大丈夫です。「Static Mesh」の上にある「トランスフォーム」の「拡大・縮小」の「X値,Z値」をそれぞれ0.1にするとそれっぽくなりました。
一つしかないと物寂しいのでその木を右クリック→編集→複製で大量に作成できます。個々に「トランスフォーム」の「回転」や「拡大・縮小」を変えてみても面白いかもしれません。
それでは次に燃えて消えるプログラムを組んでいきます。画面上端のブループリント→新規の空のブループリントクラス→Actorをクリックします。

画面左上の「コンポーネントを追加」→「球」このままだとゲーム開始時に「Sphere」が表示されてしまうので、画面右端を下に行き「Rendering」という場所の「Hidden in game」にチェックするとプレイしても「Sphere」が表示されなくなります。
画面上では見えませんが当たり判定があるので「Collision」を「NoCollision」に変更します。
そして上記画像のようにもう一度「コンポーネントを追加」→「Particle System」と選択していきます。画面右端の「Particles」を「P_Fire」に変更します。

マップに戻り、ソースパネルを表示→「Blueprints」→さっき作ったものをマップ上の木にドラッグ&ドロップ!プレイしてみると木が燃えているような感じがします。


次に時間によって火が消えるプログラムを作ります。ここからはややこしいです。その前にParticleSystemの「「Rendering」内の「Hidden in game」にチェックを入れておきましょう。
さっきドラッグ&ドロップした「Sphere」をダブルクリックします。ブループリントというものが出ました。

まずはボタンを押したら燃えるプログラムを組みます。“Enable Input”に”イベントBeginPlay”からノードを引っ張りplayer Controllerに”Get Player Controller”を繋ぎます。これらのノードの意味は’イベントが始まった時’に、’player0に対して’、’アクター(ここでは点火)の行動を許可’ するというものです。Playerはその個人を指す場合、player0とします。Player1とは二人目を指すということですね。
これにより、ボタンを押してのイベントが開始できるようになりました。
“キーボードイベント”の何か好きなボタンを選択し、Pressedからノードを引っ張り”Set Hidden in Game”に繋ぎます。これでボタンを押すと火が出るようになりましたね。さっきHiddenにしたのでHiddenのHidden、つまりマイナス×マイナスで見えるようになったのでしょう、か。

では火の調節を行っていきます。その為にはタイムラインというノードを扱っていきますが、これは他のノードより(比較的)簡単に作れ、さらに、とても便利です!
”Set Hidden in Game”から“タイムラインを追加する”ノードを追加し、ダブルクリックします。

するとタイムライン専用のタブが開きますので、左上あたりのf+をクリックし、フロートトラックを追加します。ちなみに横のV+ではxyz 三つの値を同時にいじれる為、動く床の制作もこれで可能です。長さとはそのイベントが行われる(タイムラインが継続する)時間です。
名前は火の大きさをいじるのでTimelineScaleとしました。
フロートトラック上のキーの追加は 右クリック→キーを追加 でもできますが Shift+クリック でもできます。また、そのキーを押して「時間」「値」より正確な値の変更ができます。
時間が0の時から、どのような大きさ変化して欲しいか自由にキーの追加を上図のように行います。

できたらイベントグラフに戻り、ノードを繋げていきます。

値を保存する為に「変数」というものを作ります。
1.2:画面左端から「変数」の+ボタンを押し、適当に名前を付けます。
3:画面右端に移り、「変数の型」を「Float」(フロート型)に変更します。さっきのタイムラインで作ったフロートトラックと同じフロート型ですが、フロート型とは少数を扱う場合に用いられます。
4:編集可能にチェックを入れます。

ここで空の入れる箱ができたので時間によってこの値が上昇していくようにします。
変数欄の「scale」(さっき2で自分で名前を付けたもの!)からブループリント内へドラッグ&ドロップです!するとゲットかセットかの選択が迫られるのでセットを選択します。”タイムライン”のUpdateからセットに、TimelineScale からセットに繋ぎます。これで”タイムライン”から流れてくる値をとることができました。
 

次は倍率についてですがこのノードはなくても動きます。値の変更なのでノード自体の移動ではないのです。これによりセットした値のxyz座標それぞれに対して倍率を掛けることができます、ただそれだけのことなのでこのノードを使わない=xyzにそれぞれ1を掛けているということです。
さっきセットしたところから線を出し、vector*floatと検索します。初期状態ではx:0,y:0,z:0となっているので当然火が見えません。よって好きな値に変更しましょう。
 

最後は 今までにセットした値 に大きさを変化させるノードを加えます。このままではただ数値を変更しただけになってしまいますからね。

それでは変数のノードから線を引っ張り”Set World Scale 3D”というノードを配置します。このノードは求められた値に大きさを与えるというものです。倍率ノードの右から線を引っ張り”Set World Scale 3D”にしっかり繋げておきましょう。
画面左上のコンパイル(コンピュータが実行可能な形式のプログラムに変換すること)をすれば和エラーが出てわかりやすいのですが、実はこれだけでは何に対しての大きさを変更したらいいのか機械は理解できないので、「ParticleSystem」をブループリント内へドラッグ&ドロップです!そして”Set World Scale 3D”のターゲットを「「ParticleSystem」にすれば完成です!!プレイしてみると違和感はあるものの時間により火の大きさが変化し、最後には消えてくれることができました。

前述の通り、タイムラインというノードを使うことで時間に関与する物体、例えば動く床、Vector型を使うことによる90°変化する動くドア等々、を作ることができます。