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(),就是单位圆中点的坐标。