Unity3D培训
美国上市Unity3D培训机构

400-111-8989

热门课程

在VRTK中合并Teleport和Rotate操作

  • 发布:Unity3D培训
  • 来源:Unity3D教程
  • 时间:2017-11-01 17:25

在VRTK中合并Teleport和Rotate操作

VR的交互设计中,Teleport(闪现传送)是最常用的距离移动手段,SnapRotation(视角旋转)则是快速改变角度的手段(Rec Room中被大量使用),因此用户如需要关注远方某个物体则需要两步操作——1 先Teleport 2 然后SnapRotation。姑且不说SnapRotation容易产生眩晕,对于交互心理学上来说,“少即是好”。所以有同学提出能不能把这两个操作合并在一次操作。

之后【几行代码】专题的代码都遵守干净原则:

1 代码量越少越好

2 依赖的资源越少越好

3 不修改现有插件源代码和美术资源

依循干净原则的伪思路是

1 找到VRTK中Teleport的回调函数(Enter、Exit、Set)的信息,将Arrow箭头画在Enter期间

2 注册Touchpad上的触碰回调函数(TouchpadAxisChanged),改变Arrow的位置和记录旋转量

3 在Teleport触发Set时将旋转量赋予CameraRig(PS:这里CameraRig的旋转轴为代表眼睛的Camera(eye))

首先制作一张Arrow的贴图和一个Arrow的prefab,多几个面片无所谓的话,可以用一个Cube快速完成

在VRTK中合并Teleport和Rotate操作
在VRTK中合并Teleport和Rotate操作

然后贴上代码:

[csharp] view plain copy

  1. using UnityEngine;  

  2. using VRTK;  

  3.   

  4. [RequireComponent(typeof(VRTK_Pointer))]  

  5. public class InteractionPoint : MonoBehaviour {  

  6.   

  7.     VRTK_Pointer pointer;  

  8.     VRTK_ControllerEvents events;   

  9.   

  10.     [SerializeField]  

  11.     GameObject arrow;  

  12.   

  13.     GameObject actualArrow;  

  14.   

  15.     bool isEnter = false;  

  16.     float angleOffset = 0;  

  17.   

  18.     private void Awake()  

  19.     {  

  20.         pointer = GetComponent<VRTK_Pointer>();  

  21.         pointer.DestinationMarkerEnter += onEnter;  

  22.         pointer.DestinationMarkerExit += onExist;  

  23.         pointer.DestinationMarkerSet += onSet;  

  24.   

  25.         events = GetComponent<VRTK_ControllerEvents>();  

  26.         events.TouchpadAxisChanged += DoRightTouchpadTouched;  

  27.   

  28.         actualArrow = Instantiate(arrow);  

  29.         actualArrow.SetActive(false);  

  30.     }  

  31.   

  32.     private void onEnter(object sender, DestinationMarkerEventArgs e)  

  33.     {  

  34.         actualArrow.SetActive(true);  

  35.         Vector3 position = e.destinationPosition;  

  36.         actualArrow.transform.position = position;  

  37.   

  38.         Vector3 forward = VRInteractController.CameraRig.position - position;  

  39.         actualArrow.transform.forward = new Vector3(forward.x, 0, forward.z);  

  40.         float startAngle = actualArrow.transform.eulerAngles.y;  

  41.         actualArrow.transform.eulerAngles = new Vector3(0, startAngle + angleOffset, 0);  

  42.   

  43.         isEnter = true;  

  44.     }  

  45.   

  46.     private void onExist(object sender, DestinationMarkerEventArgs e)  

  47.     {  

  48.         actualArrow.SetActive(false);  

  49.         isEnter = false;  

  50.         angleOffset = 0;  

  51.     }  

  52.   

  53.     private void onSet(object sender, DestinationMarkerEventArgs e)  

  54.     {  

  55.         if (pointer.enableTeleport)  

  56.             VRInteractController.CameraRig.RotateAround(VRInteractController.Head.position, Vector3.up, angleOffset);  

  57.     }  

  58.   

  59.     private void DoRightTouchpadTouched(object sender, ControllerInteractionEventArgs e)  

  60.     {  

  61.         if (isEnter)  

  62.         {  

  63.             angleOffset = e.touchpadAngle;  

  64.         }  

  65.     }  

  66.   

  67. }  

感谢大家阅读“在VRTK中合并Teleport和Rotate操作”希望对大家有所帮助,更多精彩内容请关注Unity3D官网

免责声明:本文由小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除

预约申请免费试听课

上一篇:Unity 5着色器编程经验分享
下一篇:Unity技术支持团队性能优化经验分享
Unity|超级兔子

Unity|超级兔子

Unity超级角色控制器物理API分析与功能实现

Unity超级角色控制器物理API分析与功能实现

教程:让Unity中物理效果更加逼真

教程:让Unity中物理效果更加逼真

Unity3D 软件下载

Unity3D 软件下载

选择城市和中心
贵州省

广西省

海南省