iFactory.Cutting.Unity/Assets/Plugins/CW/Shared/Common/Examples/Scripts/CwDemoButtonBuilder.cs

124 lines
3.3 KiB
C#
Raw Normal View History

2024-01-23 02:56:26 +08:00
using UnityEngine;
using UnityEngine.UI;
using CW.Common;
namespace CW.Common
{
/// <summary>This component allows you to quickly build a UI button to activate only this GameObject when clicked.</summary>
[HelpURL(CwShared.HelpUrlPrefix + "CwDemoButtonBuilder")]
[AddComponentMenu(CwShared.ComponentMenuPrefix + "Demo Button Builder")]
public class CwDemoButtonBuilder : MonoBehaviour
{
/// <summary>The built button will be based on this prefab.</summary>
public GameObject ButtonPrefab { set { buttonPrefab = value; } get { return buttonPrefab; } } [SerializeField] private GameObject buttonPrefab;
/// <summary>The built button will be placed under this transform.</summary>
public RectTransform ButtonRoot { set { buttonRoot = value; } get { return buttonRoot; } } [SerializeField] private RectTransform buttonRoot;
/// <summary>The icon given to this button.</summary>
public Sprite Icon { set { icon = value; } get { return icon; } } [SerializeField] private Sprite icon;
/// <summary>The icon will be tinted by this.</summary>
public Color Color { set { color = value; } get { return color; } } [SerializeField] private Color color = Color.white;
/// <summary>Use a different name for the button text?</summary>
public string OverrideName { set { overrideName = value; } get { return overrideName; } } [SerializeField] [Multiline(3)] private string overrideName;
[SerializeField]
private GameObject clone;
[ContextMenu("Build")]
public void Build()
{
if (clone != null)
{
DestroyImmediate(clone);
}
if (buttonPrefab != null)
{
clone = DoInstantiate();
clone.name = name;
var image = clone.GetComponent<Image>();
if (image != null)
{
image.sprite = icon;
image.color = color;
}
var title = clone.GetComponentInChildren<Text>();
if (title != null)
{
title.text = string.IsNullOrEmpty(overrideName) == false ? overrideName : name;
}
var isolate = clone.GetComponent<CwDemoButton>();
if (isolate != null)
{
isolate.IsolateTarget = transform;
}
}
}
[ContextMenu("Build All")]
public void BuildAll()
{
foreach (var builder in transform.parent.GetComponentsInChildren<CwDemoButtonBuilder>(true))
{
builder.Build();
}
}
private GameObject DoInstantiate()
{
#if UNITY_EDITOR
if (Application.isPlaying == false)
{
return (GameObject)UnityEditor.PrefabUtility.InstantiatePrefab(buttonPrefab, buttonRoot);
}
#endif
return Instantiate(buttonPrefab, buttonRoot, false);
}
}
}
#if UNITY_EDITOR
namespace PaintIn3D
{
using UnityEditor;
using TARGET = CwDemoButtonBuilder;
[CanEditMultipleObjects]
[CustomEditor(typeof(TARGET))]
public class CwDemoButtonBuilder_Editor : CwEditor
{
protected override void OnInspector()
{
TARGET tgt; TARGET[] tgts; GetTargets(out tgt, out tgts);
Draw("buttonPrefab", "The built button will be based on this prefab.");
Draw("buttonRoot", "The built button will be placed under this transform.");
Separator();
Draw("icon", "The icon given to this button.");
Draw("color", "The icon will be tinted by this.");
Draw("overrideName", "Use a different name for the button text?");
Separator();
if (Button("Build All") == true)
{
Undo.RecordObjects(tgts, "Build All");
tgt.BuildAll();
}
}
}
}
#endif