Files
Main/Assets/Launcher/ExternalLibs/NGUI/Scripts/Interaction/UIButton.cs

322 lines
7.1 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
//----------------------------------------------
// NGUI: Next-Gen UI kit
// Copyright © 2011-2015 Tasharen Entertainment
//----------------------------------------------
using UnityEngine;
using System.Collections.Generic;
/// <summary>
/// Similar to UIButtonColor, but adds a 'disabled' state based on whether the collider is enabled or not.
/// </summary>
[AddComponentMenu("NGUI/Interaction/Button")]
[RequireComponent(typeof(UIButtonScale))]
public class UIButton : UIButtonColor
{
/// <summary>
/// Current button that sent out the onClick event.
/// </summary>
static public UIButton current;
static public UIButton doubleCurrent;
/// <summary>
/// Whether the button will highlight when you drag something over it.
/// </summary>
public bool dragHighlight = false;
/// <summary>
/// Name of the hover state sprite.
/// </summary>
public string hoverSprite;
/// <summary>
/// Name of the pressed sprite.
/// </summary>
public string pressedSprite;
/// <summary>
/// Name of the disabled sprite.
/// </summary>
public string disabledSprite;
/// <summary>
/// Name of the hover state sprite.
/// </summary>
public UnityEngine.Sprite hoverSprite2D;
/// <summary>
/// Name of the pressed sprite.
/// </summary>
public UnityEngine.Sprite pressedSprite2D;
/// <summary>
/// Name of the disabled sprite.
/// </summary>
public UnityEngine.Sprite disabledSprite2D;
/// <summary>
/// Whether the sprite changes will elicit a call to MakePixelPerfect() or not.
/// </summary>
public bool pixelSnap = false;
/// <summary>
/// Click event listener.
/// </summary>
public List<EventDelegate> onClick = new List<EventDelegate>();
public List<EventDelegate> onDoubleClick = new List<EventDelegate>();
// Cached value
[System.NonSerialized] UISprite mSprite;
[System.NonSerialized] UI2DSprite mSprite2D;
[System.NonSerialized] string mNormalSprite;
[System.NonSerialized] UnityEngine.Sprite mNormalSprite2D;
/// <summary>
/// Whether the button should be enabled.
/// </summary>
public override bool isEnabled
{
get
{
if (!enabled) return false;
#if UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7
Collider col = collider;
#else
Collider col = gameObject.GetComponent<Collider>();
#endif
if (col && col.enabled) return true;
Collider2D c2d = GetComponent<Collider2D>();
return (c2d && c2d.enabled);
}
set
{
if (isEnabled != value)
{
#if UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7
Collider col = collider;
#else
Collider col = gameObject.GetComponent<Collider>();
#endif
if (col != null)
{
col.enabled = value;
UIButton[] buttons = GetComponents<UIButton>();
foreach (UIButton btn in buttons) btn.SetState(value ? State.Normal : State.Disabled, false);
}
else
{
Collider2D c2d = GetComponent<Collider2D>();
if (c2d != null)
{
c2d.enabled = value;
UIButton[] buttons = GetComponents<UIButton>();
foreach (UIButton btn in buttons) btn.SetState(value ? State.Normal : State.Disabled, false);
}
else enabled = value;
}
}
}
}
/// <summary>
/// Convenience function that changes the normal sprite.
/// </summary>
public string normalSprite
{
get
{
if (!mInitDone) OnInit();
return mNormalSprite;
}
set
{
if (!mInitDone) OnInit();
if (mSprite != null && !string.IsNullOrEmpty(mNormalSprite) && mNormalSprite == mSprite.spriteName)
{
mNormalSprite = value;
SetSprite(value);
NGUITools.SetDirty(mSprite);
}
else
{
mNormalSprite = value;
if (mState == State.Normal) SetSprite(value);
}
}
}
/// <summary>
/// Convenience function that changes the normal sprite.
/// </summary>
public UnityEngine.Sprite normalSprite2D
{
get
{
if (!mInitDone) OnInit();
return mNormalSprite2D;
}
set
{
if (!mInitDone) OnInit();
if (mSprite2D != null && mNormalSprite2D == mSprite2D.sprite2D)
{
mNormalSprite2D = value;
SetSprite(value);
NGUITools.SetDirty(mSprite);
}
else
{
mNormalSprite2D = value;
if (mState == State.Normal) SetSprite(value);
}
}
}
/// <summary>
/// Cache the sprite we'll be working with.
/// </summary>
protected override void OnInit ()
{
base.OnInit();
mSprite = (mWidget as UISprite);
mSprite2D = (mWidget as UI2DSprite);
if (mSprite != null) mNormalSprite = mSprite.spriteName;
if (mSprite2D != null) mNormalSprite2D = mSprite2D.sprite2D;
}
/// <summary>
/// Set the initial state.
/// </summary>
protected override void OnEnable ()
{
#if UNITY_EDITOR
if (!Application.isPlaying)
{
mInitDone = false;
return;
}
#endif
if (isEnabled)
{
if (mInitDone) OnHover(UICamera.hoveredObject == gameObject);
}
else SetState(State.Disabled, true);
}
/// <summary>
/// Drag over state logic is a bit different for the button.
/// </summary>
protected override void OnDragOver ()
{
if (isEnabled && (dragHighlight || UICamera.currentTouch.pressed == gameObject))
base.OnDragOver();
}
/// <summary>
/// Drag out state logic is a bit different for the button.
/// </summary>
protected override void OnDragOut ()
{
if (isEnabled && (dragHighlight || UICamera.currentTouch.pressed == gameObject))
base.OnDragOut();
}
/// <summary>
/// Call the listener function.
/// </summary>
public virtual void OnClick ()
{
if (current == null && isEnabled)
{
current = this;
EventDelegate.Execute(onClick);
current = null;
}
}
protected virtual void OnDoubleClick()
{
if (doubleCurrent == null && isEnabled)
{
doubleCurrent = this;
EventDelegate.Execute(onDoubleClick);
doubleCurrent = null;
}
}
/// <summary>
/// Change the visual state.
/// </summary>
public override void SetState (State state, bool immediate)
{
base.SetState(state, immediate);
if (mSprite != null)
{
switch (state)
{
case State.Normal: SetSprite(mNormalSprite); break;
case State.Hover: SetSprite(string.IsNullOrEmpty(hoverSprite) ? mNormalSprite : hoverSprite); break;
case State.Pressed: SetSprite(pressedSprite); break;
case State.Disabled: SetSprite(disabledSprite); break;
}
}
else if (mSprite2D != null)
{
switch (state)
{
case State.Normal: SetSprite(mNormalSprite2D); break;
case State.Hover: SetSprite(hoverSprite2D == null ? mNormalSprite2D : hoverSprite2D); break;
case State.Pressed: SetSprite(pressedSprite2D); break;
case State.Disabled: SetSprite(disabledSprite2D); break;
}
}
}
/// <summary>
/// Convenience function that changes the sprite.
/// </summary>
protected void SetSprite (string sp)
{
if (mSprite != null && !string.IsNullOrEmpty(sp) && mSprite.spriteName != sp)
{
mSprite.spriteName = sp;
if (pixelSnap) mSprite.MakePixelPerfect();
}
}
/// <summary>
/// Convenience function that changes the sprite.
/// </summary>
protected void SetSprite (UnityEngine.Sprite sp)
{
if (sp != null && mSprite2D != null && mSprite2D.sprite2D != sp)
{
mSprite2D.sprite2D = sp;
if (pixelSnap) mSprite2D.MakePixelPerfect();
}
}
}