纳溪区城乡住房建设局网站公司内部网站管理系统

当前位置: 首页 > news >正文

纳溪区城乡住房建设局网站,公司内部网站管理系统,吉林省建设厅网站,h5微网站建设多少钱文章目录 #x1f4d5;教程说明#x1f4d5;交互事件概述#x1f4d5;自定义交互逻辑⭐方法一#xff1a;Inspector 面板赋值⭐方法二#xff1a;纯代码处理 此教程相关的详细教案#xff0c;文档#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量… 文章目录 教程说明交互事件概述自定义交互逻辑⭐方法一Inspector 面板赋值⭐方法二纯代码处理 此教程相关的详细教案文档思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量 XR 社区博主目前在内担任 XR 开发的讲师。此外该社区提供教程答疑、及时交流、进阶教程、外包、行业动态等服务。 社区链接 Spatial XR 高级社区知识星球 Spatial XR 高级社区爱发电 教程说明 这篇教程将会介绍如何用 Meta XR SDK自定义交互事件触发时执行的逻辑。最后会实现一个功能用手指点击 UI 按钮后在前方召唤一把剑。 环境配置可参考https://blog.csdn.net/qq_46044366/article/details/133967343 配置一个基本的玩家物体可以参考前几期教程https://blog.csdn.net/qq_46044366/article/details/134097455 系列教程专栏https://blog.csdn.net/qq_46044366/category_12118293.html 配套的视频链接 上半部分https://www.bilibili.com/video/BV1rK4y1B7Zs 下半部分https://www.bilibili.com/video/BV1vT4y1p7EK ​电脑操作系统Windows 11 使用的 VR 设备Meta Quest 3Quest 系列都适用 使用的 Unity 版本2021.3.5 LTS (这里推荐使用 2021 及以上的 LTS 版本) Meta XR SDK 版本v57 官方文档https://developer.oculus.com/documentation/unity/unity-gs-overview/ Event Wrapper 介绍文档 https://developer.oculus.com/documentation/unity/unity-isdk-event-wrappers/ 最终效果 交互事件概述 交互事件是 XR 开发中经常使用的一个东西。当一个交互动作发生的时候可能会伴随着一些事情的发生。比如点击一个 “游戏开始” 的UI按钮就会触发 “游戏开始” 事件从而对游戏场景里的一些东西进行初始化。这个时候 “点击UI按钮” 就是一个交互事件对游戏场景里的东西初始化就是这个事件触发后需要执行的事。在 Meta XR SDK 中交互事件一般会在一个交互过程中的不同状态下触发以点击 UI 按钮为例这个动作属于 Poke 交互我们知道交互的发生需要有 Interactor 和 Interactable 两个对象的参与那么 Poke 交互对应的 Interactor 在手上对应的 Interactable 在 UI 按钮物体上。对于 UI 按钮这个 Interactable 来说当手指靠近按钮的时候按钮自身会进入到 Hover 状态这个时刻就可以当作一个交互事件发生了。然后当手指点击到按钮将按钮按到底的时候按钮自身会进入到 Select 状态这边需要注意的是对于一个可以被推动的按钮来说必须要推到底也就是推到按钮 Surface 的位置才会进入到 Select 状态当手指刚刚触碰到按钮表面的时候是不会进入到 Select 状态的。那么进入到 Select 状态这个瞬间也可以当作一个交互事件发生了。 其实前几期教程我们已经有接触到交互事件我这里是在场景中添加了一个 Poke 教程里配置的 UI 按钮教程链接Unity Meta Quest 一体机开发十二【手势追踪】Poke 交互 - 用手指点击由 3D 物体制作的 UI 按钮。 比如按钮身上的 Interactable Color Visual 脚本这个脚本能够实现物体在进入不同状态的时候改变物体的颜色。那么这就和交互事件的概念比较像了进入到不同的状态相当于不同交互事件的触发改变颜色相当于事件触发后执行的事。Meta XR SDK 会自动检测相应的交互事件什么发生但是这个脚本把交互事件触发后执行的逻辑写死了它只能改变物体的颜色无法处理其他的事。而接下来我会介绍如何去自定义交互事件触发时执行的逻辑。 自定义交互逻辑 Meta XR SDK 提供了一个 EventWrapper 的概念叫做事件包装器官方文档https://developer.oculus.com/documentation/unity/unity-isdk-event-wrappers/。它能够处理 Interaction SDK 中的一些交互事件并且我们能够自定义交互事件发生时执行的逻辑。如下图所示Meta 提供了不同类型的 EventWrapper 我们这期教程主要关注可交互物体也就是 Interactable 的交互事件那么可以使用这两种 EventWrapperInteractableUnityEventWrapper 和 PointableUnityEventWrapper。这两个脚本有一些相同的交互事件也有一些不同的交互事件。不过最常用的是下图中标出的 4 个共同的交互事件 Hover 是悬停的状态Interactor 靠近 Interactable 的时候触发。当交互动作完成的时候也就是 Interactor 选中 Interactable 时由 Hover 状态转变为 Select 状态。 我们这期教程会介绍 InteractableUnityEventWrapper 脚本的用法它用起来会稍微简单一点。 我们需要把 InteractableUnityEventWrapper 脚本添加到 UI 按钮物体上 我们可以在脚本的 Inspector 面板上看到这个脚本提供的交互事件。 ⭐方法一Inspector 面板赋值 Event Wrapper 提供交互事件并且检测交互事件什么时候触发。但是触发交互事件后需要执行什么事情需要我们自己处理。第一种处理方式是在 Event Wrapper 脚本的 Inspector 面板上直接进行赋值。我们会实现按下 UI 按钮后在前方生成一把剑的功能判断什么时候按下 UI 按钮会由 Event Wrapper 来处理我们这里把按下 UI 按钮视为 Select 交互事件触发也就是将按钮按到底的时候触发 Select 事件然后执行生成剑的逻辑。那么我们需要自己写个脚本实现生成物体的功能然后让 Event Wrapper 在判断到 Select 事件触发时去调用我们脚本中生成物体的方法。 脚本如下 using Oculus.Interaction; using System.Collections; using System.Collections.Generic; using UnityEngine;public class ItemSpawner : MonoBehaviour {public GameObject spawnObj;public Transform spawnPoint;public void SpawnItem(){GameObject obj GameObject.Instantiate(spawnObj);obj.transform.position spawnPoint.position;} } spawnObj 是需要生成的物体spawnPoint 是物体生成的位置SpawnItem 方法负责将需要生成的物体生成在需要生成的位置上。 然后将这个脚本挂载到按钮物体身上并且在面板上进行赋值 我这边将一个剑的模型制作成了 Prefab拖到了 spawnObj 变量上。然后在按钮物体上新建了一个子物体作为生成剑的位置。 我们可以在场景中调整 SpawnPoint 子物体的位置。 然后点击 InteractableUnityEventWrapper 脚本上的 WhenSelect 事件的 “”号进行事件触发执行逻辑的添加 当按钮被按到底的时候 WhenSelect 事件触发然后调用 SpawnButton 物体上的 ItemSpawner 脚本中的 SpawnItem 方法在设定的生成点生成剑的游戏物体。 ⭐方法二纯代码处理 我们修改 ItemSpawner 脚本 using Oculus.Interaction; using System.Collections; using System.Collections.Generic; using UnityEngine;public class ItemSpawner : MonoBehaviour {public GameObject spawnObj;public Transform spawnPoint;private InteractableUnityEventWrapper eventWrapper;void Start(){eventWrapper GetComponentInteractableUnityEventWrapper();eventWrapper.WhenSelect.AddListener(SpawnItem);}private void OnDestroy(){eventWrapper.WhenSelect.RemoveListener(SpawnItem);}public void SpawnItem(){GameObject obj GameObject.Instantiate(spawnObj);obj.transform.position spawnPoint.position;} } 和方法一的区别是我们在代码中获取了 InteractableUnityEventWrapper 脚本然后用代码为 InteractableUnityEventWrapper 的 WhenSelect 事件添加了事件触发后需要执行的方法。 InteractableUnityEventWrapper 的 WhenSelect 事件的监听器AddListener 方法需要传入一个 UnityAction 类型的参数。UnityAction 是 Unity 中的一种委托类型可以绑定无返回值无参数的方法。我们写的 SpawnItem 方法正好符合条件所以能直接传入 AddListener 方法中相当于我们把 SpawnItem 方法的执行委托给了 Event Wrapper当 Event Wrapper 检测到 WhenSelect 事件触发后会执行我们委托的事情也就是调用 SpawnItem 方法在设定的生成点生成指定的物体。 另外需要注意的是当我们调用了 AddListener 后需要在合适的地方调用 RemoveListener 方法将事件监听器移除掉。 如果我们选用纯代码的方法处理交互事件就不用在 Unity 的 Inspector 面板中拖拽赋值了。然后 ItemSpawner 脚本需要和 InteractableUnityEventWrapper 脚本挂载到同一个游戏物体身上。 最终效果