Unreal Engine入門(3) ブループリントクラスによるアニメーション

UnrealEngine

概要

第3回目のチュートリアルではブループリントクラスを使ったアニメーションがテーマです。クラスを活用できると一気に表現力が高まります。効率良くバリエーションが豊かなシーンを作るための考え方を紹介します。

1.レベルの環境構築
2.ブループリントクラスの作成
3.ブループリントの構築
4.アニメーションの作成
5.回転のアニメーション
6.プレイしてみる
7.ブループリントクラスとアクタの関係
8.変数とインスタンス化
9.変数を使用する
10.インスタンス変数を変更

レベルの環境構築

概要欄にあるサンプルファイルをダウンロード、ファイルを開いたらレベルを新規作成しましょう。ファイルメニューから新規レベルを選択します。テンプレートは「空のレベル」を選んでください。何もアクタが追加されていない空っぽのレベルが作られます。

次にコンテンツブラウザからDefault_Settingを配置してください。位置は(0,0,0)にセットしておくと空間が把握しやすいと思います。また「Auto Posses Player」を「Player 0」に設定し「所有」しましょう。

このDefault_Settingにはカメラやライト、背景用のフォグといったコンポーネントが追加されているので、最低限のセットアップはこれだけで完了です。

ブループリントクラスの作成

次にブループリントクラスを作ります。コンテンツブラウザの新規作成ボタンからブループリントクラスを選択し、親クラスをActorにして作成します。名前はなんでも良いですが、ここでは「BP_Plane」としましょう。

Actorはレベルに配置できる最もシンプルなクラスですので、特別な機能が必要ない場合はActorを選択しておけば良いと思います。よりゲームキャラクターに特化した機能が必要な場合は、PawnやCharacterを親クラスにした方が良いでしょう。

作成したブループリントクラスをダブルクリックしてブループリントエディタを開きます。これはブループリントクラスを設計するための画面で、スタティックメッシュなどのコンポーネントを追加したり、ブループリントを記述することが可能です。

ブループリントエディタのビューポートに、コンテンツブラウザから「StaticMesh_Plane」をドラッグ&ドロップして追加します。これはサンプルでいつも使用している平面メッシュデータです。追加されたメッシュはビューポートで位置や向きなどを変更できます。コンポーネントパネルにも一覧で表示されていることを確認してください。

ブループリントの構築

次にブループリントクラスのイベントグラフをクリックして、ブループリントを構築していきます。ブループリントは機能を持ったノード同士をつなぐことで機能を実装していく、ビジュアルフロープログラミングです。まずは基本的な考え方として、イベントとノードの接続について解説します。

イベント

イベントには様々なものがあり、独自にカスタムイベントを作成することもできますが、ひとまず2つのイベントを覚えておけば良いでしょう。「Event Begin Play」と「Event Tick」です。

・Event Begin Play…ブループリントクラスがレベルに生成された最初のタイミングで呼び出される。
・Event Tick…ゲームプレイ中にフレームが更新されるたびに呼び出される。

イベントについて(公式ドキュメント)

ノードとノードの接続

ブループリントはノードの出力ピンと入力ピンをワイヤーで繋ぐことで、機能を実装していきます。ノードからノードへデータが渡されて流れ作業が行われていくイメージです。

もっとも重要なのは白い三角形の実行ピンです。ノードは入力実行ピンに接続されて初めて機能します。慣れないうちはこの実行ピンを接続し忘れて、あれ動かない?という事になりがちですので注意しましょう。

ノードについて(公式ドキュメント)

アニメーションの作成

ブループリントの基本を学んだところで、Event Tickを利用してStaticMesh_Planeを回すアニメーションを作成してみましょう。まずはStaticMesh_Planeの位置や回転を変更できるように準備をしますので、映像を参考に三つのノードを接続してください。

ちなみにノードを追加する際「状況に合わせた表示をON」にしておき、検索窓も利用すると効率よく目的のノードを探すことができます。

・Event Tick … 毎フレーム呼び出されるイベント
・StaticMesh_Plane … 平面メッシュ
・Set Relative Location and Rotation … コンポーネントの位置と回転を設定する

回転のアニメーション

時間を「秒数」で取得し、StaticMesh_Planeの回転角度として利用します。この際、そのままだと回転角度が小さくて動きがゆっくりすぎるので、かけ算をして数値を大きくします。100倍ぐらいで良いでしょう。

・Get Time Seconds … プレイされてからの時間を取得
・float * float … 浮動小数点同士の計算

準備した回転用の数値を「Relative Location and Rotation」の「Rotationピン」に繋ぎますが、そのままでは繋げられません。なぜなら、このノードの回転パラメータはRotatorというXYZの3つの数値データの集まりで指定する必要があるため、浮動小数点である回転用数値はそのままでは入力できないのです。

実はブループリントではしばしばこうしたケースに遭遇しますが、ほとんど場合はコンバート可能ですので安心してください。ちなみに今回はMake Rotatetorというノードを経由して、X軸方向の回転を指定することができます。

最低限のネットワークが構築できたところで、動きをチェックしてみましょう。まずはツールバーのコンパイルを押して、ブループリントを実行可能にしつつ、エラーがないかチェックします。

プレイしてみる

メインのエディタに戻り、作成したブループリントクラス「BP_Plane」をレベルに配置して位置を(0,0,0)に設定したら、プレイボタンを押してみましょう。画面中央で平面がくるくると回っていたら成功です。

ブループリントクラスとアクタの関係

さらに複数のブループリントクラス「BP_Plane」をレベルに配置してみるとどうなるでしょうか。コンテンツブラウザからドラッグしても良いですし、ビューポートでコピー&ペースト、またはOption[Alt]キーを押しながら移動で複製できますので、レベル上のBP_Planeを増やしてみてください。

配置した後にプレイしてみると、全てのBP_Planeが回り出したと思います。一つのブループリントクラスから動きも含めて複製できていることに注目してください。これはオブジェクト指向プログラミングの領域ではインスタンス化と呼ばれている考え方になります。

変数とインスタンス化

ブループリントクラスは、インスタンス化した後に「変更できる」パラメータを持つことができます。要するに一つのブループリントクラスをベースにしながらも、機能や外観にバリエーションを作り出すことができるのです。

実際に試してみましょう。現在、レベル上全てのBP_Planeアクタは同じスピードで回転しています。同じクラスから生成されたので当然と言えば当然です。このスピードをインスタンス化後に変更できるようにしてみます。コンテンツブラウザからBP_Planeを開いて次の作業を行なってください。

1.Speedという変数を追加する。
2.変数SpeedのタイプをFloat(浮動小数点)に変更
3.変数Speedをインスタンス編集可能にする
4.コンパイルする
5.変数Speedのデフォルト値を設定する

ここでポイントになるのが「3.インスタンス編集可能」です。このパラメータがONになっていると、レベルに追加した状態でパラメータを変更できるようになります。

ちなみに、インスタンス編集可能の変数には「目」のアイコンが付きますので判別しやすくなります。目のアイコンをクリックしてもONとOFFを切り替えられます。

変数を使用する

次に変数Speedをブループリントの中で使用します。変数パネルからSpeedをドラッグしてイベントグラフに配置し、回転スピードを決めていたノードの入力ピンにつなぎます。

変数をつなぐ事によって、これまで手動で入力していた「100」という数値は、変数のデフォルト値に置き換わります。

最後にコンパイルをクリックしてレベルに反映させます。

インスタンス変数を変更

メインのエディターに戻り、ビューポートで配置されているBP_Planeアクタを選択し、詳細パネルを確認してみてください。先ほど追加した変数Speedが表示され、デフォルト値100が設定されていると思います。このパラメータを変更するとどうなるでしょうか?早速試しに数値を変更してプレイしてみましょう。

BP_Planeアクタの回転速度が変わっていたら成功です!

試しに他のBP_Planeアクタの回転速度も変えて、それぞれ異なる速度で回転させてみましょう。一気に画面の中に多様性が生まれたのではないでしょうか。一つのクラスから複数のバリエーションを作り出す。これがインスタンス化のメリットの一つです。

まとめ

今回は一つのブループリントクラスを元に、動きのバリエーションを生成しました。インスタンス化を活用できると作業は一気に効率化できることが理解できたのではないでしょうか。サンプルでは単純な平面データを使用していますが、複雑な3Dメッシュやパーティクルだとしても基本的な考え方は同じです。

シーンを設計をする際、まずはこの考え方を念頭に置いて考えると、複雑なシーンでもシンプルに構築できるはずです。ぜひ活用してみてください。今回のチュートリアルはこれで終了です。お疲れ様でした。

間違いの指摘、アドバイス、ご要望などはTwitter(@zuga)までお願いします!

Related Posts

No results found

メニュー