【新手引导】Image 的渗透事件

初试....   

方法一:

新手引导类的渗透事件,用于判定在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(PointerEventData data, ExecuteEvents.EventFunction function) where T : IEventSystemHandler
    {
        var results = new List();
        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.引导情况下的局部按钮

 

 

你可能感兴趣的:(Unity,Tolua)