2017-04-05 132 views
0

我在摄像机周围有8个空的游戏对象,我希望来自世界各地的相同声音。 如何正确PlayClipAtPoint来完成此操作。 此脚本位于我的音频管理器空游戏对象上。但我希望音频来自Point1-Point8转换位置。Unity在任意一个gameobjects位置播放音频剪辑

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

} 
+0

那么myFunc应该选择一个随机对象*和*一个随机剪辑? – Keiwan

+0

它会在某些时候,我只是想音频播放现在,它不。 – CsharpBeginner

回答

3

PlayClipAtPointAudioSource类的static功能。你不能在实例上调用静态函数。你应该把它的类型:

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

一点题外话:我也建议您为TransformsAudioClips声明数组,并在检查填充它们,而不必为每一个公共领域。这将使得随机选择位置并且听起来更容易(否则你必须手动将所有这些对象放入数组中,这显然是更多的工作并且不太灵活)。

所以只是更换所有的字段声明:

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

然后,只需使用索引来访问它们。

0

完整的代码看起来就像这样:

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

不要忘记分配变换和剪辑,从相应检查阵列;

+0

谢谢,我覆盖了。 – CsharpBeginner

相关问题