0
votes

pourquoi mon raycast cesse-t-il de fonctionner après quelques secondes?

J'ai une arme qui utilise un raycast pour détecter un ennemi. avant ce code fonctionnait parfaitement mais maintenant, quand je tire sur un ennemi après avoir attendu quelques secondes, le raycast ne détecte pas l'ennemi, c'est le code du pistolet

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

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

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



    void Die ()
    {
        Destroy(gameObject);
    }

   }




voici le script ennemi

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);

    }
   }

cela a commencé à se produire après avoir ajouté un contrôleur et un animateur ennemi à l'ennemi que le raycast aurait frappé.


2 commentaires

voici une vidéo qui l'affiche youtu.be/SXuTczhN7iY


Malheureusement, la vidéo n'ajoute pas beaucoup de contexte car elle ne sait pas ce que vous vous attendiez à se produire. Votre raycast ne semble pas tenir compte du fait que vous pouvez frapper votre propre playercolider, donc le raycast échoue s'il démarre à l'intérieur d'un collisionneur et n'est pas dit de l'ignorer.


3 Réponses :


-1
votes

Lorsque la portée est si petite, l'arme doit être très proche du collisionneur ennemi. Essayez de l'augmenter à 10,0f.


1 commentaires

merci, cela n'a pas fonctionné car le flotteur en jeu avait déjà 40 ans.



0
votes

ok mon jeu m'a juste fait refaire des trucs et cela fonctionne finalement pour une raison quelconque et je pense que la raison était parce que j'utilisais un préfabriqué puisque c'est la seule différence.


0 commentaires

0
votes

J'ai eu un problème similaire et j'ai passé des heures à comprendre ce qui se passe. Si vous utilisez Nav Mesh Agent et Rigidbody sur l'ennemi en même temps, essayez de changer la détection de collision en "Continuous" au lieu de "Discrete".

J'ai trouvé cet ancien article qui m'aide: https://answers.unity.com/questions/658434/why-do-raycasts-ignore-navmesh-agents.html


0 commentaires