【クリックを検知】てふメモ その弐 EventTriggerが便利【Unity】
おはようございます、てふたろうです。
昨日に引き続きまたメモを書きます
今回は「クリックを検知する」スクリプトを書きました。
この手のスクリプトは何度か書いたことがあるのですが、EventTriggerなるものが使えると知り今までの苦労は何だったのかという話。
とりあえずやることはこれ、
クリックされたオブジェクトの名前を返すようにしていますが、
基本的には何らかのアクションを加える形になります。
そんで上やつの
右がRaycastによるもの
左がEventTriggerによるもの
です。では解説どうぞ
Raycastを用いた検知方法のメモ
Raycastというのは空間にビームを飛ばしてそれをトリガーになにやらするっていうやつ。
結構使う機会の多いイメージがありますね、直感的にわかりやすいですし
これが書いたやつ
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SceneManager : MonoBehaviour { public string cubeTag = "Cube"; GameObject ClickedObject; void Update() { if(Input.GetMouseButton(0)) { Ray ray = new Ray(); RaycastHit hit = new RaycastHit(); ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray.origin,ray.direction,out hit,Mathf.Infinity)) { if(hit.collider.gameObject.CompareTag(cubeTag)) { ClickedObject = hit.collider.gameObject; Debug.Log(ClickedObject+"をクリックしました"); } } else { Debug.Log("null click"); } } } }
クリックしたものをタグで判別し、それに応じてLogを返すやつ
ポイントは、RaycastとInput
Inputは割愛する
RayCast
Rayを作る
Ray ray = new Ray(transform.position,transform.forward);
Ray(Rayの原点、Rayの方向)
マウスを使うならこれ、ゲーム画面からRayを飛ばせるやつ
Ray ray = Camera.mai.ScreenPointToRay(Input.mouseposition);
Rayの衝突
RaycastHit hit; Physics.Raycast(Ray ray,out hit,5f,int layerMask);
boolと同じく、Physics.Raycastはtrueかfalseを返す。
RaycastHitはオブジェクトを格納する箱。
まとめると、(Ray、オブジェクト、距離、レイヤー)
距離はデフォがMathf.Infinityで、レイヤーはIgnore Raycast;
当然、衝突判定にはColliderが必要。
その他
//【衝突したオブジェクト全部を検知】 RaycastHit[] hits; Physics.RaycastAll(Ray ray,5f,int layerMask); //【Rayを描画する】 Ray ray = new Ray(); Debug.DrawRay(ray.origin,ray.direction,Color.white,float 60f,/*bool depthTest=*/true); //rayを白で60秒間、オブジェクトの下に表示
これで、「衝突を検知してCubeなら名称を返す」が書ける。
EventTriggerのメモ
EventTriggerは
using UnityEngine.EventSystems;
を置かないと動かない。これ忘れてずっと頭抱えてました
そんで書いたのはこれだけ、上のRayと同じことをしてるけど圧倒的効率で感動した
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class Event : MonoBehaviour { GameObject ClickObject; public void click() { ClickObject = this.gameObject; Debug.Log(ClickObject + "をクリックしました"); } }
とりあえず、EventTriggerのコンポーネントの解説からする
上記のコンポーネントがEventTriggerで、オブジェクトにアタッチするだけで使える。
トリガーとして検知できるのは、以下のこれ。Unityスクリプトリファレンス参照。
- OnBeginDrag
ドラッグが始まる前に呼び出されます。
- OnCancel
Cancel イベントが発生すると、EventSystem に呼び出されます。
- OnDeselect
新しオブジェクトが選択されると、EventSystem に呼び出されます。
- OnDrag
ドラッグする間にポインターが移動するたびに、EventSystem に呼び出されます。
- OnDrop
オブジェクトがドロップを取得すると、EventSystem に呼び出されます。
- OnEndDrag
ドラッグが終了すると、EventSystem に呼び出されます。
- OnInitializePotentialDrag
ドラッグが感知された時ではなく、ドラッグ開始が有効になる前に BaseInputModule は呼び出されます。
- OnMove
Move イベントが発生すると、EventSystem に呼び出されます。
- OnPointerClick
Click イベントが発生すると、EventSystem に呼び出されます。
- OnPointerDown
PointerDown イベントが発生すると、EventSystem に呼び出されます。
- OnPointerEnter
ポインターがこの EventTrigger に関連したオブジェクトに入るとき、EventSystem に呼び出されます。
- OnPointerExit
ポインターがこの EventTrigger に関連したオブジェクトを出るとき、EventSystem に呼び出されます。
- OnPointerUp
PointerUp イベントが発生すると、EventSystem に呼び出されます。
- OnScroll
Scroll イベントが発生すると、EventSystem に呼び出されます。
- OnSelect
Select イベントが発生すると、EventSystem に呼び出されます。
- OnSubmit
Submit イベントが発生すると、EventSystem に呼び出されます。
- OnUpdateSelected
この EventTrigger に関連するオブジェクトが更新されると、EventSystem に呼び出されます。
トリガーを選んだらあとは下のように、スクリプトをぶちこんで
呼び出したい関数を選択すれば完了。
圧倒的に楽。
RayはRayでそれなりに使うからクリック検知するならこっちの方が混同しなくていいね