Unity3D-VR《静夜诗》3-开始按钮与开始文本信息

2023-11-15

凝视确认了开始按钮后,开始信息文本对象是和开始按钮对象将会一起消失的,应该把这样的可视对象都放到有个容器对象(父对象)中,在程序中只要设置容器对象消失了,其子对象也就一起消失了。

1.开始按钮及开始信息文本UI对象的设计

为实现开始文本显示及开始按钮凝视触发功能,在场景中设计UI对象如下:
在这里插入图片描述

1.1容器对象PanelBeginUI

通过Create | UI | Panel 添加容器对象,并命名PanelBeginUI,设置属性如上图。位置大小根据需要设定,这里给的仅是参考,设置旋转使得对象的Z方向朝前,否则文字会反方向显示的,背景图片在资源目录下有的。

1.2开始信息文本TextBegin

通过Create | UI | Text 添加文本对象,并命名TextBegin,设置属性如下。

在这里插入图片描述

1.3开始按钮BtnBegin

通过Create | UI | Button 添加按钮对象,并命名BtnBegin,设置属性如下。
在这里插入图片描述
因为按钮对象要凝视交互的,所以要为按钮对象添加盒子碰撞器,其大小能包住按钮对象即可,按钮对象的Image属相设置的图片在提供的资源目录中有的。

按钮对象下还有一个子对象Text,把它的默认显示文本改为“开始”。

接下来我们事先开始按钮的交互凝视功能。

2.开始按钮实现凝视触发

如果你已经理解前面宝剑交互对象的凝视转圈事件触发的代码,就可以类似的编写开始按钮事件触发的脚本了。参考ReticleTrigger_for_DispayTextTip脚本,新建脚本ReticleTrigger_for_ButtonStartPlay.cs,参考代码如下:

public class ReticleTrigger_for_ButtonStartPlay : MonoBehaviour {
	private VRReticleTriggerItem vrReticleTriggerItem;//处理准星精度条触发的类变量
	private void Awake ()
	{   //要保证对象也有VRReticleTriggerItem脚本
		vrReticleTriggerItem = GetComponent<VRReticleTriggerItem> () ?? gameObject.AddComponent<VRReticleTriggerItem>() ; 
	}

	//对象使能(激活)时调用
	private void OnEnable()
	{	//订阅事件
		vrReticleTriggerItem.OnTrigger += HandleTrigger;
	}

	//对象不使能(不激活)时调用
	private void OnDisable()
	{	//去掉订阅的事件,与OnEnable的语句对应
		vrReticleTriggerItem.OnTrigger -= HandleTrigger;
	}

	//准星凝视进度条满了后,要触发的事件代码
	void HandleTrigger ()
	{  //设置当前对象父对象不活动(不可见,不可交互)
        this.transform.parent.gameObject.SetActive(false); 
        Debug.Log("你触发了开始按钮");//后续程序逻辑可在这里继续编码
	}
}

把脚本ReticleTrigger_for_ButtonStartPlay挂在开始按钮BtnBegin对象上,试着运行。

测试:
准星凝视在按钮上,出现转圈进度条,凝视触发后,开始信息文本及按钮对象不见了,控制台提示“你触发了开始按钮”。

问题
仔细观测项目的实现要求,发现准心凝视开始按钮时,按钮的背景会变成另一种颜色,根据提供的资源,在资源目录下还有一个图片文件btn_Long-button.png是作为开始按钮刚凝视时显示用的图片,一旦凝视中止开始按钮的背景恢复为原来的图片即btn_black-button.png。这又如何实现呢?
实现思路
记得VRReticleTriggerItem脚本吗?目前它只提供OnTrigger事件供使用者订阅,为了实现凝视时的背景图片切换,我们希望VRReticleTriggerItem提供OnOVer、OnOut事件的订阅,以便在ReticleTrigger_for_ButtonStartPlay脚本中能捕捉到凝视移入移出的事件。修改后的VRReticleTriggerItem脚本参考如下:

public class VRReticleTriggerItem : MonoBehaviour {    
    //添加可订阅的事件变量
    public event Action OnOver;//凝视移入
    public event Action OnOut;//凝视移出
 
    //准星凝视移入对象上时调用   
    private void HandleOver()
    {
        if (OnOver!=null)
            OnOver();
    }

    //准星凝视移出对象时调用
    private void HandleOut()
    {
        isTrigger = false;
        timer = 0;
        imageProgressBar.fillAmount = 0f;//进度条填充置0 

        if (OnOut!=null)
            OnOut();
    }
}

这样VRReticleTriggerItem脚本具有订阅OnOver、OnOut事件的功能了,继续编辑ReticleTrigger_for_ButtonStartPlay脚本。完成后的参考代码如下(留意代码中的注释):

public class ReticleTrigger_for_ButtonStartPlay : MonoBehaviour {
	private Sprite normalImage;//原来的精灵图片
	public Sprite overImage;//准星经过时精灵图片	 
	private VRReticleTriggerItem vrReticleTriggerItem;//处理准星精度条触发的类变量
	private void Awake ()
	{   //要保证对象也有VRReticleTriggerItem脚本
         vrReticleTriggerItem = GetComponent<VRReticleTriggerItem> () ?? gameObject.AddComponent<VRReticleTriggerItem>() ;		
         normalImage = GetComponent<Image> ().sprite;//保存原来的精灵图片
	}

	//对象使能(激活)时调用
	private void OnEnable()
	{
		//订阅事件		
		vrReticleTriggerItem.OnTrigger += HandleTrigger;
        vrReticleTriggerItem.OnOver += HandleOver;
        vrReticleTriggerItem.OnOut += HandleOut;
    }

	//对象不使能(不激活)时调用
	private void OnDisable()
    {   //去掉订阅的事件
		vrReticleTriggerItem.OnTrigger -= HandleTrigger;
        vrReticleTriggerItem.OnOver -= HandleOver;
		vrReticleTriggerItem.OnOut  -= HandleOut;		
	}

	//准星移出对象时调用
	void HandleOut ()
	{
		this.gameObject.GetComponent<Image> ().sprite = normalImage;
	}

	//准星在对象上时调用
	void HandleOver ()
	{
		this.gameObject.GetComponent<Image> ().sprite = overImage;
	}

	//准星凝视进度条满了后,要触发的事件代码
	void HandleTrigger ()
	{   //设置当前对象父对象不活动(不可见,不可交互)
        this.transform.parent.gameObject.SetActive(false); 
        Debug.Log("你触发了开始按钮");
    }
}

保存代码后在开始按钮BtnBegin的属性面板中设置变量overImage对应的图片值。

测试:

  • 凝视在开始按钮时,出现凝视转圈,背景图片也切换了
  • 凝视移出按钮后转圈进度条消失,背景图片也恢复为原来的图片
  • 凝视转圈完成触发后,开始信息文本和按钮消失了。

提示

请同学们掌握访问父对象的方法,比如像这样调用父对象的函数SetActive(),说明如下:

this.transform  // 获取当前对象的Transform组件,返回的是Transform类型。
this.transform.parent //获取当前对象的Transform组件的父组件,返回的也是Transform类型。
this.transform.parent.gameObject //获取父组件所在的游戏对象,返回的是GameObject类型。
this.transform.parent.gameObject.SetActive(false) //设置父对象不活动。

思考:

  • 如果凝视在开始按钮,按钮变大些,凝视移出恢复原来大小,如何实现呢?
  • 凝视在开始按钮时,不用默认的转圈进度条,用按钮背景作为水平进度条,又如何实现呢?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity3D-VR《静夜诗》3-开始按钮与开始文本信息 的相关文章

  • c#获取cpu序列号

  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

    在制作AR模型数值控制方案的时候遇到了检测的问题 学习过程受益匪浅 故今天为大家整理带来一篇监控与检测物体的参考方案集合 目录 一 射线检测 二 物体存在检测 三 碰撞检测 一 射线检测 单射线检测 首先完成搭建场景如下图1 1 我这里用到
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • 解读 | VR体验式教育的优势 让教育触手可及

    大家好 我是极智视界 欢迎关注我的公众号 获取我的更多前沿科技分享 邀您加入我的知识星球 极智视界 星球内有超多好玩的项目实战源码和资源下载 链接 https t zsxq com 0aiNxERDq 很多孩子过多地沉浸在所谓的 传统教育
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void

随机推荐

  • LocalDateTime和Date得转换

    Java8 LocalDateTime获取时间戳 毫秒 秒 LocalDateTime与String互转 Date与LocalDateTime互转 LocalDateTime获取时间戳 毫秒 秒 LocalDateTime与String互转
  • vue3中JSX结合h()函数的用法简记

    vue3中JSX结合h 函数的用法简记 1 起因 为了实现表单设计通过左侧拖拽展示不同的组件 且这些组件内都渲染着一个公用的文本方法 删除和复制的功能 封装成一个组件CopyDelete 于是用到了如何通过h 函数将CopyDelete插入
  • 改变antd-mobile中Modal的进入方式

    增加属性maskTransitionName 和 transitionName maskTransitionName zoom transitionName zoom zoom样式是 scale 0 2 scale 1 参考文档
  • XML语言

    XML XML是可扩展的标记语言 标记语言 通过标签来描述数据的一门语言 标签有时我们也将其称之为元素 可扩展 标签的名字是可以自定义的 XML文件是由很多标签组成的 而标签名是可以自定义的 xml学习网站https www w3schoo
  • p51 thinkpad 拆解_ThinkPad P51自己加装内存操作图解

    把全部螺丝拧松之后 从缺口发力 分别沿着两个方向逐步拉开盖板 最终把整个盖板拆下来 第二步 拆键盘螺丝 打开大盖板之后 还有三个键盘螺丝要拆 具体位置如图所示 图片看不清的话 注意查看螺丝附近的标记 看到是键盘标记的就拆下来就对了 这是三根
  • 安装 jupyter 和 numpy,并运行jupyter,完成numpy的不少于10道的基础练习,熟悉矩阵运算。

    文章目录 一 安装Anaconda 1 在Anaconda Navigator中无法打开jupyter 二 使用jupyter notebook完成编程 1 引入库 2 基础练习 三 总结 四 引用 一 安装Anaconda 在官方网站即可
  • 微信小程序组件的传参

    父子关系 1 父向子传参 子组件 通过 properties 声明要从父组件中接收的数据 组件的属性列表 properties tabId String 父组件 通过自定义属性的形式传递数据 以子组件中定义的 key 为属性名 以要传递的数
  • 等保2.0二级安全要求

    第二级安全保护能力 应能够防护免受来自外部小型组织的 拥有少量资源的威胁源发起的恶意攻击 一般的自然灾害 以及其他相当危害程度的威胁所造成的重要资源损害 能够发现重要的安全漏洞和处置安全事件 在自身遭到损害后 能够在一段事件内恢复部分功能
  • Android中字母大小写切换的快捷键

    1 选中要切换到字母 eclipse ctrl shift x 转为大写 ctrl shift y 转为小写 2 Androidstudio字母大小写切换用一下方法或直接使用快捷键 大小写转换 Cmd Shift U Ctrl Shift
  • 使用Docker-compose部署redis主从

    废话少说 直接来上docker compose yaml文件 切记格式 version 2 networks myweb external name mysql docker compose myweb services redis mas
  • ICLR 2022最佳论文解读

    微信公众号 圆圆的算法笔记 持续更新NLP CV 搜推广干货笔记和业内前沿工作解读 后台回复 交流 加入 圆圆的算法笔记 交流群 回复 时间序列 多模态 迁移学习 NLP 图学习 表示学习 元学习 等获取各个领域干货算法笔记 今天给大家介绍
  • Nginx配置详情

    Nginx1 16 0安装详见 CentOS7 3编译安装LNMP之 一 Nginx 1 16 0安装 本文以nginx1 16 0编译安装版为例 目录如下 usr local nginx nginx的安装目录 usr local ngin
  • “logits”到底是个什么意思?

    1 什么是logits 说到Logits 首先要弄明白什么是Odds 在英文里 Odds的本意是指几率 可能性 它和我们常说的概率又有什么区别呢 在统计学里 概率 Probability 描述的是某事件A出现的次数与所有事件出现的次数之比
  • Map双列集合的四种遍历方式

    Map双列集合的四种遍历方式 第一种 键找值遍历方式 通过keySet 方法可以获取到所有键组成的Set集合 public Set
  • 关于Streamspot中StreamHash的介绍

    原文 Fast Memory efficient Anomaly Detection in Streaming Heterogeneous Graphs 在阅读这篇文章时 我对于文中所提到的StreamHash方法特别费解 在重复阅读了好几
  • 解决SwipeRefreshLayout和ViewPager滑动冲突的三种方案

    一篇文章读懂android事件消费 事件分发 事件拦截Android 源码分析事件分发机制 事件消费 事件拦截解决SwipeRefreshLayout和ViewPager滑动冲突的三种方案 在SwipeRefreshLayout的内部包一个
  • 论坛系统数据库设计

    论坛系统数据库设计 1 引言 2 QQ 摆烂式 设计 2 1数据表设计猜测 2 2分析增删查改实现方法 2 3分析QQ 摆烂式 的优缺点 2 4改进方法 3 盖楼式 设计 3 1数据表设计猜测 3 2数据表设计优化 4 推荐设计 1 引言
  • Matlab----下载和安装教程

    Matlab 下载 文件中有以下文件 Matlab 安装 步骤1 打开安装软件 步骤2 运行安装软件 在matlab 2018的文件夹下找到setup 选中右键以管理员身份运行 步骤3 选择使用文件安装密钥 然后点击下一步 步骤4 是否接收
  • 【1day】复现金和协同管理平台任意文件读取漏洞

    注 该文章来自作者日常学习笔记 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与作者无关 目录 一 漏洞描述 二 影响版本 三 资产测绘 四 漏洞复现 一 漏洞
  • Unity3D-VR《静夜诗》3-开始按钮与开始文本信息

    Unity3D VR 静夜诗 3 开始按钮与开始文本信息 1 开始按钮及开始信息文本UI对象的设计 1 1容器对象PanelBeginUI 1 2开始信息文本TextBegin 1 3开始按钮BtnBegin 2 开始按钮实现凝视触发 凝视