Unity3D播放来自粒子的声音

时间:2015-06-19 09:03:28

标签: audio unity3d collision particles

当一个粒子与墙碰撞时,我正试图发出声音。现在,它只播放来自父对象的声音,即播放器。

但是,我希望从粒子中播放声音。这意味着当一个粒子远离左边时,你会模糊地听到左边的声音。

有没有办法在粒子发生碰撞时播放声音?

2 个答案:

答案 0 :(得分:0)

我能想象的唯一方法是通过GetParticles / SetParticles覆盖粒子系统的动画。因此,您可以使用Physics.RaycastAll为粒子提供自己的碰撞检测,并在发生碰撞时播放声音。

答案 1 :(得分:0)

您可以使用OnParticleCollisionParticlePhysicsExtensions,并使用PlayClipAtPoint播放声音:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(ParticleSystem))]
public class CollidingParticles : MonoBehaviour {

    public AudioClip collisionSFX;

    ParticleSystem partSystem;
    ParticleCollisionEvent[] collisionEvents;

    void Awake () {

        partSystem = GetComponent<ParticleSystem>();
        collisionEvents = new ParticleCollisionEvent[16];
    }

    void OnParticleCollision (GameObject other) {

        int safeLength = partSystem.GetSafeCollisionEventSize();
        if (collisionEvents.Length < safeLength)
            collisionEvents = new ParticleCollisionEvent[safeLength];

        int totalCollisions = partSystem.GetCollisionEvents(other, collisionEvents);
        for (int i = 0; i < totalCollisions; i++)
            AudioSource.PlayClipAtPoint(collisionSFX, collisionEvents[i].intersection);

        print (totalCollisions);
    }
}

问题是无法检索由PlayClipAtPoint创建的临时AudioSource(将其设置为3D声音)。因此,您最好创建自己的PlayClipAtPoint方法,该方法实例化已经配置了3D AudioSource和所需剪辑的预制件,并运行Destroy(实例,秒)将其标记为定时销毁。