- Home /
How to make particle collision initiate prefab
i have an explosion that i want to change state of enemies. so i have a version of enemy that is "dead" and i want whenever an explosion touches them, they initiate npcDeadPrefab. the explosion is a single particle that is a child of the bullet and starts it on impact. here is the enemy script using UnityEngine; using UnityEngine.AI;
[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(Rigidbody))]
public class SC_NPCEnemy : MonoBehaviour, IEntity { public float attackDistance = 3f; public float movementSpeed = 4f; public float npcHP = 100; //How much damage will npc deal to the player public float npcDamage = 5; public float attackRate = 0.5f; public Transform firePoint; public GameObject npcDeadPrefab;
[HideInInspector]
public Transform playerTransform;
[HideInInspector]
public SC_EnemySpawner es;
NavMeshAgent agent;
float nextAttackTime = 0;
Rigidbody r;
// Start is called before the first frame update
void Start()
{
agent = GetComponent<NavMeshAgent>();
agent.stoppingDistance = attackDistance;
agent.speed = movementSpeed;
r = GetComponent<Rigidbody>();
r.useGravity = false;
r.isKinematic = true;
}
// Update is called once per frame
void Update()
{
if (agent.remainingDistance - attackDistance < 0.01f)
{
if (Time.time > nextAttackTime)
{
nextAttackTime = Time.time + attackRate;
//Attack
RaycastHit hit;
if (Physics.Raycast(firePoint.position, firePoint.forward, out hit, attackDistance))
{
if (hit.transform.CompareTag("Player"))
{
Debug.DrawLine(firePoint.position, firePoint.position + firePoint.forward * attackDistance, Color.cyan);
IEntity player = hit.transform.GetComponent<IEntity>();
player.ApplyDamage(npcDamage);
}
}
}
}
//Move towardst he player
agent.destination = playerTransform.position;
//Always look at player
transform.LookAt(new Vector3(playerTransform.transform.position.x, transform.position.y, playerTransform.position.z));
//Gradually reduce rigidbody velocity if the force was applied by the bullet
r.velocity *= 0.99f;
}
public void ApplyDamage(float points)
{
npcHP -= points;
if (npcHP <= 0)
{
//Destroy the NPC
GameObject npcDead = Instantiate(npcDeadPrefab, transform.position, transform.rotation);
//Slightly bounce the npc dead prefab up
npcDead.GetComponent<Rigidbody>().velocity = (-(playerTransform.position - transform.position).normalized * 8) + new Vector3(0, 5, 0);
Destroy(npcDead, 10);
es.EnemyEliminated(this);
Destroy(gameObject);
}
}
} here is explosion bullet if it is needed
using System; using System.Collections; using UnityEngine; [RequireComponent(typeof(ParticleSystem))]
public class SC_Missile : MonoBehaviour { public float bulletSpeed = 345; public float hitForce = 50f; public float destroyAfter = 3.5f; public float weaponDamage = 100f;
float currentTime = 0;
Vector3 newPos;
Vector3 oldPos;
private bool hasHit = false;
float damagePoints;
// Start is called before the first frame update
IEnumerator Start()
{
newPos = transform.position;
oldPos = newPos;
while (currentTime < destroyAfter && !hasHit)
{
Vector3 velocity = transform.forward * bulletSpeed;
newPos += velocity * Time.deltaTime;
Vector3 direction = newPos - oldPos;
float distance = direction.magnitude;
RaycastHit hit;
// Check if we hit anything on the way
if (Physics.Raycast(oldPos, direction, out hit, distance))
{
if (hit.rigidbody != null)
{
hit.rigidbody.AddForce(direction * hitForce);
IEntity npc = hit.transform.GetComponent<IEntity>();
if (npc != null)
{
//Apply damage to NPC
npc.ApplyDamage(damagePoints);
}
}
newPos = hit.point; //Adjust new position
StartCoroutine(DestroyBullet());
}
currentTime += Time.deltaTime;
yield return new WaitForFixedUpdate();
transform.position = newPos;
oldPos = newPos;
}
if (!hasHit)
{
StartCoroutine(DestroyBullet());
}
}
IEnumerator DestroyBullet()
{
hasHit = true;
yield return new WaitForSeconds(0.1f);
ParticleSystem exp = GetComponent<ParticleSystem>();
exp.Play();
Destroy(gameObject, exp.main.duration);
}
public void SetDamage(float weaponDamage)
{
throw new NotImplementedException();
}
} heres the origional bullet script
using System.Collections; using UnityEngine;
public class SC_Bullet : MonoBehaviour { public float bulletSpeed = 345; public float hitForce = 50f; public float destroyAfter = 3.5f;
float currentTime = 0;
Vector3 newPos;
Vector3 oldPos;
bool hasHit = false;
float damagePoints;
// Start is called before the first frame update
IEnumerator Start()
{
newPos = transform.position;
oldPos = newPos;
while (currentTime < destroyAfter && !hasHit)
{
Vector3 velocity = transform.forward * bulletSpeed;
newPos += velocity * Time.deltaTime;
Vector3 direction = newPos - oldPos;
float distance = direction.magnitude;
RaycastHit hit;
// Check if we hit anything on the way
if (Physics.Raycast(oldPos, direction, out hit, distance))
{
if (hit.rigidbody != null)
{
hit.rigidbody.AddForce(direction * hitForce);
IEntity npc = hit.transform.GetComponent<IEntity>();
if (npc != null)
{
//Apply damage to NPC
npc.ApplyDamage(damagePoints);
}
}
newPos = hit.point; //Adjust new position
StartCoroutine(DestroyBullet());
}
currentTime += Time.deltaTime;
yield return new WaitForFixedUpdate();
transform.position = newPos;
oldPos = newPos;
}
if (!hasHit)
{
StartCoroutine(DestroyBullet());
}
}
IEnumerator DestroyBullet()
{
hasHit = true;
yield return new WaitForSeconds(0.5f);
Destroy(gameObject);
}
//Set how much damage this bullet will deal
public void SetDamage(float points)
{
damagePoints = points;
}
} also, if the bullet hits the enemy, it doesn't do damage
thanks :)