Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
EventSystemまわりの話
k_nagamine @ Jollystics Inc.
自己紹介
• 長峰慶三 @KzoNag
• Jollystics Inc.
• コンシューマ系ゲーム会社→現職
• Unity / Xamarin
• C#
今日話すこと
• EventSystem, InputModule, Raycaster
• IEventSystemHandler
• UnityEvent
*注意
• 個人の調査・経験・感覚で話します
• 正確じゃないこともあるかもしれません
• 間違ってたら教えてください
EventSystem
UIオブジェクトを作ると出てくるやつ
EventSystem
• http://docs.unity3d.com/ja/current/Manual/
EventSystem.html
• 入力をうまく処理してオブジェクトにイベン
トを送信する仕組み
入力制御といえばInputクラス
void Update()
{
if(Input.GetMouseButtonDown(0))
{
Debug.Log(“マウスの左ボタンが押された”);
}
}
Inputクラスを使うと管理が大変
• マウスとタッチの管理
• 入力の状態を自分で保持して管理
• どのオブジェクトがクリックされたか
• 3Dと2Dオブジェクトの違い
EventSystemは
そのあたりをいいかんじに
管理してくれる
EventSystemの構成
• EventSystem
• InputModule
• Raycaster
InputModule
• 毎フレーム入力(Inputクラス)を監視
• 特定の条件を満たしたらオブジェクトにイベントを発行

(例)クリックイベントなど
• デフォルトでStandalone,Touchがある

→マウスとタッチを気にしなくて...
Raycaster
• どのオブジェクトがイベントの対象になるか
• InputModuleから使用される
• GraphicRaycaster : UI, Canvasにアタッチ
• PhysicsRaycaster : Collider(3...
EventSystem
• 複数のInputModuleとRaycasterを保持・管理
• (選択中のオブジェクトの管理)
デモ
カスタマイズ
• InputModuleとRaycasterを実装して拡張可能
• たとえばMultiTouchInputModuleとか?
• デフォルトクラスのソースコードを参考に
• Unity 4.6 から利用できる UI での Eve...
IEventSystemHandler
オブジェクトにイベントを
送信するって?
特定のオブジェクトに対してあるメソッド
を実行するように投げたい



(例)クリックされたら
OnClickメソッドを呼び出す
SendMessageがあるじゃん!
void Update()
{
if(targetがクリックされたら)
{
target.SendMessage(“OnClick”, target.name);
}
}
void OnClick(stri...
SendMessageこわい
• 文字列で指定

→呼び出し関係が分かりにくくて追いにくい

→変更に弱い

→パフォーマンス悪そう?
IEventSystemHandler
• SendMessageの問題点を解消
• インターフェースを利用した明示的な定義
IEventSystemHandler
• あるメソッドをもつインターフェースを定義
• イベントを受け取りたいコンポーネントでインター
フェースを実装
• 送信元は送信先オブジェクトとインターフェースを指
定してイベント送信
• インターフェ...
IEventSystemHandler
public interface ICustomEventHandler : IEventSystemHandler

{

void OnReceiveEvent (CustomEventData ev...
IEventSystemHandler


public class CustomEventSender : MonoBehaviour

{

public GameObject receiver;
void Send()

{

Execu...
デモ
メッセージングシステム
• SendMessageは手軽だけど怖い
• IEventSystemHandlerは手間だけど安心
EventSystemでのイベント
• IEventSystemHandlerの仕組みを利用
• 多くのインターフェイスが用意されている
• インターフェースを実装したコンポーネント
を付ければイベントを受け取れる
デモ
UnityEvent
インスペクターで
メソッド指定
ありそうなパターン
• インスペクターでメソッド名を文字列指定
• SendMessageでメソッド呼び出し
public string clickMethod;
void Update()
{
if(targetがクリックされたら)
{
ta...
SendMessageこわい
• 文字列で指定

→呼び出し関係が分かりにくくて追いにくい

→変更に弱い

→パフォーマンス悪そう?
こういうのある気がする!
UnityEvent
• C#のeventみたいなイメージ
• インスペクターで設定可能
• ソースからの追加・削除も可能
• UI関連で使われてる
UnityEvent
• UnityEventを継承したSerializableなクラスを定義
• 引数は4つまで
• 静的コール:インスペクターで指定した引数が渡
される
• 動的コール:コードで実行時の引数が渡される
UnityEvent
public class MouseEventExecuter : MonoBehaviour 

{

[System.Serializable]

public class MouseEvent : UnityEven...
デモ
利用例 “InputBehaviour”
• EventSystemからのイベントをもろもろ受け
取れるInputBehaviour
• 必要なメソッドだけoverrideして定義
• インスペクターで指定することも可能
デモ
まとめ
• EventSystemは入力をいいかんじで制御してく
れる仕組み
• EventSystem,InputModule,Raycasterで構成
• インターフェースベースのメッセージング
• UnityEventを利用したメソッド定義
まとめ
EventSystem,InputModule,Raycaster
IEventSystemHandler UnityEvent
汎用的に使える仕組み
利用
ドキュメント
• イベントシステム

http://docs.unity3d.com/ja/current/Manual/
EventSystem.html
• UnityEvent 

http://docs.unity3d.com/ja/c...
参考
• Unity 4.6 から利用できる UI での EventSystem をカスタ
ムする方法について調べてみた

http://tips.hecomi.com/entry/2014/09/25/233823
• SendMessage...
発表資料
• スライド

http://www.slideshare.net/KeizoNagamine/
event-system
• ソースコード

https://github.com/KzoNag/
UnityEventSystem
EventSystemまわりの話@UnityFukuoka07
Prochain SlideShare
Chargement dans…5
×

EventSystemまわりの話@UnityFukuoka07

19 023 vues

Publié le

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

Publié dans : Ingénierie
  • Soyez le premier à commenter

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

×