かさたな日記

主にUnityを使った制作記録。書いてる人は初心者です。一緒に頑張ろう。

自分用Unityメモ:タップした場所がuGUI上か調べる

タップやスワイプ、ドラッグをした時に何か動作をさせたい、
でも押した場所にボタンとかがあったら反応して欲しくない、
そんな感じの時に使うメソッド。

 ※ちょっと修正。
そもそもEventSystemが置かれてないときの処理を追加しました。

using UnityEngine.EventSystems;
//↑この名前空間を使うよ、と言っておく。


    //タップした先にあるものを入れるリスト。
    // 今回はコストが気になるのでフィールドにするよ
    // あんまり頻繁に判定しないならメソッドの中に入れてもいいよ
    private List<RaycastResult> raycastResults = new List<RaycastResult>();

    public bool IsPointerOnUGUI(Vector2 screenPosition)
    {
        // EventSystemがない = uGUIがないときは遮るものがないので処理そのものをさせないよ
    if (EventSystem.current == null) { return false; }

        // EventSystemにタップした座標を設定するよ
        PointerEventData eventDataCurrent = new PointerEventData(EventSystem.current);
        eventDataCurrent.position = screenPosition;

        // タップ地点の先にあるものを調べるためにRayCastするよ
        EventSystem.current.RaycastAll(eventDataCurrent, raycastResults);
        bool result = raycastResults.Count > 0;

        raycastResults.Clear(); //リセットしておくよ
        return result;
    }

引数には タップの時はInput.GetTouch(0).position、
マウスの操作の時は Input.mousePosition を入れればOK...のハズ。

Textなど、タップを遮らなくていいUIは Raycast Targetのチェックを外しておけば大丈夫。


シングルトンやstaticなメソッドにしておいてどこからでも呼べると便利かもしれません。

自分用Unityメモ:クラスをシリアライズしてインスペクタから編集

クラスをシリアライズすることで
インスペクタから内容を直接編集することが出来るみたい。

やり方はシリアライズしたいクラスの前に

[System.Serializable]

を付けるだけ。

public class Test : MonoBehaviour


       public List<hoge> hogeList = new List<hoge>();

        [System.Serializable]
        public class hoge
        {
            public string key;
            public int value;
        }

}


上の例ではListになったhogeクラスの内容を
インスペクタから設定することが出来るようになります。

現在unityではDictionaryはインスペクタに対応してないみたいですが、
これを使えば疑似的にDictionaryっぽい使い方もできそうです。
ちょっと回りくどいケド...

public int GetHogeValue(string key)
{
    return hogeList.Find(x => x.key == key).value;
}

こんな感じで中身を持って来れます。
ただ、クラスの中に要素が多い場合はクラスそのものを取得した方が良さそうです。


パフォーマンスは...どうだろうか...

そろそろデザイン画をお届けせねば。
タスク的に休日返上になるけど、まだ平気さ。