Upgrade to Pro — share decks privately, control downloads, hide ads and more …

UE4初心者がエディタ拡張をやってみた

08a7d188d046f35b2501e686616f71bd?s=47 mao
February 26, 2017

 UE4初心者がエディタ拡張をやってみた

Unreal Engine Sapporo Meetup! (2/25)
ショートセッション・LT 資料

https://atnd.org/events/85683

08a7d188d046f35b2501e686616f71bd?s=128

mao

February 26, 2017
Tweet

Transcript

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

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

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

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

  5. 目次 1. はじめに 2. BehaviorTreeのTaskに Tick Intervalを設定できるようにしてみた。 3. アウトプットログに サーバルちゃんを表示してみた。

    4. UE4上で けものフレンズが見たい。見たい。
  6. はじめに

  7. 環境構築について historia社のブログが参考になります。 [UE4] エンジンのソースコード取得とビルド手順のまとめ UE4.6改訂版 http://historia.co.jp/archives/1327 •必要なもの ・GitHubアカウント ・VisualStudio(個人なら無料版であるCommunityでもok) ・UnrealVS

    ※VisualStudioの拡張機能。 UE4を起動する際にプロジェクト(.uproject)を指定して起動する事が出来る 。 無くても行けなくはないが、確実にあった方が良い。
  8. BehaviorTreeのTaskに Tick Intervalを設定できるようにしてみた。

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

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

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

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

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

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

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

    ※但し、こちらはPlugin想定で書かれているので    画像の参照先をエンジンコンテンツ以下にする必要がある点には注意。
  16. 実装箇所の特定 前章と同じくEditor上の固定の文字列で 全検索をかけるという手もあるが、 EditorのUIであれば ウィジェットリフレクタが大変便利

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

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

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

  20. None
  21. UE4上で けものフレンズが見たい。

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

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

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

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

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

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

    ロードの動作を保証する必要がある。
  29. UMediaPlayerのインスタンス化は出来たので さっきのサーバルちゃんの位置に表示してみる。

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

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

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