Heya :) this is pretty simple, the two ways I like to delay something is either using a coroutine or invoking a method.
As for on hit if you want the particles to hit on the body where a bullet hits a person, Raycasting a shot and getting its hit.point will help you with achieving the position of the hit, if it is that u just want the particles to Emmitt at a transform, what u have is fine. As for code:
Bare with me im on my phone :p
GameObject yourParticleSystem;
void OnCollisionEnter(Collision col)
{
//this is for if a bullet hits the player
if(col.gameObject.tag == "Bullet")
{
StartCoroutine(waitTime(3f));
}
}
IEnumerator waitTime (float time)
{
yield return new waitForSeconds (time);
Instantiate(yourParticleSystem, transform.position, Quaternio.identity);
// this instantiates your prefab at your transform and its rotation
//if u dont have play on awake ticked in particles a simple
yourParticleSystem.Play(); //will make it play
}
Because you aren't pooling your particles, you don't want to have multiple particle GameObject within the scene, if suggest either pooling ur particles or simple adding a destroy script on your particleSystem
Eg:
void Start ()
{
Destroy(gameObject, 4f) // 4f is just a guess to how long the particles play for
}
Sorry if there are some syntax errors I tried my best on the phone hehe ^.^ hope u understand and it works :)))))