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);
}
}
Не забудьте назначить преобразования и клипы в соответствующих массивах из инспектора;