【问题标题】:Unity Play audio clip at random gameobjects positionsUnity 在随机游戏对象位置播放音频剪辑
【发布时间】:2017-04-05 17:10:33
【问题描述】:

我在相机周围有 8 个空的游戏对象,我希望从世界上的这些点发出相同的声音。 我怎样才能正确 PlayClipAtPoint 来完成此操作。 此脚本位于我的音频管理器空游戏对象上。但我希望音频来自 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);
}

}

【问题讨论】:

  • 那么 myFunc 应该选择一个随机对象和一个随机剪辑吗?
  • 它会在某个时候我只想现在播放音频而它不会。

标签: c# audio unity3d hololens


【解决方案1】:

PlayClipAtPoint 是 static 类的 static 函数。您不能在实例上调用静态函数。你应该在类型上调用它:

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

作为旁注:我还建议您为 Transforms 和 AudioClips 声明数组并将它们填充到检查器中,而不是为每个数组设置一个公共字段。这将使选择随机位置和听起来更容易(否则您必须手动将所有这些对象放入数组中,这显然需要更多工作且不太灵活)。

所以只需将所有字段声明替换为:

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

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

【讨论】:

    【解决方案2】:

    您的完整代码将如下所示:

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

    不要忘记在检查器的相应数组中分配变换和剪辑;

    【讨论】:

    • 谢谢我知道了。
    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2020-09-01
    相关资源
    最近更新 更多