50 lines
1.8 KiB
C#
50 lines
1.8 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace AlicizaX.UI
|
|
{
|
|
/// <summary>
|
|
/// CanvasGroup 交互状态控制
|
|
/// 控制 CanvasGroup 的可交互性和射线检测
|
|
/// </summary>
|
|
[Serializable]
|
|
[ControlerStateName("CanvasGroup/Interactable")]
|
|
[ControlerStateAttachType(true)]
|
|
public class CanvasGroupInteractableState : ControllerStateBase
|
|
{
|
|
[SerializeField] private bool _interactable = true;
|
|
[SerializeField] private bool _blocksRaycasts = true;
|
|
[HideInInspector] [SerializeField] private bool _defaultInteractable = true;
|
|
[HideInInspector] [SerializeField] private bool _defaultBlocksRaycasts = true;
|
|
|
|
public override void Init(UXControllerStateRecorder recorder)
|
|
{
|
|
if (recorder != null && recorder.TryGetComponent<CanvasGroup>(out var canvasGroup))
|
|
{
|
|
_defaultInteractable = canvasGroup.interactable;
|
|
_defaultBlocksRaycasts = canvasGroup.blocksRaycasts;
|
|
}
|
|
}
|
|
|
|
public override void Execute(UXControllerStateRecorder recorder, int entryIndex, int selectionIndex)
|
|
{
|
|
if (recorder != null && recorder.TryGetComponent<CanvasGroup>(out var canvasGroup))
|
|
{
|
|
bool isActive = (entryIndex == selectionIndex);
|
|
canvasGroup.interactable = isActive ? _interactable : _defaultInteractable;
|
|
canvasGroup.blocksRaycasts = isActive ? _blocksRaycasts : _defaultBlocksRaycasts;
|
|
}
|
|
}
|
|
|
|
public override bool Valid(UXControllerStateRecorder recorder)
|
|
{
|
|
return recorder != null && recorder.GetComponent<CanvasGroup>() != null;
|
|
}
|
|
|
|
public override string GetDescription()
|
|
{
|
|
return $"匹配时: 可交互={_interactable}, 射线检测={_blocksRaycasts}";
|
|
}
|
|
}
|
|
}
|