Unity Воспроизведение аудиоклипа в случайных позициях игровых объектов

У меня есть 8 пустых игровых объектов вокруг камеры, и я хочу, чтобы из этих точек мира исходили одинаковые звуки. Как я могу правильно использовать PlayClipAtPoint для достижения этой цели. Этот скрипт находится в моем пустом игровом объекте Audio Manager. Но я хочу, чтобы звук исходил из положения преобразования Point1-Point8.

public class AudioManagerScript : MonoBehaviour
{
public Transform point1;
public Transform point2;
public Transform point3;
public Transform point4;
public Transform point5;
public Transform point6;
public Transform point7;
public Transform point8;
// Use this for initialization
public AudioClip clip1;
public AudioClip clip2;
public AudioClip clip3;
public AudioClip clip4;
public AudioClip clip5;
public AudioClip clip6;
public AudioClip clip7;
public AudioClip clip8;
public AudioClip clip9;
public AudioClip clip10;

public AudioSource audio;

void Start()
{
    InvokeRepeating("myFunc", 1.0f, 1.0f);
    audio = GetComponent<AudioSource>();
}

void myFunc()
{
    audio.PlayClipAtPoint(clip1,point1.transform.position,0.9f);
}

}

person CsharpBeginner    schedule 05.04.2017    source источник
comment
Итак, должен ли myFunc выбрать случайный объект и случайный клип?   -  person Keiwan    schedule 05.04.2017
comment
в какой-то момент я просто хочу, чтобы звук воспроизводился прямо сейчас, а он нет.   -  person CsharpBeginner    schedule 05.04.2017


Ответы (2)


PlayClipAtPoint — это static функция класса AudioSource. Вы не можете вызывать статические функции для экземпляров. Вы должны вызвать его по типу:

AudioSource.PlayClipAtPoint(clip1, point1.transform.position, 0.9f);

В качестве примечания: я бы также рекомендовал вам объявить массивы для ваших Transforms и AudioClips и заполнить их в инспекторе вместо того, чтобы иметь общедоступное поле для каждого из них. Это значительно упростит выбор случайных позиций и звуков (в противном случае вам пришлось бы помещать все эти объекты в массивы вручную, что, очевидно, требует гораздо больше работы и менее гибко).

Поэтому просто замените все ваши объявления полей на:

public Transform[] points;
public AudioClip[] clips;

Затем просто используйте индекс для доступа к ним.

person Keiwan    schedule 05.04.2017

ваш полный код будет выглядеть так:

public class AudioManagerScript : MonoBehaviour
{
     public Transform[] points;
     public AudioClip[] clips;

     public float volume = 0.9f;

     void Start()
     {
         InvokeRepeating("PlaySoundAtRandomPosition", 1.0f, 1.0f);
     }

     void PlaySoundAtRandomPosition()
     {
         // Take random position
         int rndPosIdx = Random.Range(0, points.Length);
         // Take random clip
         int rndClipIdx = Random.Range(0, clips.Length);
         AudioSource.PlayClipAtPoint(clips[rndClipIdx], points[rndPosIdx].position, volume);
     }
}

Не забудьте назначить трансформации и клипы в соответствующие массивы из инспектора;

person ZU BA    schedule 06.04.2017
comment
Спасибо, я понял это. - person CsharpBeginner; 06.04.2017