1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UGUIButton - uGUIのクリックイベントをコードから使いやすく2

Last updated at Posted at 2016-11-09

概要

http://qiita.com/takeout/items/0af22f1de4013eddbd6e
で別の方法を見つけたのでそちらを

#ソース
UGUIButton.cs


using UnityEngine;
using UnityEngine.EventSystems;
using System;
using System.Collections;
using DG.Tweening;

    /// 
    /// UGUIボタン
    /// 
    [RequireComponent(typeof(EventTrigger))]
    public class UGUIButton : UIBehaviour
    {
\#if UNITY_EDITOR
        /// 
        /// スクリプトがロードされた時やインスペクターの値が変更されたときに呼び出されます
        /// 
        protected override void OnValidate()
        {
            base.OnValidate();
            AutoAttach();
        }

        /// 
        /// 自動的にトリガーを見つけて割り当てる
        /// 
        private void AutoAttach()
        {
            if (_trigger == null)
            {
                Debug.Log("トリガーを自動設定しました",this);
                _trigger = GetComponent\();
            }
        }
\#endif
        /// 
        /// トリガー
        /// 
        [SerializeField,Header("トリガーは自動で割り当てられます")]
        private EventTrigger _trigger;

        /// 
        /// 拡大するかどうか
        /// 
        [SerializeField]
        private bool _isScalable = true;

        /// 
        /// ディセーブル状態かどうか
        /// 
        [SerializeField]
        private bool _isDisable;

        /// 
        /// 押せる状態の時の表示物
        /// null許容
        /// 
        [SerializeField]
        private GameObject _enableRoot;

        /// 
        /// 押せない状態の時の表示物
        /// null許容
        /// 
        [SerializeField]
        private GameObject _disableRoot;

        /// 
        /// クリックされた時のリスナー
        /// 
        public Action OnClickedListener;

        /// 
        /// 拡大可能状態を設定
        /// 
        public void SetScalable(bool isScalable)
        {
            _isScalable = isScalable;
        }

        /// 
        /// ディセーブル状態を設定
        /// 
        public void SetDisable(bool isDisable)
        {
            _isDisable = isDisable;
            OnDisableChanged(isDisable);
        }

        /// 
        /// 生成直後の処理
        /// 
        protected override void Awake()
        {
            base.Awake();

            var clickEntry = new EventTrigger.Entry();
            clickEntry.eventID = EventTriggerType.PointerClick;
            clickEntry.callback.AddListener((_) => OnClicked());
            _trigger.triggers.Add(clickEntry);

            var pointerDown = new EventTrigger.Entry();
            pointerDown.eventID = EventTriggerType.PointerDown;
            pointerDown.callback.AddListener((_) => OnPointerDown());
            _trigger.triggers.Add(pointerDown);

            var pointerUp = new EventTrigger.Entry();
            pointerUp.eventID = EventTriggerType.PointerUp;
            pointerUp.callback.AddListener((_) => OnPointerUp());
            _trigger.triggers.Add(pointerUp);

            OnDisableChanged(_isDisable);
        }

        /// 
        /// クリックされた時
        /// 
        private void OnClicked()
        {
            if (_isDisable)
            {
                return;
            }
            SystemUtility.SafeCall(OnClickedListener);
        }

        /// 
        /// 押された時
        /// 
        private void OnPointerDown()
        {
            if (_isDisable)
            {
                return;
            }
            if (_isScalable)
            {
                transform.DOScale(new Vector3(0.9f, 0.9f, 0.9f), 0.1f);
            }
        }

        /// 
        /// 離された時
        /// 
        private void OnPointerUp()
        {
            if (_isDisable)
            {
                return;
            }
            if (_isScalable)
            {
                transform.DOScale(Vector3.one, 0.1f);
            }
        }

        /// 
        /// ディセーブル状態が変わった時
        /// 
        private void OnDisableChanged(bool isDisable)
        {
            if (_enableRoot == null || _disableRoot == null)
            {
                return;
            }
            _disableRoot.SetActive(isDisable);
            _enableRoot.SetActive(!isDisable);
        }
    }

こっちの方が安全そうです
ただ、AddComponentした瞬間にはせっていされず、
スクリプトが更新された時や、シーンセーブ・プレハブ保存時に呼び出されます。
どのみちセーブはすると思うので、こちらの方がいいのかなぁと思います。

#ライセンス
自由に使用してください

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?