Unity | 简单高效的强制新手引导

这篇具有很好参考价值的文章主要介绍了Unity | 简单高效的强制新手引导。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

更舒适的阅读体验,请关注公众号

 

​1 简介

游戏中的新手引导可以帮助玩家快速了解游戏规则和操作方式,对于玩家体验来说非常重要
实现强制新手引导有很多种方式,这里基于 OnPopulateMesh 方法,相比 Shader、Mask 等方式,该方法通过减少 DrawCall 来提高 UI 渲染性能

2 效果预览

Unity | 简单高效的强制新手引导,ui,unity,新手引导

点击镂空区域按的钮触发对应事件

3 实现方案

3.1 构成分析

强制新手引导一般由两部分构成:

  1. 遮罩区域:全屏半透黑色遮罩,屏蔽玩家操作

  2. 镂空区域:透传点击操作,触发目标按钮事件

    Unity | 简单高效的强制新手引导,ui,unity,新手引导

在此基础上,还可以通过增加目标按钮的边框效果及手指点击等动画增强游戏视觉体验

3.2 实现方法

遮罩及镂空区域

「方法介绍」

protected virtual void OnPopulateMesh(VertexHelper vh);

UI 元素需要生成顶点时的回调函数,通常用于自定义 UI 元素的渲染,可以通过重写该方法来实现自定义的 UI 元素渲染效果

vh 参数是一个 VertexHelper 类型的对象,用于生成网格数据。在该方法中,可以通过调用 VertexHelper 的方法来添加顶点、三角形和颜色等信息,从而生成网格数据

在重写该方法时,需要注意以下几点:

  • 在方法中添加顶点、三角形和颜色等信息时,需要按照一定的顺序添加,以确保生成的网格数据正确无误

  • 在方法中添加顶点、三角形和颜色等信息时,需要注意坐标系的转换,以确保生成的网格数据与 UI 元素的位置和大小一致

  • 在方法中添加顶点、三角形和颜色等信息时,需要注意性能问题,尽量避免生成过多的网格数据,以提高渲染效率

「具体实现」
根据遮罩区域和镂空区域交叉后的位置,计算出 8 个顶点,绘制遮罩区域的三角形,保留镂空区域

Unity | 简单高效的强制新手引导,ui,unity,新手引导

  1. 计算镂空区域相对于遮罩区域的包围盒坐标,即交叉的四个顶点坐标

Bounds bounds = RectTransformUtility.CalculateRelativeRectTransformBounds(this.rectTransform, this._target);
this._targetBoundsMin = bounds.min;
this._targetBoundsMax = bounds.max;
  1. 根据交叉的顶点坐标,填充顶点数据,绘制镂空区域外的三角形

protected override void OnPopulateMesh(VertexHelper vh)
{
    if (this._targetBoundsMin == Vector3.zero && this._targetBoundsMax == Vector3.zero)
    {
        base.OnPopulateMesh(vh);
        return;
    }

    vh.Clear();

    Vector2 pivot = this.rectTransform.pivot;
    Rect rect = this.rectTransform.rect;
    float outerLeftBottomX = -pivot.x * rect.width;
    float outerLeftBottomY = -pivot.y * rect.height;
    float outerRightTopX = (1 - pivot.x) * rect.width;
    float outerRightTopY = (1 - pivot.y) * rect.height;

    // 准备顶点数据
    UIVertex vert = UIVertex.simpleVert;
    // 填充顶点颜色
    vert.color = this.color;

    // 计算遮罩区域顶点位置
    // 0 outer LeftTop
    vert.position = new Vector3(outerLeftBottomX, outerRightTopY);
    vh.AddVert(vert);
    // 1 outer RightTop
    vert.position = new Vector3(outerRightTopX, outerRightTopY);
    vh.AddVert(vert);
    // 2 outer RightBottom
    vert.position = new Vector3(outerRightTopX, outerLeftBottomY);
    vh.AddVert(vert);
    // 3 outer LeftBottom
    vert.position = new Vector3(outerLeftBottomX, outerLeftBottomY);
    vh.AddVert(vert);

    // 计算镂空区域顶点位置
    // 4 outer LeftTop
    vert.position = new Vector3(_targetBoundsMin.x, _targetBoundsMax.y);
    vh.AddVert(vert);
    // 5 inner RightTop
    vert.position = new Vector3(_targetBoundsMax.x, _targetBoundsMax.y);
    vh.AddVert(vert);
    // 6 inner RightBottom
    vert.position = new Vector3(_targetBoundsMax.x, _targetBoundsMin.y);
    vh.AddVert(vert);
    // 7 inner LeftBottom
    vert.position = new Vector3(_targetBoundsMin.x, _targetBoundsMin.y);
    vh.AddVert(vert);

    // 向缓冲区中添加三角形
    vh.AddTriangle(4, 0, 1);
    vh.AddTriangle(4, 1, 5);
    vh.AddTriangle(5, 1, 2);
    vh.AddTriangle(5, 2, 6);
    vh.AddTriangle(6, 2, 3);
    vh.AddTriangle(6, 3, 7);
    vh.AddTriangle(7, 3, 0);
    vh.AddTriangle(7, 0, 4);
}

镂空区域内事件透传

「方法介绍」

bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)

给定一个点和一个摄像机,判断射线投射是否有效,通常用于自定义 UI 元素的交互,通过继承 ICanvasRaycastFilter 接口并实现该方法来自定义 UI 元素射线检测效果

screenPoint 参数是一个屏幕坐标系下的二维向量,表示射线检测的位置,eventCamera 参数是一个 Camera 类型的对象,表示射线检测所使用的相机。该方法返回一个 bool 类型的值,表示 UI 元素是否可以被射线检测到

「具体实现」
在该方法中判断事件坐标是否在镂空区域内,如果在该区域内则透传事件

public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
{
    // 透传镂空区域事件
    return !RectTransformUtility.RectangleContainsScreenPoint(this._target, sp, eventCamera);
}

Unity | 简单高效的强制新手引导,ui,unity,新手引导

游戏开发手记,,,

源码商店

Unity | 简单高效的强制新手引导,ui,unity,新手引导

小程序文章来源地址https://www.toymoban.com/news/detail-801915.html

到了这里,关于Unity | 简单高效的强制新手引导的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于unity+c#的随机点名系统(简单UI界面+列表+数组)

    目录 一、功能界面显示 二、UI 1、视频的使用 (1)渲染纹理 (2) 视频铺全屏 (3)视频的调用 2、 下拉文本框的使用(旧版) 3、输入文本框的使用(旧版) 4、更新Test文本和下拉文本框的内容 三、保存之前的记录 1、PlayerPrefs (1)保存数据: (2)读取数据: (3)删除

    2024年04月27日
    浏览(23)
  • 【Unity小技巧】手戳一个简单易用的游戏UI框架(附源码)

    参考原视频链接: 【视频】:https://www.bilibili.com/video/BV1zT411b7L3/ 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入 开发一款游戏美术成本是极其高昂的,以我们常见的宣传片CG为例,动辄就要成百上千万的价格,因此这种美术物料一般只

    2024年02月11日
    浏览(42)
  • 【unity之UI专题】—UI如此简单之UGUI六大组件(GIF思维导图详解)

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity常用API 👽 ScreenSpace —overlay(覆盖模式) UI组件一直显示在屏幕前,覆盖所有 对应图示: 👽 ScreenSpace—Camera 摄像机模式 摄像机不

    2023年04月11日
    浏览(49)
  • 【简单详细】Unity生成地形和UI小地图实时展示人物位置的详细制作过程

    效果: 注意:一个 父物体 Map是一个纯白色image,放到左上角,要加 Mask组件 哦!!!       它的 两个子物体, 其中一个(map)是显示出地图纹理的image,另外一个(mapPlayer)是一个小点,我们也用image来表示,也就是效果图上的 绿点 。     我们把人物放进去,挂载脚本

    2024年02月05日
    浏览(38)
  • Unity引导路径箭头Shader

    看了大佬恬静小魔龙的帖子,正好有这个需求,然后复制过来使用,但是发现,复制过来后,箭头导向的路径中,只有一个箭头,这显然不能满足我当下的需求,所以改了一下Shader。 先看改进后的效果 1.大佬的Shader中 Properties只有两个属性:_MainTex和_ScrollYSpeed。 我增加了一个

    2024年02月19日
    浏览(40)
  • Unity XR 教程专栏引导

    下面对我出过的 Unity XR 开发教程做个分类: XR Interaction Toolkit 系列教程 该专栏介绍了用 OpenXR + XR Interaction Toolkit 开发的基础用法,学习后能够对 XR 开发中的手部动画,移动,转向,传送,UI,抓取,射线交互,触控(Poke)交互,全身模型适配等常用功能的实现有个初步了解

    2024年02月12日
    浏览(27)
  • 【Unity】UnityHub创建项目强制安装PlasticSCM问题

      先说一下PlasticSCM是什么东西?这个是Unity官方出的一款分布式版本控制软件,类似于Git。我也只是粗略的用了一下,也不能说不好用,因为Unity提供了专属的Package包用于提供PlasticSCM相关的编辑器拓展界面,使用起来和Unity比较契合、比较方便。但是目前还是Git、SVN是主流

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包