Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ブループリントマニアックス

11,940 views

Published on

Unreal Fest 2016 Yokohamaで喋った時のスライドです。

Published in: Engineering
  • Be the first to comment

ブループリントマニアックス

  1. 1. ブループリント マニアックス! フリーランス クリエイター コミュニティサポーター 中村 匡彦 Unreal Fest 2016 Yokohama
  2. 2. 自己紹介 前職まではコンソール系メインのゲームプログラマー。 主に3Dのアクションゲームを作ることが多かった。 今は独立してフリーになり、UE4をメインとして活動。 ゲーム作りは仕事と趣味を兼ねています。 UE4に関する様々なお仕事をお受けしますのでご相談ください。
  3. 3. ゲーム代表作
  4. 4. 完全個人制作ゲーム もちろんUE4製。 プログラムはもちろん、企画からイラストや3Dモデリングもやってます。 アクション性の強いシューティングですが、全てブループリントのみで完結 しています!C++は一文字も書いていません。 マーケットプレースのアセットもそこそこ使っています。
  5. 5. 著書 『Unreal Engine 4 ブループリント 逆引きリファレンス』 翔泳社様より発売中。 ブループリントを触り始めて、 一通り基本的な操作や使い方を学びたい! というような方向けです。
  6. 6. ここから本題
  7. 7. ブループリントについて
  8. 8. 今日はいつもよりかなりマニアック
  9. 9. もしすべて知っている方は 既にブループリント博士です。
  10. 10. それでは早速いきましょう。 ※今回の検証には全てUE4.13.0を利用しているので、 古いバージョンでは利用出来ない機能があったり、 違う検証結果になる事もあるのでご了承ください。
  11. 11. リファレンス変数ノードのValidation
  12. 12. リファレンス変数のValidation Actorなどのリファレンス変数を作成すると、必ず必要になるのが 参照内容のValidationによるチェック。 いわゆる『 Null Pointer 』や『Null Reference』等と呼ばれる状況で 問題が起こらないようにしたい。※この状況自体は頻繁に発生する
  13. 13. リファレンス変数のValidation 通常であれば『IsValid』マクロを使う。
  14. 14. リファレンス変数のValidation しかしリファレンス変数ノードの 場合には、ノード上で右クリック、 『Convert to Validated Get』 という特殊な項目が存在する。
  15. 15. リファレンス変数のValidation これでノードがコンパクトになりスッキリ。※Getノードのみ
  16. 16. ノードの条件付きコンパイル
  17. 17. ノードの条件付きコンパイル 開発中に「このノード、一時的にオフにしたいなぁ」 みたいなことって絶対ありますよね? あと「このノードは開発時だけでリリース時には外したい」 も同じくらいあるかもしれません。
  18. 18. ノードの条件付きコンパイル 『Editor Preference』⇒『Blueprint Editor』⇒『Experimental』⇒ 『Allow Explicit Impure Node Disabling』にチェックする。
  19. 19. ノードの条件付きコンパイル ノード上で右クリック⇒『Disable(Do Not Compile)』を選択。
  20. 20. ノードの条件付きコンパイル ノードが透けて、繋いだままでも一時的に実行されなくなる。 元に戻す時も同様に『Enable Compile』⇒『Always』でOK。
  21. 21. ノードの条件付きコンパイル 更に『Enable Compile』⇒『Development Only』で、 Development時のみ有効でShipping時に無効にする事が可能。
  22. 22. カスタムティック
  23. 23. カスタムティック みんなが最もよく使うイベントノードのひとつ『Event Tick』 実は結構色々とカスタマイズできるんです。 利用する際には、ツールバーにある 『Class Defaults』ボタンを押すと、 『Details』パネルで確認可能。
  24. 24. ティックが重い! 実は毎フレーム処理する必要がなかったりしませんか? 『Tick Interval(secs)』で『0.0』以外にしてみましょう。 『1.0』と指定すれば1秒間隔で呼び出してくれます。 問題が起きない範囲で間隔を調整してみましょう。
  25. 25. ポーズをかけるとティックされない… 『Tick Even when Paused』にチェック。 『Set Game Paused』ノードでポーズ状態になりますが、 この状態でもティックされるようになります。 ただし、位置変更を行っても描画が反映されないので注意。 アクションなどの入力は正常に取得可能。
  26. 26. ティックの呼び出しタイミングを変えたい 主に物理シミュレーションの関係で位置が確定するまでは、 動いたりしたくないという状況があります。 そういう時は『Tick Group』を変更します。 『Pre Physics』『During Physics』『Post Physics』 『Post Update Work』から選択が可能。
  27. 27. 『Pre Physics』 デフォルトのままならこれ。 前フレームの物理シミュレーションを考慮して動く。 その後のシミュレーション次第で位置が変わることがある。
  28. 28. 『During Physics』 物理シミュレーションと同時実行される。 そのため、前フレームもしくは現在フレームどちらの 物理情報を利用するのかはわからない。 物理に影響するものでなければ、最も負荷のかからない更新。
  29. 29. 『Post Physics』 物理シミュレーションが完了後に実行される。 他に影響されるものがないので、自分で位置を確定できる。 シミュレーション後に正しい位置を計算したい場合に有用。
  30. 30. 『Post Update Work』 最も最後に実行される。 具体的にはカメラの位置が確定した後に呼び出し。 Latent系アクションもこの前に実行されている。 アクター同士で最後の最後に辻褄合わせしたい時に利用する。 レンダリングはこの後に行われる。
  31. 31. ピュアキャスト
  32. 32. ピュアキャスト 通常のキャストとは出来ることは同じ。 キャストノード上で右クリック⇒『Convert to pure cast』を選択
  33. 33. ピュアキャスト すると実行ピンがない状態となる。これがピュア(純粋)化状態。 キャストが成功しているかは『Success』ピンでチェック。
  34. 34. ピュアキャスト 配置時のデフォルトをピュアキャストノードにすることも可能。 『Editor Preference』⇒『Blueprint Editor』⇒『Experimental』⇒ 『Default to using Pure Cast Nodes』にチェック。
  35. 35. ピュアキャスト 同様の場所にある『Workflow』⇒『Auto Cast Object Connections』 にチェックしておくと、ピンとピン接続時に可能であれば自動的に キャストノードを挿入してくれるように。
  36. 36. キャスト時の負荷計測
  37. 37. キャスト時の負荷計測 10万回のループでキャスト時に空の関数を呼ぶ。 その間にかかった平均時間。更にループ負荷を含まない時間。 非ピュアキャスト ピュアキャスト 10回の平均値 350.1 ミリ秒 301.9 ミリ秒 呼び出し時間のみ 192.6 ミリ秒 144.4 ミリ秒
  38. 38. constとピュア属性
  39. 39. constとピュア属性 この2つについての違いを知っていますか? 実は意外と知らない人が多い… 設定は関数の『Details』パネルから。
  40. 40. constとピュア属性 以下は公式の説明。 https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/Glossary/in dex.html
  41. 41. 実は間違ってる
  42. 42. ピュアであってもメンバー値の変更は可能
  43. 43. おかしいですよ!エピックさん!!
  44. 44. constとピュア属性 この解説通りの挙動にするためには、『const』化が必要。 ブループリントでは必ず『const』も指定しましょう。 C++の場合はconst関数にするか、『BlueprintPure』と 『UFUNCTION』で指定すればブループリント上でも 完全なピュア状態になります。
  45. 45. constとピュア時での負荷計測
  46. 46. constとピュア時での負荷計測 10万回のループでメンバー値を取得後に代入する。 その間にかかった平均時間。更にループ負荷を含まない時間。 非ピュア 非const 非ピュア const ピュア 非const ピュア const 10回の平均値 376.9 ミリ秒 383.8 ミリ秒 339.0 ミリ秒 332.8 ミリ秒 呼び出し時間のみ 215.6 ミリ秒 222.5 ミリ秒 177.7 ミリ秒 171.5 ミリ秒
  47. 47. いろいろ疑問は残るけど…
  48. 48. 全体的にピュア関数の方が高速!!
  49. 49. 値取得が可能なprivate変数
  50. 50. 値取得が可能なprivate変数 ブループリントの場合C++のように、 値が取得可能なprivate変数が実現できないと思われていますが、 前述のconstとピュア属性をうまく使うことで可能となります。
  51. 51. 値取得が可能なprivate変数 変数の『Details』で『Private』にチェック。 新規関数を作成し、『Pure』と『Const』にチェック。
  52. 52. 値取得が可能なprivate変数 あとはC++と同様な感覚でGetterを経由するだけ。 少しの手間はかかりますが、ブループリント上でも 変数利用を制限したいという場合には非常に有用。 大規模な開発ではとても大切。
  53. 53. ここで少し閑話休題
  54. 54. ピンの流れの方向の可視化 『Editor Preference』⇒『Blueprint Editor』⇒『Visual Style』⇒ 『Draw midpoint arrows in Blueprints』にチェック。 流れがわかりやすいかも?
  55. 55. 背景グリッドの非表示 『Editor Preference』⇒『Appearance』⇒『Graphs』⇒ 『Use Grids In The Material And Blueprint Editor』のチェックを外す。 グリッドが消えて、 ちょっと新鮮かも…?
  56. 56. マクロとシーケンスノード
  57. 57. マクロとシーケンスノード ForLoopノードを使ってて「あれ?」と感じたことがないですか?
  58. 58. マクロとシーケンスノード ForLoopノードをダブルクリックで開くと…
  59. 59. シーケンスノード
  60. 60. シーケンスノード!!
  61. 61. マクロとシーケンスノード 正体はマクロの中にあるシーケンスノードでした。 この組み合わせを利用すると、 “一時的にノードの外に出る” ことが可能で、そのまま外で処理してからマクロの 内部に戻ってきて更に処理を加えることが可能!
  62. 62. 応用例 単体で『Event Tick』を実現するマクロ。局所的なTickが作れる。
  63. 63. 応用例 フレーム分割をしながら処理するループ。少しずつ回したい時に。
  64. 64. 応用例 更に少し改造するとディレイ時間をループ間で発生させて、 複数体のアクターを1度の呼び出しでスポーンさせるなどが可能に。
  65. 65. マクロとシーケンスの組み合わせは超強力! 使い方次第で超便利ノードになります!
  66. 66. おまけ
  67. 67. おまけ
  68. 68. おまけ こんな感じのブロック可能なループを作成。
  69. 69. おまけ 実はシーケンスもいらないくらい単純でした。でも便利!
  70. 70. 配置できないノードの配置
  71. 71. 配置できないノードの配置 たまにありますよね? 最近ちょっと困ったのが、 なぜか『ブループリント関数ライブラリー』の関数内で、 『Spawn Actor from Class』ノードが配置できなかったこと。 普通だったら「え、配置できないの…」で終わりますが。
  72. 72. ちょっと待ったッ!!
  73. 73. 配置できないノードの配置 他のブループリント上で繋いだ状態のノードを『Collapse Nodes』化 畳まれたノードをコピーまたは切り取り。
  74. 74. 配置できないノードの配置 これを配置できないノード上に配置すると、利用できてしまう。 もちろん実行してみても問題もない。
  75. 75. 配置できないノードの配置 このテクニックは関数だけでなく、マクロ内などの 比較的ありとあらゆる場所で利用可能。 場合によってはタイムラインを配置したりもできるが、 うまく動かないことがほとんどなので、その時は諦める。 しかし意外と動くことが多いのでぜひ一度はお試しください。
  76. 76. ブループリントプロファイラー
  77. 77. ブループリントプロファイラー 割りと最近搭載された新機能。 しかしまだExperimental(実験的)状態。 『Editor Preference』⇒『Experimental』⇒『Blueprints』⇒ 『Blueprint Performance Analysis Tools』にチェックする。 これでツールバー上に『Profiler』ボタンが出現する。
  78. 78. ブループリントプロファイラー 『Profiler』ボタンを押すと、専用のパネルが出現。 コンパイルボタンも専用のものになるので、再コンパイルする。 これで利用可能に。
  79. 79. プロファイラー実演
  80. 80. ブループリントプロファイラー とても視覚的なプロファイリングが可能。 ヒートマップ表示により、負荷のかかっているノードはすぐ明確に。 非常に使い勝手のいいものとなっているので、 はやくExperimentalがとれることに期待したいところ。
  81. 81. Blutility(ブループリントユーティリティ)
  82. 82. Blutility(ブループリントユーティリティ) 実はUE4初期の頃から存在している隠し機能みたいな存在。 こちらもExperimental(実験的)状態。 『Editor Preference』⇒『Experimental』⇒『Blueprints』⇒ 『Editor Utility Blueprints(Blutility)』にチェックする。
  83. 83. もう時間がなさそうなので…
  84. 84. 早速Blutility実演
  85. 85. Blutility(ブループリントユーティリティ) ゲームを実行していなくてもスクリプト処理が可能。 簡単なエディター拡張的なこともできる。 最近少しずつ機能が増えてきている。 ブループリントで開発用のサブ機能を作りたい時に。 かなりマニアックな機能だが発想次第で便利に使えるはず。
  86. 86. 今後のブループリントについて
  87. 87. エディターのロード時間改善
  88. 88. コンパイルプロセスのリファクタリング
  89. 89. ブループリント プロファイリングツール
  90. 90. 差分・マージツールの改善
  91. 91. ブループリントからC++への変換ツール
  92. 92. TMap/TSetのサポート
  93. 93. ブループリントバックエンドにLLVMの導入
  94. 94. 参照パラメーター視覚化の改善
  95. 95. 破損ピン読み込み時のハンドリング改善
  96. 96. ブループリント安定化と使い勝手の改善 全体的に安定化を目指したアップデート予定が目立つ。 LLVMの導入はおそらく更なる安定化と最適化のため。 プロファイラー、差分・マージツールやC++変換ツールも 更に使いやすくなり、実用性向上に期待がもてる。
  97. 97. まだまだブループリントは進化します! ビジュアルスクリプトはとても楽しいです!
  98. 98. ご清聴ありがとうございました。

×