欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > unity pico开发 五 UI交互

unity pico开发 五 UI交互

2025/3/15 22:30:11 来源:https://blog.csdn.net/weixin_44568736/article/details/145988342  浏览:    关键词:unity pico开发 五 UI交互

文章目录

    • 添加画布
    • 添加交互组件
    • 取消传送射线对UI的控制
    • 解决按扳机键会传送的冲突
    • 按下按键呼出菜单,并让菜单出现在头的前方

添加画布

创建一个新画布,添加一个Button,将画布改为world space,然后缩放改为0.001,调整到合适的位置

添加交互组件

1 为画布添加Tracked Device Graphic Raycaster
在这里插入图片描述
2 找到eventSystem,删除自带的输入模块
在这里插入图片描述
然后添加XR UI Input Modeule
在这里插入图片描述

此时即可进行交互,triiger键是鼠标左键,注意画布本身不受interactionToolkit的layer影响,任何射线都可以控制他

取消传送射线对UI的控制

取消勾选这个
在这里插入图片描述

解决按扳机键会传送的冲突

由于我设置的传送按键是扳机键,在点击UI时会同时触发传送
解决思路是,当抓取射线在UI上时,禁用传送射线,用抓取射线进行UI交互
编写脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.XR.Interaction.Toolkit;public class ActivateTeleportationRay : MonoBehaviour
{public GameObject leftTeletportation;public GameObject rightTeletportation;public InputActionProperty leftActivate;public InputActionProperty rightActivate;public InputActionProperty leftCancel;public InputActionProperty rightCancel;public XRRayInteractor leftRay;public XRRayInteractor rightRay;private void Update(){leftRay.TryGetHitInfo(out Vector3 leftPos,out Vector3 leftNormal,out int leftNumber,out bool leftValid);//抓取射线指向了交互物体(UI或可抓取物体),没有按下抓取键,已经扣动了扳机,才激活传送射线leftTeletportation.SetActive(!leftValid&&leftCancel.action.ReadValue<float>() == 0&&leftActivate.action.ReadValue<float>() > 0.1f);rightRay.TryGetHitInfo(out Vector3 rightPos, out Vector3 rightNormal, out int rightNumber, out bool rightValid);rightTeletportation.SetActive(!rightValid&&rightCancel.action.ReadValue<float>() == 0&&rightActivate.action.ReadValue<float>() > 0.1f);}
}

在这里插入图片描述

按下按键呼出菜单,并让菜单出现在头的前方

编写如下脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;public class GameMenuManager : MonoBehaviour
{public GameObject menu;public InputActionProperty showButton;public Transform head;public float spawnDistance = 2;void Update(){if (showButton.action.WasPressedThisFrame()){menu.SetActive(!menu.activeSelf);menu.transform.position = head.position + new Vector3(head.forward.x,0,head.forward.z).normalized*spawnDistance;}menu.transform.LookAt(new Vector3(head.position.x, menu.transform.position.y, head.position.z));menu.transform.forward *= -1;}
}

新建一个物体“游戏菜单”,挂载脚本
将菜单的画布设置为游戏菜单的子物体
在这里插入图片描述
设置脚本的参数
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词