// 引入必要的命名空间
using System;
using System.Threading.Tasks;
using Cysharp.Threading.Tasks;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using DG.Tweening;
///
/// 引导遮罩类,用于创建和管理引导过程中的遮罩效果
///
public class GuideMask : MonoBehaviour
{
// 遮罩的 RectTransform 组件,可在 Inspector 面板中赋值
public RectTransform rectTransform;
public GameObject CanvasParent;
public RectTransform buttonPrefab;
// 遮罩的 RawImage 组件,用于显示遮罩图片
private RawImage _rawImage;
// 遮罩的 RectTransform 组件
private RectTransform _rectTrans;
// 遮罩使用的材质
private Material _materia;
// 当前遮罩的原点位置,初始化为一个很大的值
private Vector4 _currentOrigin = new Vector4(-9999, -9999, 9999, 9999);
// 当前正在进行的 DOTween 动画
private Tween currentTween;
// 遮罩所在的 Canvas 组件
private Canvas _canvas;
// 事件穿透组件
private EventPenetrate ev;
// 引导遮罩的游戏对象
public GameObject guide;
// 是否正在显示动画
private bool ShowTween = false;
// 当前遮罩的半径数值
private float CurRadNum;
// 动画完成后的回调函数
private Action Tweencallback;
// 回调函数是否被触发的标志
private bool callback = false;
// 单例模式,确保全局只有一个 GuideMask 实例
public static GuideMask Instance { private set; get; }
// 遮罩的偏移量,用于调整遮罩的大小
private float offset = 3;
// 目标位置跟踪相关字段
private GameObject _trackingTarget; // 当前跟踪的目标对象
private Vector3 _lastTargetPosition; // 上次记录的目标位置
private Vector3 _lastTargetScale; // 上次记录的目标缩放
private bool _isTrackingTarget = false; // 是否正在跟踪目标
///
/// 脚本实例被创建时调用,进行初始化操作
///
void Awake()
{
// 将当前实例赋值给单例
Instance = this;
// // 获取渲染器的材质
// _materia = GetComponent().material;
// // 设置材质的 _Origin 属性为当前原点位置
// _materia.SetVector("_Origin", _currentOrigin);
}
///
/// 创建一个带有点击事件的遮罩
///
/// 点击遮罩时执行的回调函数
/// 遮罩显示完成后执行的回调函数
/// 是否使用黑色遮罩,默认为 false
public void CreateMaskClick(UnityAction Clickcallback, Action callback, bool black = false)
{
// 显示引导遮罩,并在显示完成后执行回调
ShowGuideMask(() =>
{
// 如果引导遮罩对象存在
if (guide != null)
{
// 如果需要黑色遮罩
if (black)
{
// 设置遮罩图片的颜色为黑色且不透明
_rawImage.color = new Color(0, 0, 0, 1);
}
else
{
// 设置遮罩图片的颜色为白色且透明
_rawImage.color = new Color(1, 1, 1, 0);
}
// 移除按钮上的所有点击事件监听器
guide.GetComponent