Slide 1

Slide 1 text

Unreal Engine Sapporo Meetup! (2017/02/25) ショートセッション・LT

Slide 2

Slide 2 text

どこからきたの?なわばりは? ・mao (@TEST_H_) ・ゲームプログラマーなフレンズ. ・仕事では主にUnityちほー等に生息している. ・UE4は業務関係なしに趣味で楽しんでいる。

Slide 3

Slide 3 text

注意点 ・LTなので諸々端折ってます。。。 ・内容的に大分プログラマ寄りになります。

Slide 4

Slide 4 text

その他 質疑応答やご指摘等につきましては後のMeetupタイムで お受けできればと思いますので、お気軽にお声がけ下さい。

Slide 5

Slide 5 text

目次 1. はじめに 2. BehaviorTreeのTaskに Tick Intervalを設定できるようにしてみた。 3. アウトプットログに サーバルちゃんを表示してみた。 4. UE4上で けものフレンズが見たい。見たい。

Slide 6

Slide 6 text

はじめに

Slide 7

Slide 7 text

環境構築について historia社のブログが参考になります。 [UE4] エンジンのソースコード取得とビルド手順のまとめ UE4.6改訂版 http://historia.co.jp/archives/1327 ●必要なもの ・GitHubアカウント ・VisualStudio(個人なら無料版であるCommunityでもok) ・UnrealVS ※VisualStudioの拡張機能。 UE4を起動する際にプロジェクト(.uproject)を指定して起動する事が出来る 。 無くても行けなくはないが、確実にあった方が良い。

Slide 8

Slide 8 text

BehaviorTreeのTaskに Tick Intervalを設定できるようにしてみた。

Slide 9

Slide 9 text

BehaviorTreeのTaskには Tick Interval(Tickの呼び出し間隔)に 相応する設定が無かったので追加してみた。 ※実装されていないと言う事は、  裏を返せばそもそも使用される想定が無いので  実装されていないだけとも考えられるが...

Slide 10

Slide 10 text

実装箇所の特定 元からTaskカテゴリーにある ”IgnoreRestartSelf”の文字列で全検索。 →結果”BTTaskNode.h”辺りに変数を発見。

Slide 11

Slide 11 text

Editor上から値を調整出来る様に 一先ずは処理に必要な変数を追加。 その上でUE4上から値を変更出来る様にしたいので 変数にUPROPERTYを付ける。 →これでEditor上に表示される。 ※ドキュメントに情報が纏まっているので要参照。

Slide 12

Slide 12 text

後は実装 BTTaskNode.cppに Tick関連の処理があったので改造。 結果、制御出来るようになった。 →右のキャプチャはintervalを  [0.016秒][1秒]に設定したTaskを  何個か同時に走らせてログ出力した物。

Slide 13

Slide 13 text

アウトプットログに サーバルちゃんを表示してみた。

Slide 14

Slide 14 text

※はめ込み画像ではありません。

Slide 15

Slide 15 text

エンジンコンテンツにサーバルちゃんを追加 ●必要なこと ・エンジンソースのContent以下にサーバルちゃんを追加 “/Engine/Content”が該当するかと思われるので 一先ずは“/Engine/Content/Editor/Slate”以下に追加。 ・SlateStyleクラスの追加 historia社のブログが参考になります。 [UE4] プラグインによるエディタ拡張(4) 自作ツールに画像を利用する http://historia.co.jp/archives/476 ※但し、こちらはPlugin想定で書かれているので    画像の参照先をエンジンコンテンツ以下にする必要がある点には注意。

Slide 16

Slide 16 text

実装箇所の特定 前章と同じくEditor上の固定の文字列で 全検索をかけるという手もあるが、 EditorのUIであれば ウィジェットリフレクタが大変便利

Slide 17

Slide 17 text

表示が小さくて分かり難いかもしれないが、 下記のキャプチャはアウトプットログにフォーカスを当てたもの。 構造だけでなくソースと行数が表示されるので実装箇所も特定できる。 ※イメージ的にはブラウザの開発ツールのElementsの挙動に近い。

Slide 18

Slide 18 text

とりあえずはSOutputLog.cppに実装すれば良いことがわかった。 SlateStyleクラスを実装した上でソース中で読み込み、 アウトプットログの右側にボックスを配置して表示。

Slide 19

Slide 19 text

Slate UI なお、あまり見慣れないであろう下記の書き方は UE4のUIプログラミングフレームワークであるSlateUIの記述。 こちらは公式ドキュメント及びhistoria社のブログが参考になります。 [UE4] プラグインによるエディタ拡張(3) SlateUIを使用してウィンドウを作成する http://historia.co.jp/archives/373

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

UE4上で けものフレンズが見たい。

Slide 22

Slide 22 text

と言う事で、アウトプットログ上で 動画再生出来る様にしてみたお話。

Slide 23

Slide 23 text

やったこと ・MediaPlayerEditorの動画再生を行っているUIを特定して  Plugin側からエンジンコード側に力技で移植。 ・移植した動画再生エリアをアウトプットログに表示。

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

実装箇所の特定 ウィジェットリフレクタを用いて特定。 結果、”SMediaPlayerEditorViewer.cpp”から 呼び出している”SMediaPlayerEditorOutput”が それっぽかった。 →こちら”SCompoundWidget“と言うのを継承しており、  このままSNewする形で付けられそう。

Slide 26

Slide 26 text

依存の解決 ・アウトプットログのモジュール依存関係を解決。  OutputLog.Build.csにMediaPlayer関連を追加。 (※精査せずにMedia関連を突っ込んだので多分不要な物も混じっている筈...)

Slide 27

Slide 27 text

移植 SMediaPlayerEditorOutputはPlugin側で実装されており、 エンジンコード側から参照する方法が現時点では不明だったので、 一先ずはエンジンコード側に 同じ物を実装すると言う力技を用いることに。

Slide 28

Slide 28 text

MediaPlayerのインスタンス化 再生するにはUMediaPlayerのインスタンスが必要。 →Editor上からの場合はAssetRegistryを用いる事で  MediaPlayerのAssetを取得出来そう。 一先ずは必要なAssetのPathを 直打ちする形でMediaPlayerのAssetを取得し、 UMediaPlayerをインスタンス化。 ※右のキャプチャでは普通に呼んでいる が、実際にはAssetの読み込み完了時の コールバック等で読み込んだりと、 ロードの動作を保証する必要がある。

Slide 29

Slide 29 text

UMediaPlayerのインスタンス化は出来たので さっきのサーバルちゃんの位置に表示してみる。

Slide 30

Slide 30 text

結果 出来た。 https://twitter.com/TEST_H_/status/833 692908322582528 ※再生動画には けものフレンズでは無く、  サンプル動画を用いております。  (けものフレンズの動画ファイルなんて無かった...)

Slide 31

Slide 31 text

まとめ ・C++の基礎的な知識は必要になるが、  エンジンコード自体は非常に綺麗に書かれているので  意外と読めた。 ・内部処理を追っていると何が何処にあるのか?  と言った情報を目に出来るので、これはこれで勉強に。  →例えばBlueprintに関数を公開している箇所とか見えてくる ※嫌な所がブラックボックスになっていないので  足りない機能や欲しい機能は自力で何とか出来たりするかも。

Slide 32

Slide 32 text

まとめ ・本格的にやるならエンジンコードをフォークするなりして  独自に管理するなりした方が良いかもしれない。  (寧ろ、ここらの管理方法は自分も知りたい)