using System;
using TMPro;
using UnityEngine;
using Object = UnityEngine.Object;
namespace EHR;
public class SimpleButton
{
/// 新しいボタンを作成する
/// 親オブジェクト
/// オブジェクト名
/// 通常時の背景色
/// マウスホバー時の背景色
/// クリック時に発火するアクション
/// ボタンのラベル
/// ボタンの大きさ
/// 初期状態でアクティブにするかどうか(デフォルトtrue)
public SimpleButton(
Transform parent,
string name,
Vector3 localPosition,
Color32 normalColor,
Color32 hoverColor,
Action action,
string label,
bool isActive = true)
{
if (baseButton == null)
{
throw new InvalidOperationException("baseButtonが未設定");
}
Button = Object.Instantiate(baseButton, parent);
Label = Button.transform.Find("FontPlacer/Text_TMP").GetComponent();
NormalSprite = Button.inactiveSprites.GetComponent();
HoverSprite = Button.activeSprites.GetComponent();
buttonCollider = Button.GetComponent();
// ラベルをセンタリング
var container = Label.transform.parent;
Object.Destroy(Label.GetComponent());
container.SetLocalX(0f);
Label.transform.SetLocalX(0f);
Label.horizontalAlignment = HorizontalAlignmentOptions.Center;
Button.name = name;
Button.transform.localPosition = localPosition;
NormalSprite.color = normalColor;
HoverSprite.color = hoverColor;
Button.OnClick.AddListener(action);
Label.text = label;
Button.gameObject.SetActive(isActive);
}
public PassiveButton Button { get; }
public TextMeshPro Label { get; }
public SpriteRenderer NormalSprite { get; }
public SpriteRenderer HoverSprite { get; }
private readonly BoxCollider2D buttonCollider;
private Vector2 _scale;
public Vector2 Scale
{
get => _scale;
set => _scale = NormalSprite.size = HoverSprite.size = buttonCollider.size = value;
}
private float _fontSize;
public float FontSize
{
get => _fontSize;
set => _fontSize = Label.fontSize = Label.fontSizeMin = Label.fontSizeMax = value;
}
private static PassiveButton baseButton;
public static void SetBase(PassiveButton passiveButton)
{
if (baseButton != null || passiveButton == null)
{
return;
}
// 複製
baseButton = Object.Instantiate(passiveButton);
var label = baseButton.transform.Find("FontPlacer/Text_TMP").GetComponent();
baseButton.gameObject.SetActive(false);
// シーン切替時に破棄されないようにする
Object.DontDestroyOnLoad(baseButton);
baseButton.name = "EHR_SimpleButtonBase";
// 不要なコンポーネントを無効化
Object.Destroy(baseButton.GetComponent());
label.DestroyTranslator();
label.fontSize = label.fontSizeMax = label.fontSizeMin = 3.5f;
label.enableWordWrapping = false;
label.text = "EHR SIMPLE BUTTON BASE";
// 当たり判定がズレてるのを直す
var buttonCollider = baseButton.GetComponent();
buttonCollider.offset = new(0f, 0f);
baseButton.OnClick = new();
}
public static bool IsNullOrDestroyed(SimpleButton button) => button == null || button.Button == null;
}