76 lines
1.8 KiB
C#
76 lines
1.8 KiB
C#
using System;
|
|
using Animancer;
|
|
using TH1Resource;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI; // 用于 Button 组件
|
|
|
|
// 自动为该物体添加一个 Button 组件,确保它总是可点击的
|
|
[RequireComponent(typeof(Button))]
|
|
public class ToggleButtonController : MonoBehaviour
|
|
{
|
|
|
|
private bool _isOn; // 当前开关状态
|
|
|
|
//操作对象
|
|
public GameObject Handle;
|
|
public AnimationClip TurnOn;
|
|
public AnimationClip TurnOff;
|
|
private AnimancerComponent _anim;
|
|
public Action On;
|
|
public Action Off;
|
|
public Action Get;
|
|
|
|
private bool _initialized;
|
|
|
|
public void Init()
|
|
{
|
|
_initialized = true;
|
|
_anim = Handle.GetComponent<AnimancerComponent>();
|
|
GetComponent<Button>().onClick.AddListener(OnToggleClicked);
|
|
}
|
|
|
|
public void Refresh(bool isOn,Action actOn,Action actOff)
|
|
{
|
|
if (!_initialized)
|
|
Init();
|
|
_isOn = isOn;
|
|
On = actOn;
|
|
Off = actOff;
|
|
if (_anim != null)
|
|
{
|
|
var ani = _isOn ? TurnOn : TurnOff;
|
|
var state = _anim.Play(ani);
|
|
state.NormalizedTime = 1f;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 当Toggle被点击时调用
|
|
/// </summary>
|
|
private void OnToggleClicked()
|
|
{
|
|
// 1. 翻转状态
|
|
_isOn = !_isOn;
|
|
if (_isOn)
|
|
On.Invoke();
|
|
else
|
|
Off.Invoke();
|
|
//2. 播放对应动画
|
|
if(_anim != null)
|
|
_anim.Play(_isOn ? TurnOn : TurnOff );
|
|
|
|
// 3. 传递信息
|
|
|
|
}
|
|
|
|
void OnDestroy()
|
|
{
|
|
// 移除监听,防止内存泄漏
|
|
var button = GetComponent<Button>();
|
|
if (button != null)
|
|
{
|
|
button.onClick.RemoveListener(OnToggleClicked);
|
|
}
|
|
}
|
|
} |