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.

ぷちコン作品を4日で作った話

867 views

Published on

第7回UE4ぷちコンでゲームを制作した際に使用した「インターフェース」と「イベントディスパッチャー」について説明しています。

Published in: Technology
  • Be the first to comment

ぷちコン作品を4日で作った話

  1. 1. ぷちコン作品を4日で作った話
  2. 2. 第7回 UE4 ぷちコンにて賞を頂きました UE4 ぷちコンって? その名の通り、UE4を使用して数日~1ヵ月程度のぷち期間で制作した作品 の コンテストです。 テーマが存在する ぷちコンでは各コンテストでテーマが存在します。 第7回UE4ぷちコンでのテーマは「サプライズ」でした。 レギュレーション(公式HPより抜粋) 喜び・感動・恐怖・怒り、なんでもでもよし! いろいろなサプライズ(驚き)をテーマに募集します。 解釈はあなた次第!このテーマをひとつでも含む作品ならば何でもOKです! チーム制作可。ノンゲーム(映像作品など)も可。何点でも応募可 http://historia.co.jp/ue4petitcon07
  3. 3. 第7回 UE4 ぷちコンにて賞を頂きました タイトル:21 獲得賞:引き込まれたで賞 https://youtu.be/DB0nFrVVS2g
  4. 4. 4日間の中「21」で活用した仕組み
  5. 5. ・インターフェース ・イベントディスパッチャー この二つについて話していきます
  6. 6. インターフェース
  7. 7. 21のクラス 項目 定義・実装内容 インターフェース(IInteract_BP) • インタラクトイベント • フォーカスイン・アウトイベント • クリックイベント • 名前の表示 • 名前の削除 • テキストの表示 • テキストの削除 • テキストの設定 • 自殺の設定 親クラス(InteractObjBase_BP) • インタフェース継承 • インターフェース実装 • オブジェクトのビルボード 派生クラス(InteractTextActor_BP, etc…) • インターフェース実装 • 親クラス継承 • クラスごとのイベント実装
  8. 8. 21のクラス図 <<interface>> インタラクトインターフェース +フォーカスイン・アウト() +クリック() + インタラクト() +インタラクトイベント() +名前の表示() +名前の削除() +テキストの表示() +テキストの削除() +テキストの設定() +自殺の設定() インタラクトオブジェクト基底クラス +インタラクト対象の名前 +インタラクト時に表示するテキスト +自殺できるかどうか - オブジェクトのビルボード() インタラクトアクタークラス - インタラクトカウンタ() スタートクラス - アクターズクラスの有効化() ドアクラス - ドア解放() エンディングクラス - エンディング()
  9. 9. 21のクラス図 インタラクトアクタークラス - インタラクトカウンタ() 21ではこのクラスのBP(InteractTextActor_BP)を複製して 「インタラクト対象の名前」と「インタラクト時に表示するテキスト」 だけを書き換えている
  10. 10. 21のクラス図 インタラクトオブジェクト基底クラス +インタラクト対象の名前 +インタラクト時に表示するテキスト +自殺できるかどうか - オブジェクトのビルボード() クラスの変数を「パブリック」指定したものだけが「詳細>デフォルト」枠に表示される。 21では基底クラスの変数を「パブリック」指定している
  11. 11. インターフェースと抽象クラスの復習 ※「21」では抽象クラスは作っていません 項目 インターフェース 抽象クラス 関係 「インターフェース」と「実装クラス」 「抽象クラス」と「派生クラス」 実装 強制(実装しないとエラー) 強制(実装しないとエラー) 関数実装 不可 可能 アクセス修飾子 public public, protected 概要 「端末」の「電話」や「カメラ」関数定義 - 実装対象の「最低限持つべき機能(型)」 「端末」インターフェースを継承した関数に 加えて独自の関数定義 - 実装対象の「拡張(派生)機能(クラス)」 (個人的な) 階層イメージ パターン例 ・インターフェース -> 抽象クラス(インターフェース機能実装、派生定義) -> 派生機能実装 ・インターフェース -> 機能実装 ・抽象クラス -> 機能実装 イメージ例 ・インターフェース:電話、カメラ、CD読み込み、USB読み込み ・抽象クラス:携帯 →インターフェース継承による機能実装に加え、独自の機能定義 ・派生クラス:Android, iPhone → 個別の機能実装
  12. 12. UE4のインターフェース 1. 未実装でもエラーは吐かない • 単に内部で「処理されない」で終わるようになっている模様 2. 実装は「イベント」か「関数」タイプになる • Output, Const指定されているものが関数タイプになる 3. アクターに対して関数を呼ぶ際にキャストが不必要 • クラス間の依存を低くできる • 例えば、衝突時に呼ばれる「Event ActorBeginOverlap」で渡されるアクター情報に対して、 呼びたいインターフェース関数を呼ぶだけでよい
  13. 13. インターフェースを使ってみる
  14. 14. インターフェースを使ってみる 1. インターフェース「Ihoge_BP」を作る ← [+関数]ボタンで関数を追加
  15. 15. インターフェースを使ってみる 2. 呼び出すアクター「InterfaceCall_BP」と呼び出されるアクター「InterfaceHoge_BP」を作る 「クラス設定」 >「インターフェース」の[追加▼]で、 先ほど作成したインターフェースを割り当てる 「InterfaceHoge_BP(呼び出されるアクター)」のクラス設定
  16. 16. インターフェースを使ってみる 3. 実装してワールドに置く。インターフェース呼び出しのノードには右上に「手紙」アイコンが付く 呼び出しには 「メッセージ」を選択 呼び出し側 呼び出され側 実行時に左上に「Call Interface」の文字が出ていれば成功! ※今回直接アクターを検索して呼び出したが、 「Event ActorBeginOverlap」等から得たアクター情報から 呼び出してもOK
  17. 17. イベントディスパッチャー
  18. 18. イベントディスパッチャー • 複数存在するイベントを一つに結合(バインド)して一度に呼び出す仕組み • 要はデリゲート • 「詳細」>「インプット」から各イベントへ変数を送る設定を行うことが可能 • データフローがBPクラス内だけでなく、BPクラスとレベルBP間でも可能になる ↓普通にデリゲートって書いてある
  19. 19. アクター(以後イベントアクターと呼称)等を経由してアクターからレベルBPや他BPへイベントの発火ができる 1. イベントディスパッチャーを持つイベントアクターに対してレベルBPやアクターBP等がイベントをバインドする 2. イベントアクターが「イベントディスパッチャーの呼び出し」を行う 3. 呼び出されたイベントディスパッチャーに紐づけされた各BPのイベントが発火する イベントディスパッチャー バインド イベント発火 バインド イベント発火 バインド イベント発火 イベントアクターBP (ED持ち) レベルBP アクターBP ウィジェットBP イベントアクターBP側はこのノード を呼び出すだけで良い
  20. 20. イベントディスパッチャーを使ってみる
  21. 21. イベントディスパッチャーを使ってみる 1. イベントアクターBP(EventActor_BP)を作成する 右クリック > 「ブループリント クラス」 を選択 親クラスは「Actor」 [+]ボタンでディスパッチャーを追加
  22. 22. イベントディスパッチャーを使ってみる 1. イベントアクターBP(EventActor_BP)を作成する 「イベントディスパッチャー」からD&D もしくは検索から「呼び出す」を選択 「呼び出し」の「イベントディスパッチャー」 には「手紙」マークがついている
  23. 23. イベントディスパッチャーを使ってみる 2. アクターBP(DispatcherTestActor_BP)を作成する
  24. 24. イベントディスパッチャーを使ってみる 3. ウィジェットBP(DispatcherTestWidget_BP)を作成する
  25. 25. イベントディスパッチャーを使ってみる 4. レベルBPを作る
  26. 26. イベントディスパッチャーを使ってみる 4. レベルBPを作る DispatcherTestWidget_BPをカメラに適用する
  27. 27. イベントディスパッチャーを使ってみる 5. 実行してみる 同時に「アクター」「ウィジェット」「レベル」の処理が呼ばれていれば成功!
  28. 28. 参考 • UE4 イベント・関数・マクロ・インターフェイスの違いと使い分け http://katze.hatenablog.jp/entry/2016/12/18/000000 • [UE4] Blueprint Interfaceを使って依存度を下げる http://monsho.blog63.fc2.com/blog-entry-130.html • インターフェースクラスと抽象クラスについて http://atsushi4.hateblo.jp/entry/2014/12/16/055939 • インターフェースと抽象クラスの使い分け、活用方法 http://qiita.com/IganinTea/items/e1d35db0a14a84bda452 • UnrealEngine4リファレンス ブループリント インターフェース https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/Types/Interface/index.html • UnrealEngine4リファレンス ブループリント インターフェースの実装 https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/Types/Interface/UsingInterfaces/index.html • UnrealEngine4リファレンス イベントディスパッチャー https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/EventDispatcher/index.html • UnrealEngine4リファレンス イベントディスパッチャーの作成 https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/EventDispatcher/CreatingEvents/index.html

×