1. 程式人生 > >Unity3D 新手引導

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;
        }
    }

}
下載地址:工程下載地址