質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

1回答

6685閲覧

IPointerClickHandlerを実装してクリックのイベントを取得したい

AppMomiji

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2017/11/28 23:54

編集2022/01/12 10:55

ボタンのクリックイベントを取得するためにUIのボタンにBoxCollider2DとIPointerClickHandlerを実装したクラスをアタッチしたGameObjectを配置しているのですが、どうもクリックだと(そもそもRayとオブジェクトの衝突が判定されていないっぽい)判定されません。

■やっていること
・Cameraをアタッチ(UIを描写する用)

C#

1 var cameraObject = new GameObject("UICamera"); 2 var camera = cameraObject.AddComponent<Camera>(); 3 camera.useOcclusionCulling = false; 4 camera.eventMask = 0; 5 camera.orthographic = true; 6 camera.orthographicSize = 5; 7 camera.nearClipPlane = -10.0f; 8 camera.clearFlags = CameraClearFlags.Depth; 9 Object.DontDestroyOnLoad(cameraObject);

・CameraをアタッチしているオブジェクトにPhysics2DRaycasterをアタッチ

・カメラとは別のオブジェクトに以下をアタッチ
EventSystem
StandaloneInputModule

・Canvas配下にボタンを設置

■確認していること
・Physics2DRaycasterを継承しRaycastの中でDrawRayをさせてRayが飛んでいるか確認。配置したボタンに当たっていることも確認。
・Physics2D.GetRayIntersectionAll(ray, distance, finalEventMask)の返り値でRaycastHit2Dは0個。

C#

1 RaycastHit2D[] rayCastHits = Physics2D.GetRayIntersectionAll(ray, distance, finalEventMask);

・EventSystemのインスペクターではクリックはとれている模様(クリックすると画像のeligibleForClickはTrueになる)、Objectの検知まではできていない?
pointerEnterやpointerPressといったところに通常であればObjectが記載される
イメージ説明

■動作環境
Unity5.6.1

■追記
理由としましたは、以下速度と汎用性の2点ございます。

・速度
クリックされてから反応するまでの速度に懸念があるからです。
Buttonコンポーネンの場合、IPointerClickHandlerを実装していますのでこのインターフェイスを継承している点
それをOnPointerClickでEventDataを受け取るところまでは同じなのですが、Buttonの場合Delegateを宣言したクラスのインスタンスに処理を移譲する形でクリックのイベントをとってます。
ですので、Updtateで常にクリック状態をチェックしていたほうが反応は早いと考えました。
ただButtonクラスはvirtualとしてOnPointerClick関数を用意しているのでButtonクラスをそのまま継承したクラスを実装しても同じ結果が得られるかもしれません。

*ただ、ここまでイベントがとれているのであればButtonクラスを使ったものとそうでないもの両方でイベント通知が来なくてはしっくりきませんが。

・汎用性
ButtonクラスはIPointerClickHandlerしか実装していないため他の通知を取得したい場合に少し不便だと思いました。
具体的には下記のようなものです。この中でドラッグの判定がとれないのは大きいかもしれません。

, IPointerUpHandler , IPointerDownHandler , IPointerEnterHandler , IPointerExitHandler , IDragHandler , IEndDragHandler

以上となります。
よろしくお願いします。

以上です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2017/11/29 07:23

そもそも、通常の方法(ButtonのOn Click()に実行したい関数を登録する)を取らない理由は何なのでしょうか?
AppMomiji

2017/11/29 10:06

ご連絡頂きありがとうございます。理由を追記致しました。
guest

回答1

0

「汎用性」についてですが、Buttonクラスと同じオブジェクトに以下のようなスクリプトをアタッチするだけで、ドラッグなどの取得が出来るようになります。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5 6public class ButtonEvent : MonoBehaviour, IDragHandler, IPointerUpHandler 7{ 8 public void OnDrag(PointerEventData data) 9 { 10 Debug.Log("OnDrag"); 11 } 12 13 public void OnPointerUp(PointerEventData data) 14 { 15 Debug.Log("OnPointerUp"); 16 } 17}

また、「速度」についても気になるほどの差は出ないと思います。
「処理を移譲する」といっても、すでに存在するオブジェクトの処理を呼び出すだけなので。

むしろ、処理を追加したことによって、処理が遅くなる可能性すらあります。
Standard Assetsのスマホ向けコントローラーUIでも、UIやEventTriggerの機能を使っているので、Unity公式でそのようなことをしている以上、わざわざ質問文の処理を書く必要性は薄いと思います。

投稿2017/11/29 14:23

編集2017/11/30 01:19
fiveHundred

総合スコア9778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問