sityrax Posted June 28 Share Posted June 28 Здравствуйте! Метод Unigine.Sound.SetSourceVolume не влияет на громкость звука источников на конкретном канале. При этом, если регулировать громкость в отдельном канале через настройки, то громкость звука меняется и это явно слышно (изображение ниже). Если Вызвать метод Unigine.Sound.SetSourceVolume(source: 1, volume: 0.0f); то Scalar newVolume = Unigine.Sound.GetSourceVolume(source: 1); вернёт обновленное значение 0, однако звук на этом канале никак не изменит свою громкость. Свойство Unigine.Sound.Volume же изменяет громкость всех источников корректно. Может есть какие-то дополнительные требования для изменения звука на отдельном канале через код? Версия ректора: UNIGINE 2 Community 2.18.1. Link to comment
bmyagkov Posted June 28 Share Posted June 28 Добрый день! Уточните, пожалуйста, каким образом настроены битовые маски "Source Mask" для объектов SoundSource? Вероятно, недопонимание связано с тем, что значению Volume будет соответствовать предварительно заданный бит маски на источнике звука. По умолчанию для SoundSource объектов Source Mask равен 0 (00 00 00 01) и все они будет регулироваться при помощи слайдера "Sound -> Volume 0" в редакторе или при помощи метода Sound.SetSourceVolume(0, 1) в коде. Пожалуйста, проверьте, что маски настроены правильно, так как быстрая проверка с нашей стороны не выявила никаких проблем. Спасибо! Link to comment
sityrax Posted June 28 Author Share Posted June 28 9 minutes ago, bmyagkov said: Добрый день! Уточните, пожалуйста, каким образом настроены битовые маски "Source Mask" для объектов SoundSource? Вероятно, недопонимание связано с тем, что значению Volume будет соответствовать предварительно заданный бит маски на источнике звука. По умолчанию для SoundSource объектов Source Mask равен 0 (00 00 00 01) и все они будет регулироваться при помощи слайдера "Sound -> Volume 0" в редакторе или при помощи метода Sound.SetSourceVolume(0, 1) в коде. Пожалуйста, проверьте, что маски настроены правильно, так как быстрая проверка с нашей стороны не выявила никаких проблем. Спасибо! У меня есть 3 источника звука на сцене: у двух их них маска UI (00 00 00 01) и у одного - environment (00 00 00 02). Громкость источников регулируется напрямую из редактора с помощью ползунков Sound -> Volume 0 и 1 корректно. Но при вызове через код результата уже нет. Link to comment
bmyagkov Posted June 28 Share Posted June 28 53 minutes ago, sityrax said: У меня есть 3 источника звука на сцене: у двух их них маска UI (00 00 00 01) и у одного - environment (00 00 00 02). Громкость источников регулируется напрямую из редактора с помощью ползунков Sound -> Volume 0 и 1 корректно. Но при вызове через код результата уже нет. А можно увидеть весь код примера? В нашем случае все происходит следующим образом: using System.Collections; using System.Collections.Generic; using Unigine; [Component(PropertyGuid = "5b91d558ca6100289ef2ffdf5c24e60397af16da")] public class soundtest : Component { void Init() { // write here code to be called on component initialization } void Update() { if (Input.IsKeyDown(Input.KEY.DIGIT_1)) Sound.SetSourceVolume(0, 0.1f); if (Input.IsKeyDown(Input.KEY.DIGIT_2)) Sound.SetSourceVolume(0, 1); if (Input.IsKeyDown(Input.KEY.DIGIT_7)) Sound.SetSourceVolume(1, 0.1f); if (Input.IsKeyDown(Input.KEY.DIGIT_8)) Sound.SetSourceVolume(1, 1); // write here code to be called before updating each render frame } } Мир настроен как в примере выше, один из источников звука имеет маску Source Mask 0, а второй соответственно Source Mask 1. При нажатии кнопки 1 на клавиатуре, звук для источника с маской 0 уменьшается, а на 2 возвращается в исходное состояние. Тоже самое для клавиш 7 и 8, которые изменяют громкость звука для источника с маской 1. 1 1 Link to comment
sityrax Posted July 1 Author Share Posted July 1 (edited) Разобраться в чем проблема. Решение довольно неочевидное. Для редактирования громкости звуков я написал скрипт, который по маске регулирует громкость определенного канала, но все источники звука по умолчанию имеют маску 00 00 00 01, а это равно 1, и получается, что для редактирования звука на самом первом канале нужно выполнять побитовый сдвиг в скрипте ниже от маски на 1, т.е. маска переданная в качестве параметра скрипту, не будет соответствовать маске настроенной на источнике звука. Таким образом, чтобы контролировать звук на источнике, которому присвоена маска 00 00 00 01 через редактор - нужно крутить параметр Volume 0, а для того чтобы изменять его через код, нужно от маски источника отнять единицу и отправить в качестве первого параметра методу SetSourceVolume маску 00 00 00 00. Если назначить источнику маску 80 00 00 00 (последний 32 бит) и отправить методу , то приложение вообще вылетит. [Component(PropertyGuid = "0b246ee8b197d2ca83dda4482cc655ffcb73e777")] public class SoundVolumeController : Component { [ShowInEditor][Parameter(Title = "Slider parameter")] SliderParameter _sliderParameter; [ShowInEditor][Parameter(Title = "Set specific sound source")] bool _setSpecificSoundSource; [ShowInEditor][ParameterMask(Title = "Source volume mask", MaskType = ParameterMaskAttribute.TYPE.SOUND_SOURCE)][ParameterCondition(nameof(_setSpecificSoundSource), 1)] int _sourceVolumeMask; const float _maxPercentValue = 100f; int _soundVolume; public int SoundVolume { get => _soundVolume; set { _soundVolume = value; Scalar volume = (float)_soundVolume / _maxPercentValue; if (_setSpecificSoundSource) Unigine.Sound.SetSourceVolume(_sourceVolumeMask, volume); else Unigine.Sound.Volume = volume; SoundVolumeChanged?.Invoke(); } } public static event Action SoundVolumeChanged; void Init() { _sliderParameter.VolumeChanged += SoundVolumeUpdate; SoundVolume = _sliderParameter.CurrentVolume; } void SoundVolumeUpdate(int newValue) => SoundVolume = newValue; } Edited July 1 by sityrax Link to comment
cash-metall Posted July 2 Share Posted July 2 Здравствуйте! метод SetSourceVolume принимает не маску, а номер канала, т.е. номер маски. если вы хотите управлять громкостью через маску - можно пройтись по всем битам в маске и применить громкость к активным. void SetSourceVolumeByMask(int mask, float volume) { for (int i = 0; i < 32; i++) if ((mask & (1 << i)) > 0) Sound.SetSourceVolume(i, volume); } [ShowInEditor][ParameterMask(Title = "Source volume mask", MaskType = ParameterMaskAttribute.TYPE.SOUND_SOURCE)] int _sourceVolumeMask1; [ShowInEditor][ParameterMask(Title = "Source volume mask", MaskType = ParameterMaskAttribute.TYPE.SOUND_SOURCE)] int _sourceVolumeMask2; void Update() { if (Input.IsKeyDown(Input.KEY.DIGIT_1)) SetSourceVolumeByMask(_sourceVolumeMask1, 0); if (Input.IsKeyDown(Input.KEY.DIGIT_2)) SetSourceVolumeByMask(_sourceVolumeMask1, 1); if (Input.IsKeyDown(Input.KEY.DIGIT_3)) SetSourceVolumeByMask(_sourceVolumeMask2, 0); if (Input.IsKeyDown(Input.KEY.DIGIT_4)) SetSourceVolumeByMask(_sourceVolumeMask2, 1); } если источнику звука назначить маску 31 ( 1 << 31) то и в метод SetSourceVolume нужно передавать 31 а не 80 00 00 00 или 1 << 31 (2147483648). ничего отнимать не надо. поэтому и крашило, потому что в SetSourceVolume пытались изменить канал больше 31. 1 Link to comment
Recommended Posts