Странный звуковой сигнал на контроллере Vive при программном запуске тактильных ощущений (Unity3D/SteamVR 2.0)

Я столкнулся со странным поведением в Unity, когда запускал тактильные ощущения на Vive Wand программно в Unity со SteamVR 2.0.

Мне удалось записать это, чтобы вы лучше поняли: 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 здесь корректно запускает тактильные ощущения, но похоже, что по каким-то причинам иногда что-то дает сбои. У кого-нибудь есть идея, почему это делается?


person Shoko84    schedule 04.01.2019    source источник
comment
что в этой _Shoot() сопрограмме? / Где установлен _IsShooting ? Также обратите внимание, что вызов GetComponent<InteractableBehaviour>() довольно неэффективен, и вам лучше сделать это, например. в Awake и сохранить результат на потом   -  person derHugo    schedule 04.01.2019
comment
Также я не нашел HapticAction в SteamVr sdk, поэтому, если это то, что вы реализовали... Вы также добавляете это, пожалуйста?   -  person derHugo    schedule 04.01.2019
comment
Однако я нашел SteamVR_Action_Vibration, если вы имеете в виду Вон тот. Там написано, что для третьего параметра "amplitude">How intense the haptic action should be (0 - 1) вы вызываете его с помощью 150 ... ?   -  person derHugo    schedule 04.01.2019
comment
Я отредактировал свой вопрос и добавил весь файл ShootingBehaviour.cs, чтобы убедиться, что ничего не пропало, но я не думаю, что это поможет, поскольку режим стрельбы работает, а не тактильный. Не буду ссылаться на InteractableBehaviour.cs примерно по тем же причинам, о которых я упоминал. HapticAction.Execute не является моей функцией и, кстати, является частью SteamVR 2.0 (РЕДАКТИРОВАТЬ: упс, да, потому что это был SteamVR_Action_Vibration)   -  person Shoko84    schedule 04.01.2019
comment
Я только что попытался изменить параметр amplitude, и он ничего не меняет (пробовал 1, 0.2f и 0). Это немного странно, потому что я не вижу никакой разницы между 1 и 0,2f. 0 не активирует тактильные ощущения, что нормально   -  person Shoko84    schedule 04.01.2019


Ответы (2)


Как утверждает Shoko84, параметр амплитуды не имеет значения. На самом деле ни один из параметров не имеет значения при вызове HapticAction.Execute.

person Charl Cillie    schedule 22.01.2019

Я считаю, что параметры имеют странные ограничения. Продолжительность: от 0 до 0,79 Частота: от 0 до 320 Амплитуда: от 0 до 0,25

Если вы превысите любое из этих значений, это будет просто максимальное значение. Вот почему вы не увидели никакой разницы между амплитудой 0,2 и 1, они почти одинаковы (разница в интенсивности 0,05).

person Jeff    schedule 17.07.2019