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.

EventSystemまわりの話@UnityFukuoka07

18,482 views

Published on

UnityFukuoka07発表資料
EventSystemまわりについてデモを交えて説明します

Published in: Engineering
  • Be the first to comment

EventSystemまわりの話@UnityFukuoka07

  1. 1. EventSystemまわりの話 k_nagamine @ Jollystics Inc.
  2. 2. 自己紹介 • 長峰慶三 @KzoNag • Jollystics Inc. • コンシューマ系ゲーム会社→現職 • Unity / Xamarin • C#
  3. 3. 今日話すこと • EventSystem, InputModule, Raycaster • IEventSystemHandler • UnityEvent
  4. 4. *注意 • 個人の調査・経験・感覚で話します • 正確じゃないこともあるかもしれません • 間違ってたら教えてください
  5. 5. EventSystem
  6. 6. UIオブジェクトを作ると出てくるやつ
  7. 7. EventSystem • http://docs.unity3d.com/ja/current/Manual/ EventSystem.html • 入力をうまく処理してオブジェクトにイベン トを送信する仕組み
  8. 8. 入力制御といえばInputクラス void Update() { if(Input.GetMouseButtonDown(0)) { Debug.Log(“マウスの左ボタンが押された”); } }
  9. 9. Inputクラスを使うと管理が大変 • マウスとタッチの管理 • 入力の状態を自分で保持して管理 • どのオブジェクトがクリックされたか • 3Dと2Dオブジェクトの違い
  10. 10. EventSystemは そのあたりをいいかんじに 管理してくれる
  11. 11. EventSystemの構成 • EventSystem • InputModule • Raycaster
  12. 12. InputModule • 毎フレーム入力(Inputクラス)を監視 • 特定の条件を満たしたらオブジェクトにイベントを発行
 (例)クリックイベントなど • デフォルトでStandalone,Touchがある
 →マウスとタッチを気にしなくていい • カスタムモジュールを実装可能
 →Oculusなどの特殊な入力デバイスに対応するとか
  13. 13. Raycaster • どのオブジェクトがイベントの対象になるか • InputModuleから使用される • GraphicRaycaster : UI, Canvasにアタッチ • PhysicsRaycaster : Collider(3D), Cameraにアタッチ • Physics2DRaycaster : Collider2D, Cameraにアタッチ
  14. 14. EventSystem • 複数のInputModuleとRaycasterを保持・管理 • (選択中のオブジェクトの管理)
  15. 15. デモ
  16. 16. カスタマイズ • InputModuleとRaycasterを実装して拡張可能 • たとえばMultiTouchInputModuleとか? • デフォルトクラスのソースコードを参考に • Unity 4.6 から利用できる UI での EventSystem をカス タムする方法について調べてみた
 http://tips.hecomi.com/entry/2014/09/25/233823
  17. 17. IEventSystemHandler
  18. 18. オブジェクトにイベントを 送信するって?
  19. 19. 特定のオブジェクトに対してあるメソッド を実行するように投げたい
 
 (例)クリックされたら OnClickメソッドを呼び出す
  20. 20. SendMessageがあるじゃん! void Update() { if(targetがクリックされたら) { target.SendMessage(“OnClick”, target.name); } } void OnClick(string name) { Debug.Log(name + “がクリックされたよ!”); }
  21. 21. SendMessageこわい • 文字列で指定
 →呼び出し関係が分かりにくくて追いにくい
 →変更に弱い
 →パフォーマンス悪そう?
  22. 22. IEventSystemHandler • SendMessageの問題点を解消 • インターフェースを利用した明示的な定義
  23. 23. IEventSystemHandler • あるメソッドをもつインターフェースを定義 • イベントを受け取りたいコンポーネントでインター フェースを実装 • 送信元は送信先オブジェクトとインターフェースを指 定してイベント送信 • インターフェースを実装するすべてのコンポーネント が反応してメソッド実行
  24. 24. IEventSystemHandler public interface ICustomEventHandler : IEventSystemHandler
 {
 void OnReceiveEvent (CustomEventData eventData);
 }
 
 public class CustomEventReceiver : MonoBehaviour, ICustomEventHandler
 {
 public void OnReceiveEvent (CustomEventData eventData)
 {
 Debug.Log (“OnReceive”);
 }
 }
  25. 25. IEventSystemHandler 
 public class CustomEventSender : MonoBehaviour
 {
 public GameObject receiver; void Send()
 {
 ExecuteEvents.Execute<ICustomEventHandler> (receiver, null, 
 (_handler, _eventData) => 
 {
 _handler.OnReceiveEvent((CustomEventData)_eventData); 
 } );
 }
 }

  26. 26. デモ
  27. 27. メッセージングシステム • SendMessageは手軽だけど怖い • IEventSystemHandlerは手間だけど安心
  28. 28. EventSystemでのイベント • IEventSystemHandlerの仕組みを利用 • 多くのインターフェイスが用意されている • インターフェースを実装したコンポーネント を付ければイベントを受け取れる
  29. 29. デモ
  30. 30. UnityEvent
  31. 31. インスペクターで メソッド指定
  32. 32. ありそうなパターン • インスペクターでメソッド名を文字列指定 • SendMessageでメソッド呼び出し public string clickMethod; void Update() { if(targetがクリックされたら) { target.SendMessage(clickMethod, target.name); } }
  33. 33. SendMessageこわい • 文字列で指定
 →呼び出し関係が分かりにくくて追いにくい
 →変更に弱い
 →パフォーマンス悪そう?
  34. 34. こういうのある気がする!
  35. 35. UnityEvent • C#のeventみたいなイメージ • インスペクターで設定可能 • ソースからの追加・削除も可能 • UI関連で使われてる
  36. 36. UnityEvent • UnityEventを継承したSerializableなクラスを定義 • 引数は4つまで • 静的コール:インスペクターで指定した引数が渡 される • 動的コール:コードで実行時の引数が渡される
  37. 37. UnityEvent public class MouseEventExecuter : MonoBehaviour 
 {
 [System.Serializable]
 public class MouseEvent : UnityEvent<Vector3>{}
 
 public MouseEvent onMouseDown;
 void Update () 
 {
 if (Input.GetMouseButtonDown (0)) 
 {
 onMouseDown.Invoke (Input.mousePosition);
 }
 }
 }
 

  38. 38. デモ
  39. 39. 利用例 “InputBehaviour” • EventSystemからのイベントをもろもろ受け 取れるInputBehaviour • 必要なメソッドだけoverrideして定義 • インスペクターで指定することも可能
  40. 40. デモ
  41. 41. まとめ • EventSystemは入力をいいかんじで制御してく れる仕組み • EventSystem,InputModule,Raycasterで構成 • インターフェースベースのメッセージング • UnityEventを利用したメソッド定義
  42. 42. まとめ EventSystem,InputModule,Raycaster IEventSystemHandler UnityEvent 汎用的に使える仕組み 利用
  43. 43. ドキュメント • イベントシステム
 http://docs.unity3d.com/ja/current/Manual/ EventSystem.html • UnityEvent 
 http://docs.unity3d.com/ja/current/Manual/ UnityEvents.html • UI関連ソースコード
 https://bitbucket.org/Unity-Technologies/ui
  44. 44. 参考 • Unity 4.6 から利用できる UI での EventSystem をカスタ ムする方法について調べてみた
 http://tips.hecomi.com/entry/2014/09/25/233823 • SendMessageに変わる新しいメッセージシステム
 http://tsubakit1.hateblo.jp/entry/2015/04/13/010645 • Unityの新GUI、UGUIのイベント制御について
 http://tsubakit1.hateblo.jp/entry/2014/12/23/233000
  45. 45. 発表資料 • スライド
 http://www.slideshare.net/KeizoNagamine/ event-system • ソースコード
 https://github.com/KzoNag/ UnityEventSystem

×