Unity3D 从粒子播放声音
Unity3D Play sound from particle
我正在尝试在粒子与墙壁碰撞时播放声音。现在,它只是播放来自父对象的声音,即播放器。
但是,我想让声音从粒子中播放。这意味着当一个粒子离左边很远时,你会隐约听到从左边传来的声音。
有没有办法在粒子碰撞时播放它的声音?
我能想到的唯一方法是通过 GetParticles/SetParticles 覆盖粒子系统的动画。因此,您可以使用 Physics.RaycastAll 为粒子提供自己的碰撞检测,并在发生碰撞时播放声音。
您可以使用 OnParticleCollision and the ParticlePhysicsExtensions, and play a sound with 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(instance, seconds) 将其标记为定时销毁。
我正在尝试在粒子与墙壁碰撞时播放声音。现在,它只是播放来自父对象的声音,即播放器。
但是,我想让声音从粒子中播放。这意味着当一个粒子离左边很远时,你会隐约听到从左边传来的声音。
有没有办法在粒子碰撞时播放它的声音?
我能想到的唯一方法是通过 GetParticles/SetParticles 覆盖粒子系统的动画。因此,您可以使用 Physics.RaycastAll 为粒子提供自己的碰撞检测,并在发生碰撞时播放声音。
您可以使用 OnParticleCollision and the ParticlePhysicsExtensions, and play a sound with 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(instance, seconds) 将其标记为定时销毁。