【gotanda.unity #7】uGUIのインプット拡張してる?
by
kase
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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
ありがとうございました 懇親会、ぜひ話しかけてね!