新手引导遮罩控件

[Unity3D]UGUI 新手引导遮罩控件

强制性引导UI控件,关键区域镂空,自动调整关键区域大小。

  • * 效果如图: *
  • 使用结构:

代码块

示例代码:

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

using System.Collections.Generic;
using UnityEngine.Serialization;

namespace UnityEngine.UI
{

    public class GuideHighlightMask : MaskableGraphic, ICanvasRaycastFilter
    {
        public RectTransform arrow;
        public Vector2 center = Vector2.zero;
        public Vector2 size = new Vector2(100, 100);

        public void DoUpdate()
        {
            // 当引导箭头位置或者大小改变后更新,注意:未处理拉伸模式
            if (arrow && center != arrow.anchoredPosition || size != arrow.sizeDelta)
            {
                this.center = arrow.anchoredPosition;
                this.size = arrow.sizeDelta;
                SetAllDirty();
            }
        }

        public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
        {
            // 点击在箭头框内部则无效,否则生效
            return !RectTransformUtility.RectangleContainsScreenPoint(arrow, sp, eventCamera);
        }

        protected override void OnFillVBO(List<UIVertex> vbo)
        {
            Vector4 outer = new Vector4(-rectTransform.pivot.x * rectTransform.rect.width,
                                        -rectTransform.pivot.y * rectTransform.rect.height,
                                        (1 - rectTransform.pivot.x) * rectTransform.rect.width,
                                        (1 - rectTransform.pivot.y) * rectTransform.rect.height);

            Vector4 inner = new Vector4(center.x - size.x / 2,
                                        center.y - size.y / 2,
                                        center.x + size.x * 0.5f,
                                       center.y + size.y * 0.5f);

            vbo.Clear();

            var vert = UIVertex.simpleVert;

            // left
            vert.position = new Vector2(outer.x, outer.y);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(outer.x, outer.w);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(inner.x, outer.w);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(inner.x, outer.y);
            vert.color = color;
            vbo.Add(vert);

            // top
            vert.position = new Vector2(inner.x, inner.w);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(inner.x, outer.w);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(inner.z, outer.w);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(inner.z, inner.w);
            vert.color = color;
            vbo.Add(vert);

            // right
            vert.position = new Vector2(inner.z, outer.y);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(inner.z, outer.w);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(outer.z, outer.w);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(outer.z, outer.y);
            vert.color = color;
            vbo.Add(vert);

            // bottom
            vert.position = new Vector2(inner.x, outer.y);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(inner.x, inner.y);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(inner.z, inner.y);
            vert.color = color;
            vbo.Add(vert);

            vert.position = new Vector2(inner.z, outer.y);
            vert.color = color;
            vbo.Add(vert);
        }

        private void Update()
        {
            DoUpdate();
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值