初试....
方法一:
新手引导类的渗透事件,用于判定在Mask的遮挡下,监听到点击,执行Mask下方的事件,最后以达到渗透的目的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NewBieGuide : MonoBehaviour , ICanvasRaycastFilter
{
//需要渗透的目标
private RectTransform target;
//外部传入
public void Show(RectTransform target)
{
this.target = target;
}
//处理渗透(目标是否在点击的区域范围内)
//此方法有重载
public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
{
if (target == null) { return false; } // 事件不会渗透
return !RectTransformUtility.RectangleContainsScreenPoint(target, sp, eventCamera);
}
}
方法二:
此方法同样适用于制作新手引导....
当点击下,会返回当前点击处的所有携带RaycastTarget的物体,然后你可以选择需要执行的对应事件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class NewbieGuidePostEvent : MonoBehaviour, IPointerClickHandler
{
public UnityEvent onClick;
//按钮的名称
private string btnName;
//监听点击
public void OnPointerClick(PointerEventData eventData)
{
//事件穿透
PassEvent(eventData, ExecuteEvents.pointerClickHandler);
}
private void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler
{
var results = new List<RaycastResult>();
EventSystem.current.RaycastAll(data, results);
var current = data.pointerCurrentRaycast.gameObject;
for (int i = 0; i < results.Count; i++)
{
//判断穿透对象是否是需要要点击的对象
if (current != results[i].gameObject)
{
if (results[i].gameObject.name == this.btnName)
{
ExecuteEvents.Execute(results[i].gameObject, data, function);
onClick.Invoke();
}
}
}
}
//外部传参
public void Show(string btnName)
{
this.btnName= btnName;
}
}
此方法针对Toggle,需要单独处理,这点需要注意,若有不对的地方,感谢大佬指点迷津.....
附加注意事项:
1.同名预制的处理
2.按钮长按、点击的区分
3.引导情况下的局部按钮