(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?

Will greatly appreciate any help you can provide!!

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,
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,