当前位置:   article > 正文

Unity XR Interaction Toolkit(四)VR按钮_unity的xr模拟器怎么交互button

unity的xr模拟器怎么交互button

制作一个可以用手柄按下的按钮

这个功能不用三中的Transformer,因为按钮不用跟着手柄移动,所以是一个静止的物体

(如果能帮到你,请点一个赞吧)

首先创建一个空物体,添加刚体,关闭刚体的重力Use Gravity打开Is Kinematic

创建一个子物体在这个空物体下,放置按钮的模型,并添加碰撞体

这个物体也可以跟射线交互,如果想只能近距离交互,就修改手柄和物体的交互层级

创建一个脚本ButtonInteractable,继承XRBaseInteractable,删掉所有函数

首先重写ProcessInteractable函数,由于父类会在Dynamic和OnBeforeRender两个模式下运行,逻辑需要二选一,ProcessInteractable会一直运行,相当于Update

然后需要判断在物体被Hovered时候,按钮跟随手柄移动,并且需要两个函数,设置按钮在物体上方的方向,设置和获取高度

还需要在手柄触摸物体时,获取接触点到按钮坐标之间的偏差值,手柄结束Hover的时候,恢复按钮的初始高度

最后上代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Unity.XR.CoreUtils;
  4. using UnityEngine;
  5. using UnityEngine.XR.Interaction.Toolkit;
  6. public class ButtonInteractable : XRBaseInteractable
  7. {
  8. [SerializeField] Transform buttonTransform;
  9. float initHeight;
  10. float offset;
  11. private void Start()
  12. {
  13. initHeight = GetButtonHeight(buttonTransform.position);
  14. }
  15. protected override void OnEnable()
  16. {
  17. base.OnEnable();
  18. hoverEntered.AddListener(StartPush);
  19. hoverExited.AddListener(StopPush);
  20. }
  21. protected override void OnDisable()
  22. {
  23. base.OnDisable();
  24. hoverEntered.RemoveListener(StartPush);
  25. hoverExited.RemoveListener(StopPush);
  26. }
  27. void StartPush(HoverEnterEventArgs args)
  28. {
  29. var interactor = args.interactorObject;
  30. var interactorAttachPose = interactor.GetAttachTransform(this).GetWorldPose();
  31. offset = GetButtonHeight(interactorAttachPose.position);
  32. offset -= GetButtonHeight(buttonTransform.position);
  33. }
  34. void StopPush(HoverExitEventArgs args)
  35. {
  36. SetButtonHeight(initHeight);
  37. }
  38. public override void ProcessInteractable(XRInteractionUpdateOrder.UpdatePhase updatePhase)
  39. {
  40. switch (updatePhase)
  41. {
  42. case XRInteractionUpdateOrder.UpdatePhase.Dynamic:
  43. UpdateTarget();
  44. break;
  45. }
  46. }
  47. private void UpdateTarget()
  48. {
  49. if (isHovered)
  50. {
  51. var interactor = interactorsHovering[0];
  52. var interactorAttachPose = interactor.GetAttachTransform(this).GetWorldPose();
  53. float y = GetButtonHeight(interactorAttachPose.position);
  54. SetButtonHeight(y - offset);
  55. }
  56. }
  57. private void SetButtonHeight(float y)
  58. {
  59. y = Mathf.Clamp(y, 0, initHeight);
  60. buttonTransform.position = transform.position + transform.up * y;
  61. }
  62. private float GetButtonHeight(Vector3 pos)
  63. {
  64. return Vector3.Dot(transform.up, pos - transform.position);
  65. }
  66. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/926906
推荐阅读
相关标签
  

闽ICP备14008679号