Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Проблема в Unity с музыкой. Играет слишком громко, а через какое-то время вылезает ошибка.

Егор Хамидулин Мастер (1481), открыт 1 неделю назад
Доброе утро, день, вечер.Написал код для главного меню в Unity:
 using UnityEngine; 

public class MusicForMainMenu : MonoBehaviour
{
private int numberOfMusic;
private const float volume = 1f;
public AudioClip[] music;
private AudioSource audioSource => GetComponent<AudioSource>();

private void Start()
{
PlayerSound();
}
private void PlayerSound()
{
numberOfMusic = Random.Range(0, 1);
audioSource.PlayOneShot(music[numberOfMusic], volume);
PlayerSound();
}
}
Вроде всё правильно, но поёт ОЧЕНЬ громко, а через секунд 5-10 выдаёт ошибку: StackOverflowException: The requested operation caused a stack overflow.
UnityEngine.AudioSource.PlayOneShot (UnityEngine.AudioClip clip, System.Single volumeScale) (at <16ee4ca70e684ffca23bc5c50d424433>:0)
Что делать? А то игра без музыки и не игра вовсе
1 ответ
♡$ⴎG@r₱u₷sყ♡ Искусственный Интеллект (157159) 1 неделю назад
1. **StackOverflowException** возникает из-за рекурсивного вызова метода `PlayerSound()` внутри самого себя. Это приводит к бесконечному циклу вызовов, что в конечном итоге переполняет стек.

2. **Громкость звука**: значение громкости `volume` установлено в 1f, что является максимальным значением для громкости в Unity. Если звук слишком громкий, то его нужно уменьшить.

Вот исправленный код с учетом этих замечаний:
  
using UnityEngine;

public class MusicForMainMenu : MonoBehaviour
{
private int numberOfMusic;
private float volume = 0.5f; // Установите более низкую громкость
public AudioClip[] music;
private AudioSource audioSource;

private void Start()
{
audioSource = GetComponent<AudioSource>();
PlayerSound();
}

private void PlayerSound()
{
numberOfMusic = Random.Range(0, music.Length); // Убедитесь, что диапазон соответствует количеству треков
audioSource.PlayOneShot(music[numberOfMusic], volume);

// Если нужно зациклить музыку, используйте корутину или Invoke
Invoke("PlayerSound", music[numberOfMusic].length); // Запускает следующую песню после окончания текущей
}
}


Ключевые изменения:
- Установлена громкость `volume` на более низкий уровень.
- Исправлен рекурсивный вызов `PlayerSound()` на использование `Invoke` для зацикливания воспроизведения музыки.
- Убедитесь, что `Random.Range` использует правильный диапазон от 0 до `music.Length`, чтобы избежать ошибок при доступе к массиву.
Егор ХамидулинМастер (1481) 1 неделю назад
ничего себе как быстро, я думал как обычно пол часа ждать, спасибо заранее)
♡$ⴎG@r₱u₷sყ♡ Искусственный Интеллект (157159) Егор Хамидулин, да не за что, это просто чатгпт
Похожие вопросы