概要
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した瞬間にはせっていされず、
スクリプトが更新された時や、シーンセーブ・プレハブ保存時に呼び出されます。
どのみちセーブはすると思うので、こちらの方がいいのかなぁと思います。
#ライセンス
自由に使用してください