- Home /
Making a bullet destroy itself on contact.
Hi,
I have made a gun that will shoot bullets but I want those bullets to destroy themselves on contact with anything else. Here is the code I use for shooting.
var BulletPrefab:Transform;
var force : float = 2000;
function Update()
{
if(Input.GetButtonDown("Fire1"))
{
var bullet = Instantiate(BulletPrefab,
GameObject.Find("spawnPoint").transform.position,
GameObject.Find("M4").transform.rotation);
bullet.rigidbody.AddForce(bullet.transform.forward * force);
}
}
What do I need to add in this script to make the bullet destroy itself?
Thanks
hi Tyler
http://answers.unity3d.com/questions/321762/how-to-assign-variable-to-a-prefabs-child.html
you don't instantiate or indeed destroy. just move them in and out of the pool. hope it helps.
Answer by JoshMBeyer · Dec 06, 2012 at 08:16 AM
using UnityEngine;
using System.Collections;
/// <summary>
/// This script is attached to the Blaster projectile and it
/// governs the behaviour of the projectile.
/// </summary>
public class BlasterScript : MonoBehaviour {
//Variables Start___________________________________
//The explosion effect is attached to this
//in the inspector
public GameObject blasterExplosion;
//A quick reference.
private Transform myTransform;
//The projectiles flight speed.
private float projectileSpeed = 10;
//Prevent the projectile from causing
//further harm once it has hit something.
private bool expended = false;
//A ray projected in front of the projectile
//to see if it will hit a recognisable collider.
private RaycastHit hit;
//The range of that ray.
private float range = 1.5f;
//The life span of the projectile.
private float expireTime = 5;
//Variables End_____________________________________
// Use this for initialization
void Start ()
{
myTransform = transform;
//As soon as the projectile is created start a countdown
//to destroy it.
StartCoroutine(DestroyMyselfAfterSomeTime());
}
// Update is called once per frame
void Update ()
{
//Translate the projectile in the up direction (the pointed
//end of the projectile).
myTransform.Translate(Vector3.up * projectileSpeed * Time.deltaTime);
//If the ray hits something then execute this code.
if(Physics.Raycast(myTransform.position,myTransform.up, out hit, range) && expended == false)
{
//If the collider has the tag of Floor then..
if(hit.transform.tag == "Floor")
{
expended = true;
//Instantiate an explosion effect.
Instantiate(blasterExplosion, hit.point, Quaternion.identity);
//Make the projectile become invisible.
myTransform.renderer.enabled = false;
//Destroy the projectile.
Destroy(myTransform.gameObject);
}
}
}
IEnumerator DestroyMyselfAfterSomeTime()
{
//Wait for the timer to count up to the expireTime
//and then destroy the projectile.
yield return new WaitForSeconds(expireTime);
Destroy(myTransform.gameObject);
}
}
That is the script I am using for my project. It is attached to the projectile GameObject. I use another script to fire the projectile.
What I would recommend for you to do is have one script attached to your player to fire the projectile, and have another script attached to your projectile which controls its behavior.
Either way, what you are missing is Collision Detection. You will need tags, colliders, triggers, and in your script Physics.Raycast, Raycast.hit
If you are unfamiliar, the Unity scripting API is really helpful. In unity, at the top of your window, Click "Help" > "Scripting Reference" and that will open the API in your web browser.
I recommend checking out the Important classes section.
Few things here you can easily avoid. Your whole DestroyAfterSomeTime function can be shorten to :
Destroy(refObject,expireTime);
in the Start. You can make a more useful version of //Variables start with
#region variables
#endregion
that allows to expand and reduce the zone. You do not need to disable the renderer of your object since you are destroying it right after.
It seems to me the expanded check is also useless since you are about to destroy the object if you get in the block.
Also, this is not wrong but I would rather go for rigidbody.
Don't get me wrong, I am just trying to help.
Yea I am pretty new to unity, thanks for the tips, Ill try that out.
josh i would definitely encourag eyou to learn about POOLS and so on. notice the link above. also do anything fafase says :) all the best.
yep, do what I say!!!! No serious, also try the pooling principle, you can find a simplified explanation there http://unitygems.com/memorymanagement/#heap, there is a simple project and video that shows what is going on.
Your answer
Follow this Question
Related Questions
Rigidbody of empty bullet shell collision problem. 2 Answers
Bullet case lagg & collision problem 2 Answers
bullet desent seem to apear (javascript) 0 Answers
Destroy Turret with machine Gun 0 Answers
ParticleSystem collision checking. 2 Answers