Random для AudioClip[]

Программирование на Юнити.

Random для AudioClip[]

Сообщение labinzevvAlex 22 май 2021, 22:01

Привет народ! Нужна Ваша помощь.
Есть скрипт:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class soundsMusic : MonoBehaviour
{
    public AudioSource myMusic;
    public AudioClip[] musicMassive;
    public List<int> intList = new List<int>();
    int randomNumber;

    private AudioClip GetRandomClip()
    {
        intList = new List<int>(new int[musicMassive.Length]);

        for (int i = 0; i < musicMassive.Length; i++)
        {
            randomNumber = Random.Range(0, (musicMassive.Length) + 1);
            while (intList.Contains(randomNumber))
            {
                randomNumber = Random.Range(0, (musicMassive.Length) + 1);
            }
            intList[i] = randomNumber;
            musicMassive[i] = musicMassive[(intList[i]) - 1];
        }

        return musicMassive[Random.Range(0, (intList.Count))];
    }

    void Update()
    {
        if (!myMusic.isPlaying)
        {
            myMusic.clip = GetRandomClip();
            myMusic.Play();
        }
    }
}
 

в public List<int> intList = new List<int>(); генерируются рандомные числа (здесь всё работает). Вопрос в следующем: Как приравнять public AudioClip[] musicMassive к public List<int> intList = new List<int>();? Чтобы public AudioClip[] musicMassive приравнивал аудиотреки к рандомным числам и воспроизводил в том же порядке? Уже все варианты перепробовал. Не работает вот эта строка: musicMassive[i] = musicMassive[(intList[i]) - 1];
Все поля musicMassive[i] заполняются одним и тем же треком, хотя в public List<int> intList числа продолжают рандомно меняться.
Заранее благодарю за помощь:)
labinzevvAlex
UNIт
 
Сообщения: 74
Зарегистрирован: 12 июл 2020, 12:18

Re: Random для AudioClip[]

Сообщение samana 23 май 2021, 10:17

Идея вашего решения излишне усложнена, можно сделать проще.
Например выдавать все треки по порядку в массиве, но как только дошли до конца массива, то перемешивать массив и снова выдавать по порядку.

Синтаксис:
Используется csharp
using System.Linq;

private int currentMusicIndex = 0;

private AudioClip GetRandomClip()
{
    if (currentMusicIndex >= musicMassive.Length)
    {
        currentMusicIndex = 0;
        musicMassive = musicMassive.OrderBy(i => Random.Range(0, musicMassive.Length)).ToArray();
    }

    return musicMassive[currentMusicIndex++];
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Random для AudioClip[]

Сообщение Jarico 23 май 2021, 10:55

samana писал(а):Идея вашего решения излишне усложнена, можно сделать проще.
Например выдавать все треки по порядку в массиве, но как только дошли до конца массива, то перемешивать массив и снова выдавать по порядку.

Синтаксис:
Используется csharp
using System.Linq;

private int currentMusicIndex = 0;

private AudioClip GetRandomClip()
{
    if (currentMusicIndex >= musicMassive.Length)
    {
        currentMusicIndex = 0;
        musicMassive = musicMassive.OrderBy(i => Random.Range(0, musicMassive.Length)).ToArray();
    }

    return musicMassive[currentMusicIndex++];
}


Синтаксис:
Используется csharp
public AudioClip[] Clips;

public AudioClip GetRandomClip(){
int rnd = Random.Range(0, Clips.Length);
if(Clips[rnd] != null){return Clips[rnd];}
return null;
}
 
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Random для AudioClip[]

Сообщение samana 23 май 2021, 11:14

Jarico, просто в моей идее была хоть какая-то минимизация повторения одной и той же композиции. Конечно зависит и от кол-ва элементов, и если их много, то и ваш вариант подходит.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Random для AudioClip[]

Сообщение Jarico 23 май 2021, 17:30

samana писал(а):Jarico, просто в моей идее была хоть какая-то минимизация повторения одной и той же композиции. Конечно зависит и от кол-ва элементов, и если их много, то и ваш вариант подходит.


У меня просто аллергия на Linq :D
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Random для AudioClip[]

Сообщение labinzevvAlex 24 май 2021, 08:56

Спасибо товарищи! Оба варианта работают. Взял на вооружение:)
labinzevvAlex
UNIт
 
Сообщения: 74
Зарегистрирован: 12 июл 2020, 12:18

Re: Random для AudioClip[]

Сообщение labinzevvAlex 27 май 2021, 13:35

samana писал(а):Идея вашего решения излишне усложнена, можно сделать проще.
Например выдавать все треки по порядку в массиве, но как только дошли до конца массива, то перемешивать массив и снова выдавать по порядку.

Синтаксис:
Используется csharp
using System.Linq;

private int currentMusicIndex = 0;

private AudioClip GetRandomClip()
{
    if (currentMusicIndex >= musicMassive.Length)
    {
        currentMusicIndex = 0;
        musicMassive = musicMassive.OrderBy(i => Random.Range(0, musicMassive.Length)).ToArray();
    }

    return musicMassive[currentMusicIndex++];
}


Использую Ваше решение, всё работает как надо! Спасибо! Единственное, добавил: bool для перемешивания массива однократно при старте:
Синтаксис:
Используется csharp
using System.Linq;

private int currentMusicIndex = 0;
bool change = false;

private AudioClip GetRandomClip()
{
    if (change == false)
    {
        musicMassive = musicMassive.OrderBy(i => Random.Range(0, musicMassive.Length)).ToArray();
        change = true;
    }
    if (currentMusicIndex >= musicMassive.Length)
    {
        currentMusicIndex = 0;
        musicMassive = musicMassive.OrderBy(i => Random.Range(0, musicMassive.Length)).ToArray();
    }

    return musicMassive[currentMusicIndex++];
}
 
labinzevvAlex
UNIт
 
Сообщения: 74
Зарегистрирован: 12 июл 2020, 12:18


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7