HTCVivexbox360手柄无法识别别怎么回事,求大神帮助。

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
_____________________________________________________________________________________________________________
问答求助版块规则:
  1、问题尽量描述清楚
& && &2、代码要放在代码块里
& && &3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
& && &5、问题得到解决,请选择最佳答案。
& && &6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 1344|回复: 9
HTC Vive + Unity 如何判断按下手柄上的哪个按钮??
5854/1000排名<font color="#FF昨日变化2主题帖子积分
熟悉之中, 积分 854, 距离下一级还需 146 积分
熟悉之中, 积分 854, 距离下一级还需 146 积分
蛮牛币2030
在线时间251 小时
在HTC Plugin的SteamVR_TestThrow场景中通过按下扳机按钮生成一个指定的Gameobject
if (joint != null && device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))判断是否按下扳机,
我接着写下if (device.GetTouchUp(EVRButtonId.k_EButton_DPad_Up))用来判断是否按下触摸板的上并打印log,结果运行不管按手柄上的哪个键都没有打印出我写的log。
是我判断条件有么,正确的应该怎样写??请大神解答一二,谢谢!
每日推荐:
9排名<font color="#FF昨日变化主题帖子积分
蛮牛币8802
在线时间720 小时
[C#] 纯文本查看 复制代码//========= Copyright 2015, Valve Corporation, All rights reserved. ===========
// Purpose: Test SteamVR_Controller support.
//=============================================================================
using UnityE
using System.Collections.G
using Valve.VR;
/// &summary&
/// 测试手柄脚本
/// &/summary&
public class SteamVR_TestController : MonoBehaviour
//手柄索引
List&int& controllerIndices = new List&int&();
/// &summary&
/// 引发设备连接事件
/// &/summary&
/// &param name=&args&&Arguments.&/param&
private void OnDeviceConnected(params object[] args)
//参数0为OpenVR系统的索引
var index = (int)args[0];
//OpenVR系统
var system = OpenVR.S
//没有获取到则返回
if (system == null || system.GetTrackedDeviceClass((uint)index) != ETrackedDeviceClass.Controller)
//参数1为是否连接
var connected = (bool)args[1];
//为真则Log连接到的手柄索引,打印其状态,并将该索引添加到手柄索引中
if (connected)
Debug.Log(string.Format(&Controller {0} connected.&, index));
PrintControllerStatus(index);
controllerIndices.Add(index);
//反之Log未连接,打印其状态,并将该索引从列表中移除
Debug.Log(string.Format(&Controller {0} disconnected.&, index));
PrintControllerStatus(index);
controllerIndices.Remove(index);
/// &summary&
/// 启用事件
/// &/summary&
void OnEnable()
//从工具事件从监听连接事件
SteamVR_Utils.Event.Listen(&device_connected&, OnDeviceConnected);
/// &summary&
/// 禁用事件
/// &/summary&
void OnDisable()
SteamVR_Utils.Event.Remove(&device_connected&, OnDeviceConnected);
/// &summary&
/// 打印手柄的状态
/// &/summary&
/// &param name=&index&&Index.索引&/param&
void PrintControllerStatus(int index)
var device = SteamVR_Controller.Input(index);
Debug.Log(&index: & + device.index);
Debug.Log(&connected: & + device.connected);
Debug.Log(&hasTracking: & + device.hasTracking);
Debug.Log(&outOfRange: & + device.outOfRange);
Debug.Log(&calibrating: & + device.calibrating);
Debug.Log(&uninitialized: & + device.uninitialized);
Debug.Log(&pos: & + device.transform.pos);
Debug.Log(&rot: & + device.transform.rot.eulerAngles);
Debug.Log(&velocity: & + device.velocity);
Debug.Log(&angularVelocity: & + device.angularVelocity);
//左右手判断
var l = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Leftmost);
var r = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost);
Debug.Log((l == r) ? &first& : (l == index) ? &left& : &right&);
EVRButtonId[] buttonIds = new EVRButtonId[] {
EVRButtonId.k_EButton_ApplicationMenu,
EVRButtonId.k_EButton_Grip,
EVRButtonId.k_EButton_SteamVR_Touchpad,
EVRButtonId.k_EButton_SteamVR_Trigger
//轴心id Touchpad是axis0
Trigger是axis1
EVRButtonId[] axisIds = new EVRButtonId[] {
EVRButtonId.k_EButton_SteamVR_Touchpad,
EVRButtonId.k_EButton_SteamVR_Trigger
//点和光标
public Transform point,
void Update()
//遍历索引 再一一检测
foreach (var index in controllerIndices)
var overlay = SteamVR_Overlay.
if (overlay && point && pointer)
var t = SteamVR_Controller.Input(index).
pointer.transform.localPosition = t.
pointer.transform.localRotation = t.
var results = new SteamVR_Overlay.IntersectionResults();
var hit = puteIntersection(t.pos, t.rot * Vector3.forward, ref results);
point.transform.localPosition = results.
point.transform.localRotation = Quaternion.LookRotation(results.normal);
//遍历按钮 上面只列举了菜单,紧握,触摸板,扳机四个按钮
foreach (var buttonId in buttonIds)
//按下事件
if (SteamVR_Controller.Input(index).GetPressDown(buttonId))
Debug.Log(buttonId + & press down&);
if (SteamVR_Controller.Input(index).GetPressUp(buttonId))
Debug.Log(buttonId + & press up&);
//如果松开扳机会震动
if (buttonId == EVRButtonId.k_EButton_SteamVR_Trigger)
SteamVR_Controller.Input(index).TriggerHapticPulse();
PrintControllerStatus(index);
if (SteamVR_Controller.Input(index).GetPress(buttonId))
Debug.Log(buttonId);
//遍历axisIds
foreach (var buttonId in axisIds)
if (SteamVR_Controller.Input(index).GetTouchDown(buttonId))
Debug.Log(buttonId + & touch down&);
if (SteamVR_Controller.Input(index).GetTouchUp(buttonId))
Debug.Log(buttonId + & touch up&);
if (SteamVR_Controller.Input(index).GetTouch(buttonId))
var axis = SteamVR_Controller.Input(index).GetAxis(buttonId);
Debug.Log(&axis: & + axis);
每日推荐:
装B如风,常伴吾身!
255/150主题帖子积分
初来乍到, 积分 55, 距离下一级还需 95 积分
初来乍到, 积分 55, 距离下一级还需 95 积分
在线时间37 小时
GetTouchUp&&触摸抬起事件
GetPressUp&&点击抬起事件
扳机,也就是Trigger键,那是个按钮,不会响应touch事件
每日推荐:
5854/1000排名<font color="#FF昨日变化2主题帖子积分
熟悉之中, 积分 854, 距离下一级还需 146 积分
熟悉之中, 积分 854, 距离下一级还需 146 积分
蛮牛币2030
在线时间251 小时
本帖最后由 冷筱曦 于
17:11 编辑
GetTouchUp&&触摸抬起事件
GetPressUp&&点击抬起事件
扳机,也就是Trigger键,那是个按钮,不会响应touch事件 ...
你说的是这样么if (device.GetPressDown(EVRButtonId.k_EButton_DPad_Up))我把touch改成了Press也没有打印出log的
谢谢你的回复
每日推荐:
255/150主题帖子积分
初来乍到, 积分 55, 距离下一级还需 95 积分
初来乍到, 积分 55, 距离下一级还需 95 积分
在线时间37 小时
你说的是这样么if (device.GetPressDown(EVRButtonId.k_EButton_DPad_Up))我把touch改成了Press也没有打印 ...
好吧,我纠正个我的错误 SteamVR_Controller.ButtonMask.Trigger 也就是EVRButtonId.k_EButton_SteamVR_Trigger 对于press和touch事件都会响应
EVRButtonId.k_EButton_DPad_Up/down/left/right 目前看来并不是VIVE手柄上的接口,可能是外部接入的手柄的按键(如ps左边方向键或者右边圆圈方块),至少我现在还有找到调用的方法,如果你想在点击touchpad的时候区分是在哪片区域,建议在点击时用Device.GetAxis然后自行划分区间
每日推荐:
5554/1000排名<font color="#FF昨日变化19主题帖子积分
熟悉之中, 积分 554, 距离下一级还需 446 积分
熟悉之中, 积分 554, 距离下一级还需 446 积分
在线时间193 小时
代码有误,if (device.GetTouchUp(EVRButtonId.k_EButton_DPad_Up))改为if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad))或者if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0))就可以在触摸手柄圆盘有显示了
[]: 一个袋子砸在了 我要成大神 头上,我要成大神 赚了 1
每日推荐:
61459/1500排名<font color="#FF昨日变化1主题帖子积分
蛮牛粉丝, 积分 1459, 距离下一级还需 41 积分
蛮牛粉丝, 积分 1459, 距离下一级还需 41 积分
在线时间511 小时
顶顶顶顶顶顶顶顶顶顶顶顶顶v
每日推荐:
5613/1000排名<font color="#FF昨日变化2主题帖子积分
熟悉之中, 积分 613, 距离下一级还需 387 积分
熟悉之中, 积分 613, 距离下一级还需 387 积分
在线时间210 小时
代码有误,if (device.GetTouchUp(EVRButtonId.k_EButton_DPad_Up))改为if (device.GetTouchDown(SteamVR_C ...
这个只是得到整个圆盘啊,不能单独得到某一个方向的按键啊
每日推荐:
5854/1000排名<font color="#FF昨日变化2主题帖子积分
熟悉之中, 积分 854, 距离下一级还需 146 积分
熟悉之中, 积分 854, 距离下一级还需 146 积分
蛮牛币2030
在线时间251 小时
放到手柄上测试成功了,触摸板半径大概为0.018,虽然这样写起来有点丑毕竟是解决了
[AppleScript] 纯文本查看 复制代码using S
using UnityE
using System.C
public class Direction : MonoBehaviour
//触摸点 在steamVR里手柄模型中trackpad_touch就是作为一个触摸的地方
//X、Z轴的对角线上到触摸板最边上的一点X的值 假设触摸板半径为5 由勾股定理反推 x=(斜边长Y的平方/2)开根
float x = (float)Math.Sqrt(25/2);
private float a,//点坐标x,z
void Start()
a = point.localPosition.x;
b = point.localPosition.z;
//测试 每次按下按钮或触摸获取触摸的的坐标
void Update()
if (Input.GetKeyDown(KeyCode.A))
a = point.localPosition.x;
b = point.localPosition.z;
ShowDirection(); //判断方向
Debug.Log(&a: & + a + &,b: & + b);
public void ShowDirection()
//点在两轴对角线形成的正方形之外
if (a & -x)//X轴为负 左
Debug.Log(&左&);
else if (a & x)//X轴为正 右
Debug.Log(&右&);
else if (b & x)//Z轴为正 上
Debug.Log(&上&);
else if (b & -x)//Z轴为负 下
Debug.Log(&下&);
//点在两轴对角线形成的正方形之内 并且 没有超出某个值范围 判定为中
//2这个值是只是大概估计,以触摸板正确大小计算,比如触摸板半径为1可以设置小于0.5f这样
else if (Math.Abs(a) &= 2 && Math.Abs(b) &= 2)
Debug.Log(&中&);
// Z轴大于设置的中键范围值 上 并且 Z轴大于X轴的绝对值
else if (b & x && b & 2 && Math.Abs(a) & b)
Debug.Log(&上&);
//跟上键相反
else if (b & -x && b & -2 && Math.Abs(a) & -b)
Debug.Log(&下&);
//X为正 在中键范围之外 并且 Z轴绝对值小于X 右
else if (a & x && a & 2 && b & a && b & -a)
Debug.Log(&右&);
//与右相反
else if (a & -x && a & -2 && b & -a && b & a)
Debug.Log(&左&);
每日推荐:
5854/1000排名<font color="#FF昨日变化2主题帖子积分
熟悉之中, 积分 854, 距离下一级还需 146 积分
熟悉之中, 积分 854, 距离下一级还需 146 积分
蛮牛币2030
在线时间251 小时
放到手柄上测试成功了,触摸板半径大概为0.018,虽然这样写起来有点丑毕竟是解决了
[mw_shl_code=ap ...
至于有些人使用的是steamVR 1.1.0可能找不到触摸点,可以用触摸板点击事件返回的padX,padY;这样的效果还没有测试,如果测试不通过的话在此帖继续讨论。
如果有更好的方法请分享下哦~
每日推荐:
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号
经过游戏蛮牛认证的蛮牛小翻译
连续签到30天
社区QQ达人
使用QQ帐号登录论坛的用户您的位置:
→ htc vive手柄按键失灵解决方法
htc vive手柄按键失灵解决方法
htc vive有部分玩家会发现手柄玩着玩着会偶尔失灵,但是在电脑上按一下控制器又好了,关于这个的解决方法可以来这里了解一下。手柄失灵解决方法:如果完成安装以后发现手柄识别不了,一个原因可能是因为手柄没电。这个就体现在启动手柄是指示灯为红灯状态,此时重新充回电就OK。另一个原因就是因为手柄固件版本低,当系统识别设备时,如果出现此类问题会出现提示。此时只要将手柄用数据线连接电脑,再点击固件更新,问题就解决。但其中存在一个这样的问题,比如就是一个手柄固件正常,一个手柄需要更新,但系统并没有提示是哪一个。手柄端也没有对应显示,此时只能一个一个试,如果连接主机后提示不用更新,那就是另一个手柄。还有就是两个手柄都连不上,按系统键蓝灯常亮一会就灭了,配对也不能配对。解决方案:首先确定手柄在基站定位范围内,其次确保充满电。接着确保使用的是WIN10专业版系统,接电脑USB2.0接口。最后启动steam,开启手柄电源等待配对提示。不行就重置手柄上四个键(四个键是:菜单键 +触摸板 +扳机键 +任意一个边按钮并且链接usb到pc 长按超过五秒)。
阅读此文的人还阅读了...尊敬的用户您好!因系统升级,暂时无法访问,给您带来的不便我们感到万分抱歉。论坛开放时间将另行通知,感谢您的理解与支持!
10 秒后自动跳转页面

我要回帖

更多关于 360手柄无法识别 的文章

 

随机推荐