Unity3D 新手引导

关于Unit3D 新手引导的方式 网上已经有很多了。最近刚好 去实现了一个新手引导。在这里和大家 分享下!

1>. 第一种最方便的就是,新建立一层黑色的Image 并且Raycast Target设置为True 的 Mask.在 UI的最上层。 需要哪一个按钮,就把那个按钮设置为 Image Mask的子物体。这样自己就凸显来 并且可以点击。


这种方式简单 粗暴,几乎不用怎么多费的代码。但是这种但是有一个硬伤 那就是 如果 你想要可以点击的那块 不是一个整体的话(几个图片拼接遮挡显示出来的)。那么这种方式可就是 没法用了

2.> 第二种方式,可谓 万能模式。其主旨思想就是




通过 1,2,3,4 这四块 把不需要点击的区域 遮挡住。这样就可以 避免玩家别的操作 。

但是在笔者看来。这种方式太过笨重,(也懒得实现 ,等有时间可以练练手)


3>. 这里直接介绍第三种


右边这个 Mask Cull 就是需要现实的位置,是屏幕坐标区域。 NeedMaskCull。再加上一个可以 往下传递点击事件的脚本。

就 大功告成了。想要那个区域显示 就把那个区域Rect传过来。


代码如下 (参照完成工程写的 未经测试)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UserGuidance : MonoBehaviour,ICanvasRaycastFilter{

    private Rect mastRect;


    Material GetMaterial
    {
        get
        {
            return  GetComponent<Image>().material;
        }
 
    }

    private void OnMaskRectShow(RectTransform rect)
    {
        ///要现实的位置 RrctTransform, 转化到屏幕坐标。
        Vector3 vect                = RectTransformUtility.WorldToScreenPoint(Camera.main, rect.gameObject.transform.position);
        Canvas canvas               = GameObject.Find("Canvas").GetComponent<Canvas>();
        CanvasScaler canvasScaler   = canvas.GetComponent<CanvasScaler>();

        float radio                 = Screen.width / canvasScaler.referenceResolution.x;//适配

        float x                     = vect.x - rect.sizeDelta.x * rect.pivot.x * radio;
        float y                     = vect.y - rect.sizeDelta.y * rect.pivot.x * radio;

        Vector4 vector4             = new Vector4(  x, y,   x + rect.sizeDelta.x * radio,   y + rect.sizeDelta.y * radio);
        mastRect                    = new Rect(     x, y,       rect.sizeDelta.x * radio,       rect.sizeDelta.y * radio);

        GetMaterial.SetFloat("_bNeedSet", 1);
        GetMaterial.SetVector("_MaskCull", vector4);
       
    }

    private void OnMaskRectHide()
    {
        GetMaterial.SetVector("_MaskCull", Vector4.zero);
        GetMaterial.SetFloat("_bNeedSet",  0);
        mastRect  = Rect.zero;
    }


    /// <summary>
    /// 点击事件 往下传导
    /// </summary>
    /// <param name="sp"></param>
    /// <param name="eventCamera"></param>
    /// <returns></returns>
    public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
    {
        if (mastRect.Contains(sp))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

}
下载地址: 工程下载地址

猜你喜欢

转载自blog.csdn.net/nicepainkiller/article/details/80272740