Collision problem on force increase

We have a problem with the bullet collision with the target. if the bullets force is above 1000, then the target does not register the collision. If we make the force <999 then it registers the collision, however visually it seems the bullet does not seem like a fired bullet. Please suggest how we can maintain speed and still register the collision

the following script was added to the target

var targetRoot : GameObject;
private var beenHit: boolean = false;
var hitSound : AudioClip;
var UpSound : AudioClip;

function OnCollisionEnter(theObject : Collision)
{
	if(beenHit==false && theObject.gameObject.tag=="bullet")
	{
		audio.PlayOneShot(hitSound);
		targetRoot.animation.Play("down");
		beenHit=true;
		TargetControll.tgtdwn++;
	}
}
function Update () 
{
}

And the following script was added to the gun

static var canshoot = true;
static var canreload = false;
var BulletPrefab: Transform;
var DeagleSound : AudioClip;
var DeagleReload: AudioClip;

function Update () 
{
	var deagle = GameObject.Find("desert eagle");
	if(Input.GetButtonDown("Fire1") && canshoot==true)
		{
			var Bullet = Instantiate(BulletPrefab, GameObject.Find("BulletSpawn").transform.position, GameObject.Find("Main Camera").transform.rotation);
			Bullet.rigidbody.AddForce(transform.forward * 9000);
			
		if(Indepvariable.charge <= 6)
			{
				canshoot = false;
				deagle.animation.Play("shootfix");
				audio.PlayOneShot(DeagleSound);
				weaprecoil ();
			}
		}
	if(Indepvariable.charge == 7)
		{
			canshoot = false;
			deagle.animation.Play("reload");
			audio.PlayOneShot(DeagleReload);
			reload ();
		}
	if(Input.GetButtonDown("reload") && canreload == true)
		{
			canshoot = false;
			deagle.animation.Play("reload");
			audio.PlayOneShot(DeagleReload);
			reload ();
		}
}

function weaprecoil ()
{
	yield new WaitForSeconds (0.5);
	Indepvariable.charge++;
	canshoot = true;
}

function reload ()
{
	Indepvariable.charge = 0;
	yield new WaitForSeconds (3);
	canshoot = true;
	canreload = false;
}

@fredpointzero is right: fast projectiles cause this kind of error. Collisions are checked at the FixedUpdate rate (default: 50 times per second). If some object is fast enough, it can “pass through” the target between cycles - in one cycle it’s before the target, but in the next it’s after the target. Since the target collider was not touched, no collision will be reported.

For this reason, only slow projectiles like rockets are actually instantiated. For bullets, you should use a Raycast - the engine traces an imaginary ray and returns the first object hit. It’s much more efficient, and makes no visual difference since you can’t see the bullet anyway.

You can modify the shooting code in your gun script like this:

EDITED: I confused Desert Eagle with the target. There’s the correct version:

function Update(){
    var deagle = GameObject.Find("desert eagle");
    if(Input.GetButtonDown("Fire1") && canshoot==true){
        audio.PlayOneShot(shotSound); // play the shot sound here
        var hit: RaycastHit;
        var spawnPos = GameObject.Find("BulletSpawn").transform.position;
        var direction = Camera.main.transform.forward;
        if (Physics.Raycast(spawnPos, direction, hit)){ // if something hit...
            // try to get the script TargetScript.js from the target...
            var tgScript: TargetScript = hit.transform.GetComponent(TargetScript);
            // if the object has such script, call its function TargetShot()
            if (tgScript) tgScript.TargetShot();
        }
        if(Indepvariable.charge <= 6){
            ...

I supposed the target script is called TargetScript.js. If it has a different name, replace TargetScript in the script above by its actual name (no quotes or extension) .

Anyway, replace OnCollisionEnter(…) by TargetShot() in the target script:

 
  ...
  function TargetShot(){
    audio.PlayOneShot(hitSound);
    targetRoot.animation.Play("down");
    beenHit=true;
    TargetControll.tgtdwn++;
  }
  ...