BITFALL/Assets/Plugins/CW/Shared/Common/Examples/Scripts/CwDemoButton.cs

245 lines
5.5 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
namespace CW.Common
{
/// <summary>This component turns the current UI element into a button that links to the specified action.</summary>
[ExecuteInEditMode]
[HelpURL(CwShared.HelpUrlPrefix + "CwDemoButton")]
[AddComponentMenu(CwShared.ComponentMenuPrefix + "Demo Button")]
public class CwDemoButton : MonoBehaviour, IPointerDownHandler
{
public enum LinkType
{
PreviousScene,
NextScene,
Publisher,
URL,
Isolate
}
public enum ToggleType
{
KeepSelected,
ToggleSelection,
SelectPrevious
}
/// <summary>The action that will be performed when this UI element is clicked.</summary>
public LinkType Link { set { link = value; } get { return link; } } [SerializeField] private LinkType link;
/// <summary>The URL that will be opened.</summary>
public string UrlTarget { set { urlTarget = value; } get { return urlTarget; } } [SerializeField] private string urlTarget;
/// <summary>If this GameObject is active, then the button will be faded in.</summary>
public Transform IsolateTarget { set { isolateTarget = value; } get { return isolateTarget; } } [SerializeField] private Transform isolateTarget;
/// <summary>If this button is already selected and you click/tap it again, what should happen?</summary>
public ToggleType IsolateToggle { set { isolateToggle = value; } get { return isolateToggle; } } [SerializeField] private ToggleType isolateToggle;
[System.NonSerialized]
private CanvasGroup cachedCanvasGroup;
[System.NonSerialized]
private Transform previousChild;
protected virtual void OnEnable()
{
cachedCanvasGroup = GetComponent<CanvasGroup>();
}
protected virtual void Update()
{
var group = GetComponent<CanvasGroup>();
if (group != null)
{
var alpha = 1.0f;
switch (link)
{
case LinkType.PreviousScene:
case LinkType.NextScene:
{
alpha = GetCurrentLevel() >= 0 && GetLevelCount() > 1 ? 1.0f : 0.0f;
}
break;
case LinkType.Isolate:
{
if (isolateTarget != null)
{
alpha = isolateTarget.gameObject.activeInHierarchy == true ? 1.0f : 0.5f;
}
}
break;
}
group.alpha = alpha;
group.blocksRaycasts = alpha > 0.0f;
group.interactable = alpha > 0.0f;
}
}
public void OnPointerDown(PointerEventData eventData)
{
switch (link)
{
case LinkType.PreviousScene:
{
var index = GetCurrentLevel();
if (index >= 0)
{
if (--index < 0)
{
index = GetLevelCount() - 1;
}
LoadLevel(index);
}
}
break;
case LinkType.NextScene:
{
var index = GetCurrentLevel();
if (index >= 0)
{
if (++index >= GetLevelCount())
{
index = 0;
}
LoadLevel(index);
}
}
break;
case LinkType.Publisher:
{
Application.OpenURL("https://carloswilkes.com");
}
break;
case LinkType.URL:
{
if (string.IsNullOrEmpty(urlTarget) == false)
{
Application.OpenURL(urlTarget);
}
}
break;
case LinkType.Isolate:
{
if (isolateTarget != null)
{
var parent = isolateTarget.transform.parent;
var active = isolateTarget.gameObject.activeSelf;
foreach (Transform child in parent.transform)
{
if (child.gameObject.activeSelf == true)
{
if (child != isolateTarget)
{
previousChild = child;
}
child.gameObject.SetActive(false);
}
}
switch (isolateToggle)
{
case ToggleType.KeepSelected:
{
isolateTarget.gameObject.SetActive(true);
}
break;
case ToggleType.ToggleSelection:
{
isolateTarget.gameObject.SetActive(active == false);
}
break;
case ToggleType.SelectPrevious:
{
if (active == true && previousChild != null)
{
previousChild.gameObject.SetActive(true);
}
else
{
isolateTarget.gameObject.SetActive(true);
}
}
break;
}
}
}
break;
}
}
private static int GetCurrentLevel()
{
var scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
var index = scene.buildIndex;
if (index >= 0)
{
if (UnityEngine.SceneManagement.SceneManager.GetSceneByBuildIndex(index).handle != scene.handle)
{
return -1;
}
}
return index;
}
private static int GetLevelCount()
{
return UnityEngine.SceneManagement.SceneManager.sceneCountInBuildSettings;
}
private static void LoadLevel(int index)
{
UnityEngine.SceneManagement.SceneManager.LoadScene(index);
}
}
}
#if UNITY_EDITOR
namespace CW.Common
{
using UnityEditor;
using TARGET = CwDemoButton;
[CanEditMultipleObjects]
[CustomEditor(typeof(TARGET))]
public class CwDemoButton_Editor : CwEditor
{
protected override void OnInspector()
{
TARGET tgt; TARGET[] tgts; GetTargets(out tgt, out tgts);
Draw("link", "The action that will be performed when this UI element is clicked.");
BeginIndent();
if (Any(tgts, t => t.Link == CwDemoButton.LinkType.URL))
{
Draw("urlTarget", "The URL that will be opened.", "Target");
}
if (Any(tgts, t => t.Link == CwDemoButton.LinkType.Isolate))
{
Draw("isolateTarget", "If this GameObject is active, then the button will be faded in.", "Target");
Draw("isolateToggle", "If this button is already selected and you click/tap it again, what should happen?", "Toggle");
}
EndIndent();
}
}
}
#endif