Slide 1

Slide 1 text

uGUIのインプット拡張してる? Gotanda.unity #7 かせ @KaseliaePenguin

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

がっつりエンジニア向けの話です 詰め込んでます、ごめんね

Slide 4

Slide 4 text

EventSystemsって知ってますか? タップやドラッグの判定を管理しています uGUIの各コンポーネントに対して通知を送ってくれます Canvasを作成すると自動で作られます

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

通知について・1 Canvas以下に存在するオブジェクトの、Graphicクラスを見て通知を送ります Graphicクラスは uGUI用の基底クラスです

Slide 7

Slide 7 text

通知について・2 Graphicクラスには RaycastTarget というプロパティがあります RaycastTarget がtrueの時、オブジェクトに対して通知が送られます

Slide 8

Slide 8 text

Imageコンポーネントの例

Slide 9

Slide 9 text

uGUIのButtonってどういう仕組み?

Slide 10

Slide 10 text

生成するとこんな感じ

Slide 11

Slide 11 text

Buttonとは Graphicクラスを継承したImageコンポーネントのRaycastTargetがtrueの時 オブジェクトに対して送られてくる OnPointerDown という通知を使ってクリックされた判定を取っているのです

Slide 12

Slide 12 text

じゃあ自分のクラスで通知受け取りたいよ! っていう話の前に 本当に通知の仕組みが合っているのか確かめてみよう

Slide 13

Slide 13 text

ImageのRaycastTargetをオフに・・・

Slide 14

Slide 14 text

おん?

Slide 15

Slide 15 text

ヒエラルキーを見てみる Buttonの子供になんかいますね

Slide 16

Slide 16 text

Textを見てみる

Slide 17

Slide 17 text

1.親子関係のあるオブジェクトで 2.子供もGraphicクラスを持っていて 3.子供のRaycastTargetがtrueで 4.子供が通知を受け取る仕組みを持っていなかった場合

Slide 18

Slide 18 text

通知は親に対してブロードキャストされます!!! 気を付けよう

Slide 19

Slide 19 text

ここまで前置きなんです。。。

Slide 20

Slide 20 text

OnPointerDown Graphic領域内をタップ 、クリックすると通知される

Slide 21

Slide 21 text

OnPointerUp OnPointerDownが通知された後 指を離すと通知される オブジェクトが非アクティブの時は通知されない

Slide 22

Slide 22 text

OnPointerEnter Graphic領域内に触っている判定が入ると通知される スマホとかはドラッグした時とか、領域内をタップしたとき PCはカーソルがフォーカスしてるかどうか

Slide 23

Slide 23 text

OnPointerExit Graphic領域外に出た時に通知される(色々略)

Slide 24

Slide 24 text

OnInitializePotentialDrag Graphic領域内で、タップされた際に通知される OnPointerDownと同じタイミング

Slide 25

Slide 25 text

OnBeginDrag Graphic領域内で EventSystemsのDrag Thresholdの値以上 ドラッグすると通知される

Slide 26

Slide 26 text

OnDrag OnBeginDragが呼ばれた後 指を動かすと毎回通知される

Slide 27

Slide 27 text

OnEndDrag Drag中に指を離すと通知される オブジェクトが非アクティブだと通知されない

Slide 28

Slide 28 text

他にもいろいろあるんじゃが この世界で生まれいづる仕様は ほぼ全てこれでカバーできるじゃろう

Slide 29

Slide 29 text

自分のクラスでそれ受け取りたいよ

Slide 30

Slide 30 text

PointerEventData 通知の引数で渡ってくる ユニークなタップIDやポジションの情報が入っている

Slide 31

Slide 31 text

拡張したら何ができる? ボタンの長押し 複数ボタンにまたがる連打防止 ドラッグするとバナーとかが切り替わるアレ ゲームパッドのインプットとスマホのインプット機能の共通化 etc

Slide 32

Slide 32 text

ここから拡張トラブル実例集

Slide 33

Slide 33 text

OnPointerDown中に他の指でタップされる 同じ領域を他の指でタップされるとOnPointerDownが二回走る PointerEventDataのpointerIdをキャッシュ 処理の最初でバリデーションして弾こう

Slide 34

Slide 34 text

非アクティブ中に指を離す or 離さない 長押し機構とか作って、ある程度数値上昇させたら非アクティブにするとか 非アクティブ中に離すとOnPointerUpとOnEndDragが呼ばれない 非アクティブ -> 再度アクティブで指を押しっぱなしにすると呼ばれる

Slide 35

Slide 35 text

非アクティブ中に指を離す or 離さない 非アクティブになったらOnDisableで初期化する 押しっぱなしで再度アクティブになるとOnDragなどが走るので 非アクティブ初期化が走っていたら復帰処理をする

Slide 36

Slide 36 text

ドラッグ中にアプリがバックグラウンドに OnEndDragが呼ばれない OnApplicationPauseでドラッグを強制終了させる Unity 2018.2から呼ばれるようになるらしい 対応してたら気を付けろ

Slide 37

Slide 37 text

RaycastTargetを切っても通知が来る 通知のブロードキャストのせい 拡張クラスのAwakeで子供のGraphicコンポーネントを検索して RaycastTargetを切る

Slide 38

Slide 38 text

動的に子オブジェクトを追加する Graphic.RaycastTargetの初期値はtrue 都度RaycastTargetは切る

Slide 39

Slide 39 text

時間がないので ここまで!

Slide 40

Slide 40 text

もっと話せること EventSystemにくっついてくるInputModuleを拡張する ScrollRectをベースに拡張して音ゲーのセレクト画面ぽいのを作る etc

Slide 41

Slide 41 text

ありがとうございました 懇親会、ぜひ話しかけてね!