Powerful of blueprint visual scripting

Post on 16-Jul-2015

10.917 views 1 download

Transcript of Powerful of blueprint visual scripting

Powerful of Blueprint Visual Scripting

知られざるブループリントについて

フリーランスゲームクリエイターコミュニティサポーター

中村匡彦

Unreal Fes 2015 Osaka

自己紹介

名前 : 中村 匡彦

Twitterだと @aizen76

元々はゲームプログラマー(3DアクションゲームやMMO作ってた)

去年のアンリアルフェスでも喋らさせていただきました。

普段はフリーでゲームを作るお仕事をしたり、ゲームの作り方を教えたり。

Unreal Engine歴は実はまだ1年だけ。

ところで皆さん。ブループリントどうですか?

実際のところ色々な意見があると思いますが…

今回はブループリントとビジュアルスクリプティングの良いところを実演を混じえて紹介していきたいと思います!

ショートカットについて

かなりのショートカットがあります

Blueprint EditorCheat Sheet

https://docs.unrealengine.com/latest/attachments/Engine/Blueprints/UserGuide/CheatSheet/BlueprintCheatSheet-1989117414.pdf

※公式です

ショートカットを覚えるのはツールの基本

• どれだけ使い勝手のいいツールでも、ショートカットを覚えないと使いにくいのは当たり前

• 煩わしいと思った操作ほど楽に操作出来るかも?

• チートシートを印刷してモニターの近くに貼るのはいいかも。

コメント機能

ただのコメントではない!

• UE4のコメント機能はコメントだけの使いみちではなくて、ノードを整理する機能として使えます。

• グルーピング化、カラー変更、ズームアウトしても読めるバブルコメントなどなど。

• コメント内コメントも可能。ちゃんと深度設定も出来ます。

再ルートノード

ノードの線を再度ルーティングする時に

• ノードピンの線を固定出来る仕組み。複数のピンの線をひとつにまとめることも。

• 沢山のケーブルを束ねる結束バンドのイメージ。線が複雑になってきたらこれで綺麗にしましょう。

ノードの折り畳み

複雑なノードでも一発で折り畳めます

BEFORE AFTER

関数化、マクロ化も一発

関数へ折り畳む マクロへ折り畳む

定期的にノードを整理しましょう

• ソースコードなどと同じようにノードも整理しないとスパゲッティになります。

• 見た目で言えばソースコードよりもノードは酷いか一発でわかってしまうので、後で見た人が苦労しないようなノード作成を心掛けましょう。

• ブループリントにはここまで紹介した機能だけでも十分にノードを整理出来る機能が備わっているはずです。

基本フロー制御ノード

覚えると非常に便利な基本フロー制御ノード

• 分岐を行なうBranchノードやループをするForEachLoopノードも基本制御ノードです。

• 内部的にはマクロを用いて実装されています。

• 地味だけど便利な縁の下の力持ちタイプなナイスガイ

• 今回はBranchやLoopとSwitch以外を紹介します。

Sequence

• 上から順番にシーケンスな流れとしてノードを実行してくれるノード。

• シンプルで分かりやすいですが、ノードの見た目を整理するのに必須なノード。

• Sequenceなしでノードを作っていると、横にとても長くなってスパゲッティになりがち。

DoN & DoOnce

• N回実行するか、もしくは一度だけフローを実行してくれるノード。

• フラグや変数を用いなくても回数制限をかけたい時に便利。

• 一度Resetを実行すれば再度同じ条件で実行してくれます。

• DoOnceはResetかけるまで実行しないという使い方も可能。

FlipFlop

• FlipFlop回路と聞けばわかる人も結構いるはず。

• ノードが実行されるたびにルートが切り替わり、AとBが交互に実行されます。

• 何かに入った時と出た時で交互に違う処理をさせたい時にとても便利!

Gate

• その名前の通り、ゲートが開いている時にのみ処理するノード。

• Enterピンを通っている間にOpenピンが処理されるとその間に処理が走ります。

• Closeさせると処理が止まる。Toggleの場合は交互に入れ替わります。

MultiGate

• 名前こそGateとついているが、さきほどとは別物のノード。

• ノードが実行される度にOutピンの上から順番に実行されます。

• Resetをかけると実行ピンが最初からになり、Is Randomでランダムに実行されます。Loopもチェックするとループします。

Delay & Retriggerable Delay

• 指定した秒数まで一度停止してからその後に実行してくれるノード。

• 一度ノードの実行が完全に止まったように見えますが、ちゃんと実行してくれます。

• Retriggerable Delayは再度実行した場合、時間をリセットしてから実行してくれます。

タイムラインノード

Timeline & カーブエディター

タイムラインノード カーブエディター

これぞビジュアルスクリプトの真骨頂!

• Timelineノードはこれぞまさしくビジュアルスクリプティングだからこそ出来るモノ。

• カーブエディターと合わせてリアルタイムに動きを作成する事が出来ます。

• Float,Vector,Color以外にEventトラックも作成出来ます。自動再生、ループなども簡単。

動く床やオブジェクトがすぐ作れる!

ブループリントのデバッグ

ブループリントのデバッグ

ブレークポイントとウォッチ ブループリント用デバッガー

ブループリントデバッグのデモ動画

ブループリントの差分とマージ

ブループリントの差分確認

差分確認のデモ動画

ブループリントのマージ(3Way方式)

マージのデモ動画

ちなみにブループリントはテキストでコピペも可能

ノードを選択してコピー メモ帳にペースト

ビジュアルスクリプトだけどコードを扱うのと変わらない配慮

コンストラクションスクリプト

コンストラクションスクリプトとは?

• オブジェクトが生成されるタイミングで実行されるグラフ。

• ゲームを再生していなくても実行される唯一の存在。

• レベル内でアクター毎に違う挙動を設定する事が出来る。

ゲームを再生していなくても実行する

装備品のアタッチをする 各種エディター内でも反映!

ダイナミックマテリアルインスタンス

コンストラクションスクリプトで設定しておくと…

ゲームを実行する前に動的にマテリアルを変更できるようになる!

見た目の調整だけでゲームを実行したくないという場合もある

本来ゲームを実行しないと確認出来ないものも確認が可能!

数学式

数学式(Math Expression)

• ノードだけで複雑な式を組み立てるのはとても大変。

• そこで登場したのがテキストから数学式を自動で生成するノード。

• かなり複雑な数式でも書ける。超便利なのでどんどん使いましょう!

ベクトル、変数、数学関数などを自動的に認識!

複雑な論理演算もOK!

少しでも面倒な式は数学式ノードに書きましょう!

乱数

乱数(ランダムストリーム)

• 通常の乱数と基本的には同じ。IntやFloatやVectorなど沢山の乱数がとれる。

• ランダムストリームの初期シード値を固定すれば何度やっても同じ結果に。

• 使うだけならとても簡単!

バウンディングボックス内のVectorをランダムに!

コンストラクションスクリプトで… ボックス内に毎回ランダムで配置

変数のスライダーとクランプ

変数のスライダーとクランプ

• 一部の変数はエディター上でスライダー操作が出来るようになっています。

• 変数を公開すれば自動的にスライダーになります。

• スライダー操作はリアルタイムの変化を確認出来て、とても便利です!

スライダー範囲を設定と値の上限下限値でクランプ

マウスでグリグリと横にスライド 変な値が入っても自動クランプ

Vectorの3Dウィジェット

Vector変数はビューポート上に表示出来る

ベクトルの変数でチェックする 3Dウィジェットが表示される!

構造体

構造体について

• ユーザー定義の構造体を作成すると、自動的に3個のノードが生成されます。

• Break系とMake系とSet members in系ノード。

• これらのノードを使って構造体の操作を行ないます。

不要な構造体メンバーは隠す事が可能

詳細からチェックを外す チェックされているメンバーのみに

更にこんな機能も…

直接構造体ピンからメンバーを操作も可能!

ノードの分割というのが可能 メンバーが出現!

ぶっちゃけ、こちらの方が便利!ノード作らなくていいし…

好きな方を使いましょう!ケースバイケースという事で…

マクロの活用法

マクロって関数と比べてどうなの?

• 関数があるのになぜマクロが必要なのか?

• マクロを使うタイミングがよくわからない…

• ぶっちゃけ全部関数でいいのでは?

徹底比較!関数 VS マクロ

関数

• 基本的にターゲット(誰に対して行なうか)を必要とする。

• 必ず実行前にコンパイルをする必要がある。

• 純粋関数でない限り、実行線は必ず入出力ともひとつずつのみ。

• Latentノード使用不可。

マクロ

• 親クラスを指定するので、ターゲット指定が必要ない。

• 実はインライン展開されるので、コンパイルが必要ない。

• 実行線を入出力共にいくらでも持たせる事が可能。

• Latentノード使用可能。

わかりやすいマクロの有効活用例(CompareInt)

そもそも使用目的が違う

• 関数は外部に機能を公開するために使用する。

• マクロは継承されたクラス内でのユーティリティとして使う。

• 関数は10台の車を生産するのにひとつの工場で作る。

• マクロは10台の車を10の工場で1台ずつ作る。

• 最終的にインライン化されるマクロの方が効率的になる。

AnswerHubで、とても詳しい解説がありました

https://answers.unrealengine.com/questions/30834/whats-the-difference-between-blueprint-macros-and.html

マクロの方が制限が少なく、ビジュアルスクリプトの恩恵が強い!

用法用量を守って、正しくマクロをお使いください

キャスト VS インターフェース

キャスト便利過ぎー!問題

• キャストは手軽に別のブループリントの情報が参照出来て便利。

• 便利過ぎて多用し過ぎてませんか?

• キャストは便利ですが、それなりに諸刃の剣です。

キャストの問題点

• キャストは失敗してしまう可能性があり、エラーハンドリングミスによってはゲームが正しく実行されない可能性がある。

• キャストした側とされる側で依存関係を持つ事になる。

• 依存関係を持ったBP同士は双方のコンパイルが必須になり、依存関係が複雑になればコンパイル速度は無視出来ないものになる。

インターフェース関数を使おう

• インターフェースは呼び出し元に依存せず安全に呼び出せます。

• ターゲットがアクターである必要ですらなく、安全にハンドリングしてくれます。

• 何よりも依存関係もなくコンパイル時間が長くならない!

インターフェースによるカプセル化

• 本来インターフェースはオブジェクト指向言語由来の考え方であり、今の時代においても有効な手段。

• カプセル化は情報隠蔽(Private化)の事だけではありません。

• インターフェースにおけるカプセル化は、オブジェクトを抽象化し、依存関係をなくすものですが、プロのゲームプログラマーの方でもこれを理解されずに使っている方が多く、少し勿体なく思います。

更にブループリント インターフェースのメリット

• 相手が誰であろうと、インターフェースを継承していようがなかろうがなんと誰でも安全にインターフェース呼び出しが出来る!

• C++の仮想関数と同様の使い方が出来ます。ポリモーフィズムによるアクターごとによる多態性の実現!

• 相手の詳細を知らなくても呼び出せるので、ブループリント間での通信やメッセージハンドリングが出来る!

インターフェースについてもっと詳しく知りたい方はこちら!

http://unrealengine.hatenablog.com/entry/2014/09/23/201458

用法用量を守って、正しくキャストお使いください

まとめ

ブループリントは常に進化し続けています

• 本日公開したTipsはまだまだ一部。

• UE4同様にブループリントも常に進化しており、どんどん便利に。

• ビジュアルスクリプトに最初は慣れないかもしれませんが、一度覚えてしまえば普通にコーディングするよりも生産性が上がります。

ブループリントでトライ&エラーを早めてゲーム作りを素早く!楽しく!