简体   繁体   中英

why does my raycast stop working after a few seconds?

i have a gun that uses a raycast to detect an enemy. before this code was working perfectly but now when i shoot an enemy after i wait a couple seconds the raycast does not detect the enemy this is the gun code

using System.Collections;
   using UnityEngine;

   public class Gun : MonoBehaviour
   {
    public float damage = 25f;
    public float range = .00000000000000000000000001f;
    public float fireRate = 1f;

   public int maxAmmo = 5;
    private int currentAmmo;
    public float reloadTime = 3f;
   public bool isReloading = true;

    public Camera fpsCam;
    public ParticleSystem MuzzleFlash;
    public GameObject impactEffect;
    public float impactForce = 30f;

    private float nextTimeToFire = 0f;

    public Animator animator;



    private void Start()
    {
        currentAmmo = maxAmmo;


    }

    void OnEnable()
    {
        isReloading = false;
        animator.SetBool("Reloading", false);
    }

    // Update is called once per frame
    void Update()
    {

        if (isReloading)
            return;


        if (currentAmmo <= 0)
        {
          StartCoroutine(Reload());
            return;
        }

        if (Input.GetButtonDown("Fire1") && Time.time >= nextTimeToFire)
        {
            nextTimeToFire = Time.time + 1f / fireRate;
            Shoot();
        }
    }

    IEnumerator Reload()
    {
        isReloading = true;
        Debug.Log("RELOAD");

        animator.SetBool("Reloading", true);

        yield return new WaitForSeconds(reloadTime - .25f);
        animator.SetBool("Reloading", false);
        yield return new WaitForSeconds(.25f);

        currentAmmo = maxAmmo;


        isReloading = false;

    }

    void Shoot()
    {
        MuzzleFlash.Play();

        currentAmmo--;

        RaycastHit hit;
        if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
        {
            Debug.Log(hit.transform.name);

            Enemy enemy = hit.transform.GetComponent<Enemy>();
            if (enemy != null)
            {
                enemy.TakeDamage(damage);
            }

            if (hit.rigidbody != null)
            {
                hit.rigidbody.AddForce(hit.normal * impactForce);
            }


            if (isReloading == true)
            {
                animator.SetBool("Shooting", false);

            }
        }

        GameObject impactGO =  Instantiate(impactEffect, hit.point, 
   Quaternion.LookRotation(hit.normal));
        Destroy(impactGO, 2f);

    }
   }

here is the enemy script


    **public class Enemy : MonoBehaviour
   {
    public float health = 50f;

    public void TakeDamage(float amount)
    {
        health -= amount;

        if (health <= 0f)
        {
            Die();
        }
    }



    void Die ()
    {
        Destroy(gameObject);
    }

   }




this started happening after i added anenemy controller and animator to the enemy the raycast woukd hit.

I had similar issue and I have spend hours to figure it out what is happening. If you are using Nav Mesh Agent and Rigidbody on the enemy at same time try to change Collision Detection to "Continuous" instead of "Discrete".

I found this old post which helps me out: https://answers.unity.com/questions/658434/why-do-raycasts-ignore-navmesh-agents.html

好吧,我的游戏只是让我重做一些东西,它终于出于某种原因起作用了,我猜原因是因为我使用的是预制件,因为这是唯一的区别。

When the range is so small, the weapon needs to be really close to enemy's collider. Try increasing it to 10.0f.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM