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

У меня есть 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);
}

}

2 ответа

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

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

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

Так что просто замените все ваши полевые объявления на:

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

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

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

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);
     }
}

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

Другие вопросы по тегам