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

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

#ソース
UGUIButton.cs
<pre><code>
using UnityEngine;
using UnityEngine.EventSystems;
using System;
using System.Collections;
using DG.Tweening;

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

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

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

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

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

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

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

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

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

        /// <summary>
        /// 生成直後の処理
        /// </summary>
        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);
        }

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

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

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

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


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

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