以编程方式触发触觉时,在Vive控制器上发出奇怪的哔哔声(Unity3D / SteamVR 2.0)

时间:2019-01-04 12:01:22

标签: c# unity3d htc-vive steamvr

当我使用SteamVR 2.0在Unity上以编程方式在Vive Wand上触发触觉时,在Unity上遇到了奇怪的行为。

我设法记录了它,以使您更好地理解它:https://www.youtube.com/watch?v=wq4OJUFghNI

基本上,我所做的只是一个简单的射击游戏,当您扣动扳机时,它每秒会发射3枚子弹并触发触觉。问题是,如果您在触觉代码触发后立即释放触发器,听起来控制器触觉仍停留在原处并且​​您会听到烦人的声音。触发触觉会停止发出声音。

我已经尝试过使用Google,但由于没有找到任何东西,因此似乎没人体验过。我试图更改功能的频率,持续时间或强度,但是它什么都没有改变(持续时间越短,出现这种行为的机会就越大,但这不是解决方法)

ShootingBehaviour.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;

namespace RG
{
    namespace VR
    {
        public class ShootingBehaviour : MonoBehaviour
        {
            private bool _IsShooting = false;
            private bool _GrabPinchPressed = false;

            public GameObject BulletPrefab;
            public SteamVR_Action_Vibration HapticAction;
            public SteamVR_Action_Boolean GrabPinch;
            public SteamVR_Input_Sources InputSource;

            private void Start()
            {
                if (InputSource == SteamVR_Input_Sources.Any)
                {
                    if (CompareTag("LeftController"))
                        InputSource = SteamVR_Input_Sources.LeftHand;
                    else if (CompareTag("RightController"))
                        InputSource = SteamVR_Input_Sources.RightHand;
                    else
                        Debug.LogError("Tag on the controller GameObject is incorrect, check again if 'LeftController' or 'RightController' has been assigned.");
                }
            }

            private void Update()
            {
                if (_GrabPinchPressed)
                {
                    Debug.Log("Trigger is currently pressed");
                    if (!_IsShooting && GetComponent<InteractableBehaviour>().CurrentlyEquipped)
                    {
                        HapticAction.Execute(0, 0.1f, 80, 150, InputSource);
                        StartCoroutine(_Shoot());
                    }
                }
            }

            private void OnEnable()
            {
                if (GrabPinch != null)
                    GrabPinch.AddOnChangeListener(_OnTriggerPressedOrReleased, InputSource);
            }

            private void OnDisable()
            {
                if (GrabPinch != null)
                    GrabPinch.RemoveOnChangeListener(_OnTriggerPressedOrReleased, InputSource);
            }

            private void _OnTriggerPressedOrReleased(SteamVR_Action_In action_In)
            {
                if (GrabPinch.GetStateDown(InputSource))
                    _GrabPinchPressed = true;
                else if (GrabPinch.GetStateUp(InputSource))
                    _GrabPinchPressed = false;
            }

            private IEnumerator _Shoot()
            {
                _IsShooting = true;

                GameObject weapon = GetComponent<InteractableBehaviour>().CurrentlyEquipped;
                GameObject bullet = Instantiate(BulletPrefab, weapon.transform.Find("BulletStartPos"));

                bullet.transform.SetParent(null);
                bullet.GetComponent<Rigidbody>().AddForce(bullet.transform.forward * 300);

                yield return new WaitForSeconds(0.3f);

                _IsShooting = false;
            }
        }
    }
}

InteractableBehaviour只是将武器存储在手中,表明那里并没有真正的帮助。

此处的HapticAction.Execute正确地触发了触觉,但由于某些原因,看起来有些东西在有时引起了触觉的干扰。有人知道为什么要这么做吗?

2 个答案:

答案 0 :(得分:0)

类似于Shoko84所述,振幅参数没有区别。 实际上,在调用HapticAction.Execute

时,这些参数似乎都没有任何区别。

答案 1 :(得分:0)

我相信参数有奇怪的局限性。 持续时间:0至.79 频率是0到320 幅度是0到.25

如果您超过这些值中的任何一个,它们只是最大值。这就是为什么您看不到振幅0.2和1之间几乎没有差异(强度差异为.o5)的原因