HTC Vive手柄圆盘控制角色移动_unity怎么用htc的手柄控制人物移动-程序员宅基地

技术标签: 技术·VR  技术·Unity3D  HTC  学习日记  

这篇文章主要写的是通过手柄控制移动在场景中漫游。 
在通过手柄控制移动时,我主要写了两个脚本一个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 frame
	void 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(),就是单位圆中点的坐标。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ax1274669874/article/details/78769208

智能推荐

基于OpenCPU方案的BC26 NB模组开发总结-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏30次。本文详细分析并介绍了基于opencpu方案开打bc26 NB模组的流程,主要分为开发工具套件的使用以及代码分析。_bc26

关于2022年12代C/C++Linux服务器开发高级架构师课程体系分析_202212.c.c.c-程序员宅基地

文章浏览阅读447次。C/C++Linux服务器高级架构师的课程到2022目前已经迭代到12代了,像之前小编也总结过,但是课程每期都有做一定的更新,也是为了更好的完善课程跟上目前互联网大厂的岗位技术需求,之前课程里面也包含了一些小的分支,其中就有音视频开发、Linux内核开发、DPDK、golang等等一些程序员所需要的硬核技术。今天总结分析是2022年最新的课程体系。_202212.c.c.c

基于单片机12864的出租车计价器设计-程序员宅基地

文章浏览阅读1.2k次,点赞10次,收藏13次。*单片机设计介绍,基于单片机12864的出租车计价器设计。

从零开始搭建一个GIS开发小框架(一)——基本框架_greatmaps-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏33次。使用GMap.Net控件从零开始搭建一个GIS开发小框架_greatmaps

c++ 泛型编程/提高编程/c++入门_c++泛型编程编译-程序员宅基地

文章浏览阅读344次。模板就是建立通用的模具,大大提高复用性。_c++泛型编程编译

7 重载自增和自减运算符-程序员宅基地

文章浏览阅读477次,点赞14次,收藏4次。运算符重载实际上是一种特殊形式的C++多态。重载运算符时,需要用到被称为运算符函数的特殊函数形式。运算符函数的函数名比较特殊,可以认为是operator关键字和运算符的组合。运算符函数也是一个函数,具有形参和返回值。运算符函数的定义如下:返回类型 operator 运算符符号(参数列表)函数体。_重载自增

随便推点

JavaEE 初阶篇-线程安全的集合类、多线程环境使用 ArrayList、队列、哈希表(HashMap 、ConCurrentHashMap 、HashTable 的区别)_java保存线程的集合-程序员宅基地

文章浏览阅读1.3k次,点赞47次,收藏44次。只对写操作进行加锁,加锁的方式仍然是 synchronized ,但是不是锁整个对象,而是“锁桶”,每一个链表的头节点作为锁对象,大大降低了锁冲突的概率。由于哈希表是由数组与链表或者红黑树组成的,数组的长度很长,因此相对链表的长度来说,链表的长度就很短了,所以在多线程中,对数组中的某一个链表大概率是不会冲突的,因此即使每一个链表都上锁了,这个锁也大概率是偏向锁,大概率是没有加锁和解锁的开销。扩容期间,新老数组同时存在。是一个线程安全的集合类,所有对 HashTable 的操作都是同步的,即线程安全的。_java保存线程的集合

图解翻译和详解深度学习GAN(含项目完整代码)_gan data flow-程序员宅基地

文章浏览阅读1.4k次。图解翻译和详解深度学习GAN(含项目完整代码)_gan data flow

windows下oracle静默安装包,windows静默安装Oracle11G脚本-程序员宅基地

文章浏览阅读261次。文章版权所有 Jusin Hao(luckyfriends) ,支持原创,转载请注明@echo offcd c:\md Oracle"C:\Program Files (x86)\WinRAR\winrar.exe" x C:\win64_11gR1_database.zip C:\Oraclecopy /y c:\refhost.xml c:\Oracle\database\stage\prer..._oracle 11g windows 静默安装

unity-shader(中级)_lightmode" shader-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏5次。与深度测试,透明度测试类似,决定一个片元是否被扔掉。深度测试的比较数据在深度缓冲中,透明度测试的比较对象是颜色缓冲中的值,而模版测试的比较数据在Stencil中,并且模板测试要先于深度测试与透明度测试,在fragment函数之前就会执行模板测试。参数描述Ref就是参考值,当参数允许赋值时,会把参考值赋给当前像素ReadMask对当前参考值和已有值进行mask操作,默认值255,一般不用WriteMask写入Mask操作,默认值255,一般不用Comp比较方法。CompAlways。......_lightmode" shader

zabbix 参数 脚本_zabbix 自己编写脚本进行监控-程序员宅基地

文章浏览阅读497次。第一步:编写shell脚本,要求输出结果为数值。如下统计磁盘io /读写,队列,繁忙率等#cat /opt/zabbix/list.sh# !/bin/bashdevice=$1 #监控那个磁盘:sda,sdbaction=$2 #监控项:read,write,queue还是utilstr=`iostat -d -x | grep 'util'`#str2=`echo "$str" | aw..._zabbix 脚本参数

python中csv库写入表头_python的pandas工具包,保存.csv文件时不要表头的实例-程序员宅基地

文章浏览阅读2.8k次。用pandas处理.csv文件时,有时我们希望保存的.csv文件没有表头,于是我去看了DataFrame.to_csv的document。发现只需要再添加header=None这个参数就行了(默认是True),下面贴上document:DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns..._pandas 写csv 表头