【Unity】uGUIでダブルクリックできるようにしてみよう!

uGUI

前回に引き続きuGUIのカスタマイズについての記事になります。

今回はButtonスクリプトにダブルクリック機能を付けてみたいと思います。

カスタマイズを反映させるには

前回の記事をご参考ください。
【Unity】uGUIを自由にカスタマイズしてみよう!

やりたいこと

button
既存のままだと上図のようにOnclickのイベントしか登録できません。
「ダブルクリックした時に何かしたい!」という時もあるかと思いますので、
今回は「ボタンをダブルクリックした時にイベントを呼び出せる」ようにしたいと思います。

ソースの改修

2つのソースファイルを改修するだけでOKです

Button.cs

パス:UnityEngine.UIUICoreButton.cs

using System;
using System.Collections;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;

namespace UnityEngine.UI
{
    // Button that's meant to work with mouse or touch-based devices.
    [AddComponentMenu("UI/Button", 30)]
    public class Button : Selectable, IPointerClickHandler, ISubmitHandler
    {
        [Serializable]
        public class ButtonClickedEvent : UnityEvent { }

        // Event delegates triggered on click.
        [FormerlySerializedAs("onClick")]
        [SerializeField]
        private ButtonClickedEvent m_OnClick = new ButtonClickedEvent();

        [Serializable]
        public class ButtonDoubleClickedEvent : UnityEvent { }

        // Event delegates triggered on Doubleclick.
        [FormerlySerializedAs("onDoubleClick")]
        [SerializeField]
        private ButtonDoubleClickedEvent m_OnDoubleClick = new ButtonDoubleClickedEvent();

        protected Button()
        { }

        public ButtonDoubleClickedEvent onDoubleClick
        {
            get { return m_OnDoubleClick; }
            set { m_OnDoubleClick = value; }
        }

        public ButtonClickedEvent onClick
        {
            get { return m_OnClick; }
            set { m_OnClick = value; }
        }

        private void Press()
        {
            if (!IsActive() || !IsInteractable())
                return;

            m_OnClick.Invoke();
        }

        private void DoublePress()
        {
            if (!IsActive() || !IsInteractable())
                return;

            m_OnDoubleClick.Invoke();
        }

        // Trigger all registered callbacks.
        public virtual void OnPointerClick(PointerEventData eventData)
        {
            if (eventData.button != PointerEventData.InputButton.Left)
                return;

           
            if (eventData.clickCount == 1)
            {
                Press();
            }
            else if (eventData.clickCount == 2)
            {
                DoublePress();
            }
        }

        public virtual void OnSubmit(BaseEventData eventData)
        {
            Press();

            // if we get set disabled during the press
            // don't run the coroutine.
            if (!IsActive() || !IsInteractable())
                return;

            DoStateTransition(SelectionState.Pressed, false);
            StartCoroutine(OnFinishSubmit());
        }

        private IEnumerator OnFinishSubmit()
        {
            var fadeTime = colors.fadeDuration;
            var elapsedTime = 0f;

            while (elapsedTime < fadeTime)
            {
                elapsedTime += Time.unscaledDeltaTime;
                yield return null;
            }

            DoStateTransition(currentSelectionState, false);
        }
    }
}

ButtonEditor.cs

パス:UnityEditor.UIUIButtonEditor.cs

using UnityEngine.UI;

namespace UnityEditor.UI
{
    [CustomEditor(typeof(Button), true)]
    [CanEditMultipleObjects]
    public class ButtonEditor : SelectableEditor
    {
        SerializedProperty m_OnClickProperty;
        SerializedProperty m_OnDoubleClickProperty;

        protected override void OnEnable()
        {
            base.OnEnable();
            m_OnClickProperty = serializedObject.FindProperty("m_OnClick");
            m_OnDoubleClickProperty = serializedObject.FindProperty("m_OnDoubleClick");
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            EditorGUILayout.Space();

            serializedObject.Update();
            EditorGUILayout.PropertyField(m_OnClickProperty);
            EditorGUILayout.PropertyField(m_OnDoubleClickProperty);
            serializedObject.ApplyModifiedProperties();
        }
    }
}

動作確認

上記の改修を行った後DLLを作成し、適用させれば下図のようになるかと思います。
butto2

あとは追加されたOn Double Click()に好きなイベントを登録すればOKです!

コメント

  1. 名無し より:

    Google検索よりこのページにたどり着きました。
    参考にしたいのですが、カスタマイズを反映させるには、の前回の記事が見れずに、ソースコードを反映させる方法がわからないのですが、URLを更新していただけないでしょうか。

    • ターピス 管理人 より:

      アクセスありがとうございます!
      UR$Lのほう失礼いたしました。修正いたしました。

タイトルとURLをコピーしました