// 引入必要的命名空间 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