HTC Vive手柄圆盘控制角色移动
来源:互联网 发布:数学建模常用算法 编辑:程序博客网 时间:2024/05/17 03:36
这篇文章主要写的是通过手柄控制移动在场景中漫游。
在通过手柄控制移动时,我主要写了两个脚本一个ChildTransform.cs、Move.cs;
1、 ChildTransform这个脚本主要是为了获取头部Y轴方向的转动。以及头部在x、z轴方向的移动。将这个信息赋值给这个脚本绑定的对象身上。
2、 Move这个脚本主要是为了控制玩家的移动的,移动的方向是依据绑定ChildTransform这个脚本的transform信息。
这样就能实现,头盔转动控制移动的方向,手柄中touchPad的上、下、左、右控制移动的向前、向左、向右、向后移动。
操作步骤:
1、 首先我们需要先创建一个空对象,命名为moveDic。
2、 然后将脚本ChildTransform绑定在moveDic上。
3、 将Camera(head)赋值给ChildTransform的Same变量。
这个就能将Camera(head)的方向信息赋值给moveDic。
脚本
Movie.cs 有3个公共变量:
1、 Player:将 [Camera Rig]赋值给它。
2、 Dic:将moveDic赋值给它。
3、 Speed:主要是控制移动的速度。
using UnityEngine;using System.Collections;public class ChildTransform : MonoBehaviour{ public Transform same; void FixedUpdate() { transform.localEulerAngles = new Vector3(0, same.localEulerAngles.y, 0); transform.localPosition = new Vector3(same.localPosition.x, 0, same.localPosition.z); }}
using System.Collections;using System.Collections.Generic;using UnityEngine;using HTC.UnityPlugin.Vive;using HTC.UnityPlugin.Pointer3D;public class Move : MonoBehaviour {/// <summary>/// 玩家/// </summary>public Transform player;/// <summary>/// 方向 /// </summary>public Transform dic;/// <summary>/// 速度/// </summary>public float speed;public GameObject targetObj = null;private ReticlePoser rp;void Awake(){rp = GameObject.Find ("VivePointers/Right/Reticle").GetComponent<ReticlePoser>();} // Update is called once per framevoid FixedUpdate () {targetObj = rp.raycaster.FirstRaycastResult().gameObject;//按下圆盘键if (ViveInput.GetPress(HandRole.RightHand,ControllerButton.PadTouch)){Vector2 cc = ViveInput.GetPadTouchAxis(HandRole.RightHand);float angle = VectorAngle(new Vector2(1, 0), cc);//下if (angle > 45 && angle < 135){player.Translate(-dic.forward * Time.deltaTime * speed);}//上 else if (angle < -45 && angle > -135){//Debug.Log("上");player.Translate(dic.forward * Time.deltaTime * speed);}//左 else if ((angle < 180 && angle > 135) || (angle < -135 && angle > -180)){//Debug.Log("左");player.Translate(-dic.right * Time.deltaTime * speed);}//右 else if ((angle > 0 && angle < 45) || (angle > -45 && angle < 0)){//Debug.Log("右");player.Translate(dic.right * Time.deltaTime * speed);}} if (ViveInput.GetPress(HandRole.LeftHand,ControllerButton.Pad)) { Vector2 cc = ViveInput.GetPadTouchAxis(HandRole.LeftHand); float angle = VectorAngle(new Vector2(1, 0), cc); //下 if (angle > 45 && angle < 135) { player.Translate(-dic.up * Time.deltaTime * speed); } //上 else if (angle < -45 && angle > -135) { //Debug.Log("上"); player.Translate(dic.up * Time.deltaTime * speed); } }}//void OnTriggerEnter(Collider collider){//Debug.Log("cube");//}//void OnCollisionEnter(){//Debug.Log("cube");//}/// <summary>/// 根据在圆盘才按下的位置,返回一个角度值/// </summary>/// <param name="from"></param>/// <param name="to"></param>/// <returns></returns>float VectorAngle(Vector2 from, Vector2 to){float angle;Vector3 cross = Vector3.Cross(from, to);angle = Vector2.Angle(from, to);return cross.z > 0 ? -angle : angle;}}
Move脚本主要是根据
deviceright.GetAxis()获取在TouchPad中按下的位置信息,然后与(0,1)点求夹角。然后根据这个角度来判断在按下是TouchPad的上、下、左、右。
其实TouchPad就相当于一个半径为1的圆(单位圆)。而GetAxis(),就是单位圆中点的坐标。
阅读全文
0 0
- HTC Vive手柄圆盘控制角色移动
- Unity +HTC VIVE 虚拟现实开发— 手柄控制
- HTC vive开发:关于手柄按键对接控制
- HTC vive开发:关于手柄按键对接控制
- HTC-VIVE手柄使用代码
- unity开发 HTC vive手柄控制 手柄上各个按钮的点击事件
- Unity3d开发 HTC vive手柄控制 手柄上各个按钮的点击事件
- HTC VIVE 开发 移动
- HTC vive开发:关于手柄按键
- (Unity)HTC ViVe 之手柄震动
- HTC Vive 手柄发射射线功能
- Unity开发HTC vive 一、手柄按钮
- HTC Vive controller手柄运动方向识别
- HTC Vive controller手柄运动方向识别
- Unity开发HTC vive 一、手柄按钮
- HTC vive开发:关于手柄按键
- HTC VIVE手柄输入函数大全
- HTC Vive开发笔记之手柄震动
- Leetcode: 40. Combination Sum II(Week13, Medium)
- 文章标题
- CheBox
- ISCSI设备共享
- 剑指offer—和为s的两个数字
- HTC Vive手柄圆盘控制角色移动
- 阿里杨勇:浅谈 Linux 高负载的系统化分析
- 辅助类
- NVIDIA TK1 学习笔记(8):自动连接wifi
- 关于用spring-Mybatis用maven构建框架
- 距离和相似度度量方法
- 关于wpf设置属性的几种方式
- PXE全自动远程安装
- JAVA四大域对象总结