关于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; } } }下载地址: 工程下载地址