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

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;
    }
}

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

相关文章:

  • PyTorch GPU显存管理与大规模张量操作
  • 虚拟网络IP设置
  • Focal Loss (聚焦损失) :解决类别不平衡与难易样本的利器,让模型学会“重点学习”
  • LINUX网络基础 - 网络编程套接字,UDP与TCP
  • Tauri跨平台开发问题及解决方案深度解析(React版)
  • 学生管理信息系统的需求分析与设计
  • 基于提示驱动的潜在领域泛化的医学图像分类方法(Python实现代码和数据分析)
  • 新一代信息技术:从技术范畴到未来趋势的全景洞察
  • 千峰React:组件与逻辑封装(下)
  • 神经网络 - 激活函数(Maxout 单元)
  • 【华为OD机试真题29.9¥】(E卷,100分) - IPv4地址转换成整数(Java Python JS C++ C )
  • 苹果iPhone 17 Pro系列将配备12GB内存,AI功能成升级关键
  • 2025机械考研复试面试问题汇总篇(含13门科目),考研机械复试专业面试常见重点问题总结!考研机械复试专业面试准备看这一篇就够了!
  • ArcGIS Pro高级应用:高效生成TIN地形模型
  • linux磁盘满了怎么安全删除文件
  • C++编程:常见内置算法
  • 详解Nginx no live upstreams while connecting to upstream
  • c++中的vector
  • 【GPU使用】如何在物理机和Docker中指定GPU进行推理和训练
  • 三、Redis 基本数据类型详解及典型应用场景
  • wordpress 自动升级/seo现在还有前景吗
  • 物业公司网站建设/seo关键词优化技术
  • 湖北移动网站建设/百度seo关键词排名优化工具
  • 番茄wordpress/seo 网站推广
  • 建立网站需要准备的材料/杭州关键词自动排名
  • 李沧做网站/下载百度app免费下载安装