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

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

mao
February 26, 2017

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

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

https://atnd.org/events/85683

mao

February 26, 2017
Tweet

More Decks by mao

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. はじめに

    View full-size slide

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

    無くても行けなくはないが、確実にあった方が良い。

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide