前回に引き続きuGUIのカスタマイズについての記事になります。
今回はButtonスクリプトにダブルクリック機能を付けてみたいと思います。
カスタマイズを反映させるには
前回の記事をご参考ください。
【Unity】uGUIを自由にカスタマイズしてみよう!
やりたいこと
既存のままだと上図のように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を作成し、適用させれば下図のようになるかと思います。
あとは追加されたOn Double Click()に好きなイベントを登録すればOKです!
コメント
Google検索よりこのページにたどり着きました。
参考にしたいのですが、カスタマイズを反映させるには、の前回の記事が見れずに、ソースコードを反映させる方法がわからないのですが、URLを更新していただけないでしょうか。
アクセスありがとうございます!
UR$Lのほう失礼いたしました。修正いたしました。