てふノート

てふたろうの考えてること

【クリックを検知】てふメモ その弐 EventTriggerが便利【Unity】

おはようございます、てふたろうです。

昨日に引き続きまたメモを書きます

 

 

今回は「クリックを検知する」スクリプトを書きました。

この手のスクリプトは何度か書いたことがあるのですが、EventTriggerなるものが使えると知り今までの苦労は何だったのかという話。

 

 

とりあえずやることはこれ、

 
f:id:tefutarou:20190321164423g:plain


 
クリックされたオブジェクトの名前を返すようにしていますが、
基本的には何らかのアクションを加える形になります。




そんで上やつの
右が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のコンポーネントの解説からする

f:id:tefutarou:20190321173519p:plain

 
上記のコンポーネントが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 に呼び出されます。




トリガーを選んだらあとは下のように、スクリプトをぶちこんで
呼び出したい関数を選択すれば完了。


f:id:tefutarou:20190321173528p:plain

 
圧倒的に楽。

 
RayはRayでそれなりに使うからクリック検知するならこっちの方が混同しなくていいね






あとがき

 
結構雑だけど僕個人がわかればいいと思ってるところはまあある。
なので許して下さい



 
次はドラッグによる回転、もしくは別の何かでお会いしましょう




steamcommunity.com