Unity3D 新手引導
阿新 • • 發佈:2019-02-11
關於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; } } }