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;
}
}
新建一个物体“游戏菜单”,挂载脚本
将菜单的画布设置为游戏菜单的子物体
设置脚本的参数