- Home /
Question by
Impz · Sep 25, 2016 at 06:18 PM ·
c#collision detectioncollider2d2d animation
Issues getting a BulletTrail to explode on contact Unity2D
I'm trying to get the Bullet trail to stop and destroy when it contacts "X" surfaces and start "ExplosionPrefab". (The code needs to be cleaned up and commented, bare in mind) This is the gun script
public class Gun : MonoBehaviour {
public float FireRate = 0;
public float Damage = 10;
public LayerMask WhatToHit;
public Transform BulletTrailPrefab;
public Transform explosionPrefab;
float SpawnRate = 10;
float TimeToSpawnEffect = 0;
float timeToFire = 0;
Transform firePoint;
// Use this for initialization
void Awake () {
firePoint = transform.FindChild ("FirePoint");
if (firePoint == null)
{
Debug.LogError("No firepoint? POR QUEEEEEE!!!");
}
}
// Update is called once per frame
void Update () {
//Is it a single fire weapon? (Pistol)
if (FireRate == 0)
{
if (Input.GetButtonDown("Fire1"))
{
Shoot();
}
}
//Not Single Fire? This checks and makes it calculate the time between shots.
else
{
if (Input.GetButton ("Fire1") && Time.time > timeToFire)
{
timeToFire = Time.time + 1 /FireRate;
Shoot();
}
}
}
void Shoot ()
{
Vector2 mousePosition = new Vector2 (Camera.main.ScreenToWorldPoint (Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y);
Vector2 firePointPosition = new Vector2(firePoint.position.x, firePoint.position.y);
RaycastHit2D hit = Physics2D.Raycast (firePointPosition, mousePosition-firePointPosition, 100, WhatToHit);
if (Time.time >= TimeToSpawnEffect)
{
Effect();
TimeToSpawnEffect = Time.time + 1 / SpawnRate;
}
//Debug.DrawLine(firePointPosition, (mousePosition - firePointPosition)*100);
if (hit.collider != null) {
Debug.Log("We hit" + hit.collider.name + " and did" + Damage + " damage.");
}
}
void Effect()
{
Instantiate(BulletTrailPrefab, firePoint.position,firePoint.rotation);
}
void OnCollisionEnter(Collision collision)
{
ContactPoint contact = collision.contacts[0];
Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal);
Vector3 pos = contact.point;
Instantiate(explosionPrefab, pos, rot);
Destroy(gameObject);
}
}
This is the Bullet script
public class Bullet : MonoBehaviour
{
public int moveSpeed = 220;
// Update is called once per frame
void Update()
{
transform.Translate(Vector3.right * Time.deltaTime * moveSpeed);
Destroy(gameObject, 1);
}
void OnCollsionEnter(Collision collision)
{
foreach (ContactPoint contact in collision.contacts)
{
Debug.DrawRay(contact.point, contact.normal, Color.cyan);
Destroy(gameObject);
}
}
}
Fairly new to solving problems. This is the first major one I couldn't figure out. Maybe because I have been looking at it wrong. I'm unsure.
Comment
Your explosion code is in the gun, it need to be in the bullet, in you actual code you gun will explode on collision. move the code of the gun OnCollisionEnter to the bullet OnCollisionEnter, and put the explosionPrefab in the bullet.
Your answer
![](https://koobas.hobune.stream/wayback/20220612093451im_/https://answers.unity.com/themes/thub/images/avi.jpg)