QA@IT

unity 3分岐のボタンが2分岐分しか反応しない(Event Triggerの問題?)

893 PV

初心者です。以下のようにスマホでもエディタ上でもタッチやクリックで反応するプログラムを作りボタンオブジェクトにアタッチしました。

そして、ボタンオブジェクトにEventTriggerもアタッチし、AddNewEventTypeからPointerDownとPointerUpとPointerEnterを追加しました。

それぞれにオブジェクトをアタッチし関数を呼び出しエディタ上で試しにクリックしてみたらDebag.Logに以下のコードの"離した瞬間"と"クリックしっぱなし"しか表示されませんでした。どうやらPointerDownとPointerUpしか機能していないように見えます。

PointerDownしか"クリックした瞬間"、"クリックしっぱなし"は認識できないようです。

別のEventTriggerをアタッチしてPointerDownを追加し上記の動作をやってみても2個しか反応せず。

ちなみに"クリックした瞬間"のブロックと"クリックしっぱなし"のブロックの場所を入れ替えたら、Debug.Logに"離した瞬間"と"クリックした瞬間"しか表示されなくなりました。

どうすれば3つの操作がデバッグログに表示されますか?

乱文申し訳ないですがどなたかご教授頂けると幸いです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyButton:MonoBehaviour
{
    public void OnClick()
    {
        if (Application.isEditor)
        {
            if (Input.GetMouseButtonDown(0))
            {
                Debug.Log("クリックした瞬間");
            }

            if (Input.GetMouseButtonUp(0))
            {
                Debug.Log("離した瞬間");
            }

            if (Input.GetMouseButton(0))
            {
                Debug.Log("クリックしっぱなし");
            }

        }
        else
        {
            // タッチされているかチェック
            if (Input.touchCount > 0)
            {
                // タッチ情報の取得
                Touch touch = Input.GetTouch(0);

                if (touch.phase == TouchPhase.Began)
                {
                    Debug.Log("押した瞬間");
                }

                if (touch.phase == TouchPhase.Ended)
                {
                    Debug.Log("離した瞬間");
                }

                if (touch.phase == TouchPhase.Moved)
                {
                    Debug.Log("押しっぱなし");
                }
            }

        }


    }

}

回答

試している内容がよくわからないのですが、
uGUIオブジェクトのButtonに質問のコードを登録してるのでしょうか?
名前をOnClickにしてボタンにアタッチしていると、OnClickも発動しているような気がします。

イベントを細かく補足したいのであれば、EventTriggerのListnerを追加するようなスクリプトの方が良さそうな気がします。

公式の
https://docs.unity3d.com/ScriptReference/EventSystems.EventTrigger.html

下側の個別のdelegateのサンプルのように、
Startで動的に登録してみてはどうでしょう。その際名前は既存のもの(OnClickやOnPointerDown)には しない ように注意してください。

public class EventTriggerDelegateExample : MonoBehaviour
{
    void Start()
    {
        EventTrigger trigger = GetComponent<EventTrigger>();
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerDown;
        entry.callback.AddListener((data) => { OnPointerDownDelegate((PointerEventData)data); });
        trigger.triggers.Add(entry);
    }

    public void OnPointerDownDelegate(PointerEventData data)
    {
        Debug.Log("OnPointerDownDelegate called.");
    }
}
編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。