【VR】(一)Unity3d开发 VR使用手柄圆盘控制 人物移动(平移)
【摘要】 推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875 一、前言HTC vive手柄各个按钮的响应事件,已实现的功能是按手柄上的原盘上下左右键移动,是平移,不是射线瞬移。这种方式在眼镜里太晕了。 二、代码using UnityEngine; using System.Collections; public class Move ...
推荐阅读
一、前言
HTC vive手柄各个按钮的响应事件,已实现的功能是按手柄上的原盘上下左右键移动,是平移,不是射线瞬移。这种方式在眼镜里太晕了。
二、代码
using UnityEngine;
using System.Collections;
public class Move : MonoBehaviour {
/// <summary>
/// 手柄位置
/// </summary>
SteamVR_TrackedObject tracked;
/// <summary>
/// 玩家
/// </summary>
public Transform player;
/// <summary>
/// 方向
/// </summary>
public Transform dic;
/// <summary>
/// 速度
/// </summary>
public float speed;
void Awake()
{
//获取手柄控制
tracked = GetComponent<SteamVR_TrackedObject>();
}
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void FixedUpdate()
{
var deviceright = SteamVR_Controller.Input((int)tracked.index);
//按下圆盘键
if (deviceright.GetPress(SteamVR_Controller.ButtonMask.Touchpad))
{
Vector2 cc = deviceright.GetAxis();
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);
}
}
else if (deviceright.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
{
Debug.Log("按下扳机键");
}
else if (deviceright.GetPressDown(SteamVR_Controller.ButtonMask.Grip))
{
Debug.Log("按下手柄侧键");
}
else if (deviceright.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu))
{
Debug.Log("按下手柄菜单键");
}
else if (deviceright.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu))
{
Debug.Log("按下手柄菜单键");
}
}
/// <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;
}
}
```
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)