概要
http://qiita.com/takeout/items/0af22f1de4013eddbd6e
で別の方法を見つけたのでそちらを
ソース
UGUIButton.cs
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
///
/// スクリプトがロードされた時やインスペクターの値が変更されたときに呼び出されます
///
protected override void OnValidate()
{
base.OnValidate();
AutoAttach();
}
/// <summary>
/// 自動的にトリガーを見つけて割り当てる
/// </summary>
private void AutoAttach()
{
if (_trigger == null)
{
Debug.Log("トリガーを自動設定しました",this);
_trigger = GetComponent\<EventTrigger\>();
}
}
#endif
///
/// トリガー
///
[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);
}
}
こっちの方が安全そうです
ただ、AddComponentした瞬間にはせっていされず、
スクリプトが更新された時や、シーンセーブ・プレハブ保存時に呼び出されます。
どのみちセーブはすると思うので、こちらの方がいいのかなぁと思います。
ライセンス
自由に使用してください