概要
・クリックしたら自動的に縮小・離したら拡大
・クリックイベントがコードから設定しやすいように
ボタンのスケーリングにDotweenを使用しています。
uGUIのButtonがあまりにも使いづらいので自分でつくってみました。
改良版
http://qiita.com/takeout/items/d612ce8b30e3f16f78bc
#ソース
UGUIButton.cs
\#if UNITY_EDITOR
using UnityEditor;
\#endif
using UnityEngine;
using UnityEngine.EventSystems;
using System;
using System.Collections;
using DG.Tweening;
///
/// UGUIボタン
///
\#if UNITY_EDITOR
[InitializeOnLoad]
\#endif
[RequireComponent(typeof(EventTrigger))]
public class UGUIButton : UIBehaviour
{
///
/// コンストラクタ
///
public UGUIButton()
{
\#if UNITY_EDITOR
// エディタ更新時に自動でトリガーを割り当てる
EditorApplication.update = () =>
{
AutoAttach();
EditorApplication.update = null;
};
\#endif
}
\#if UNITY_EDITOR
///
/// 自動的にトリガーを見つけて割り当てる
///
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);
}
}
これを使うことで、
[SerializeField]
UGUIButton button;
button.OnClickedListener = () =>
{
Debug.Log("くりっく!");
};
というふうにコードからも簡単に設定することができます。
RequiredCommponentで自動追加されるEventTriggerを自動で格納してほしかったので、
EditorApplication.updateに自動追加の処理を仕込みました。
これによりImageにUGUIButtonをAddCommponentしたら勝手に割り当ててくれて嬉しい。
http://anchan828.github.io/editor-manual/web/callbacks.html
#注意点
ScrollRectに仕込むと、ドラッグ操作まで吸収されてしまいます。
#ライセンス
自由に使ってください