# (STILL STUCK!) Align Particle Collsion Sub-Emitter (or decal?) with Surface Normal

Okay particle system experts, I really need your help! I’ve been stuck with this stupid problem for 2 months!! I’ve learned that decals are probably a better way to go (more efficient?) but I don’t know how to instantiate those where the particles hit and in the correct rotation either. I’VE REALLY TRIED HARD BUT I’M REALLY STUCK GUYS!

How can I get a particle sub-emitter to orient itself to match the surface normal of whatever it collides with (terrain and 3D objects)?

I have a blood particle system that looks good, except for one part: the collision sub-emitters. When the blood drops hit a surface, they sub-emit a “splatter” particle. This works well on flat surfaces, but unfortunately when it hits something angled/vertical it doesn’t look right and clips. See screenshot for an example of what I’m talking about.

I would like to remove the sub-emitter and use decals instead, if it’s not too much trouble for someone to explain how to do that instead?

private void MoveParticlesOnTerrain(ParticleSystem ps)
{
int numParticlesAlive = ps.GetParticles(m_Particles);
if (m_Particles == null || m_Particles.Length < ps.maxParticles)
m_Particles = new ParticleSystem.Particle[ps.maxParticles];

// Change only the particles that are alive
for (int i = 0; i < numParticlesAlive; i++)
{
RaycastHit raycastHit;
Ray r = new Ray(m_Particles_.position + Vector3.up * 100f, Vector3.up * -1f);_

if (Physics.Raycast(r, out raycastHit, terrainLayer))
{
Quaternion rot = Quaternion.FromToRotation(Vector3.forward, raycastHit.normal);
m_Particles*.axisOfRotation = Vector3.forward;
m_Particles.rotation3D = rot.eulerAngles;
m_Particles.position = new Vector3(m_Particles.position.x,
gravity.currentTerrain.SampleHeight(m_Particles.position) + .1f,
m_Particles.position.z);
_}
}
ps.SetParticles(m_Particles, numParticlesAlive);
}
private void MoveParticleSystemOnTerrain(ParticleSystem ps)
{
ps.transform.position = new Vector3(ps.transform.position.x,
gravity.currentTerrain.SampleHeight(ps.transform.position) + .1f,
ps.transform.position.z);
}*_