Проблема коллайдера в шутере от первого лица - PullRequest
0 голосов
/ 22 июня 2019

Я создаю игру FPS, и у меня возникает следующая проблема:

Иногда, когда я стреляю по врагам, удар не распознается, даже если игрок стреляет перед ними.Однако, когда они атакуют игрока, попадание распознается как обычно.

У них есть коробчатый коллайдер и твердое тело, прикрепленное к ним.

Этот скрипт прикреплен к игроку:

using System.Collections.Generic;
using UnityEngine;

public class DisparaArma : MonoBehaviour
{
    private GerenciaArma gerenciaArma;

    public float nDisparo = 15f;
    private float TempoProximoDisparo;
    public float damage = 20f;

    private Animator ZoomCameraIn;
    private bool zoomed;

    private Camera Maincamera;
    private GameObject mira;
    // Start is called before the first frame update
    void Start()
    {
        gerenciaArma = GetComponent<GerenciaArma>();
        ZoomCameraIn = transform.Find(Tags.LOOK_ROOT).transform.Find(Tags.ZOOM_CAMERA).GetComponent<Animator>();

        mira = GameObject.FindWithTag(Tags.MIRA);
        Maincamera = Camera.main;
    }

    // Update is called once per frame
    void Update()
    {
        Atira();
        ZoomInAndOut();
    }

    void Atira()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if(gerenciaArma.SelecionaArma().tipoBala == WeaponBulletType.BULLET)
            {
                gerenciaArma.SelecionaArma().AnimacaoTiro();
                DisparaBala();


            }

        }
    }

    void ZoomInAndOut()
    {
        if (gerenciaArma.SelecionaArma().mira_tipo == TipoMira.AIM)
        {
            if (Input.GetMouseButtonDown(1))
            {
                ZoomCameraIn.Play(Animacoes.ZOOM_IN_ANIM);
               // gerenciaArma.SelecionaArma().Aim(true);
                mira.SetActive(false);
                print("VaiZoom");
            }

            if (Input.GetMouseButtonUp(1))//
            {
                ZoomCameraIn.Play(Animacoes.ZOOM_OUT_ANIM);
                //gerenciaArma.SelecionaArma().Aim(false);
                mira.SetActive(true);
            }
        }
    }

    void DisparaBala()
    {
        RaycastHit hit;
        if(Physics.Raycast(Maincamera.transform.position, Maincamera.transform.forward, out hit))
        {

            if (hit.transform.tag == Tags.ENEMY_TAG)
            {
                hit.transform.GetComponent<ScriptVida>().DanoAplicado(damage);
            }
        }
    }
}

И этот прикреплен к врагам:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class ScriptVida : MonoBehaviour
{
    private IndioAnimações indio_Anim;
    private NavMeshAgent navAgent;
    private IndioController indio_Controller;

    public float vida = 100f;
    public bool is_Player, is_Cannibal, is_Tiger;

    private bool morto;
    // Start is called before the first frame update
    void Awake()
    {
        if (is_Tiger || is_Cannibal)
        {
            indio_Anim = GetComponent<IndioAnimações>();
            indio_Controller = GetComponent<IndioController>();
            navAgent = GetComponent<NavMeshAgent>();
        }

        if (is_Player)
        {

        }
    }

    public void DanoAplicado(float damage)
    {
        if (morto)
            return;
        vida -= damage;


        if (is_Player)
        {

        }

        if (is_Tiger || is_Cannibal)
        {
            if (indio_Controller.EnemyState == EnemyState.PATROL)
            {
                indio_Controller.chase_Distance = 50f;
            }
        }

        if (vida <= 0)
        {
            JogadorMorre();
            morto = true;
            print(vida);
        }

    }

    void JogadorMorre()
    {
        if (is_Cannibal)//
        {
            GetComponent<Animator>().enabled = false;
            GetComponent<BoxCollider>().isTrigger = false;
            GetComponent<Rigidbody>().AddTorque(-transform.forward * 50f);

            indio_Controller.enabled = false;
            navAgent.enabled = false;
            indio_Anim.enabled = false;
        }

        if (is_Tiger)
        {
            GetComponent<Animator>().enabled = false;
            GetComponent<BoxCollider>().isTrigger = false;
            GetComponent<Rigidbody>().AddTorque(-transform.forward * 50f);

            indio_Controller.enabled = false;
            navAgent.enabled = false;
            indio_Anim.enabled = false;
        }

        if (is_Player)
        {
            GameObject[] enemies = GameObject.FindGameObjectsWithTag(Tags.ENEMY_TAG);
            for (int i = 0; i < enemies.Length; i++)
            {
                enemies[i].GetComponent<IndioController>().enabled = false;
            }

            GetComponent<Movimentação>().enabled = false;
            GetComponent<DisparaArma>().enabled = false;
            GetComponent<GerenciaArma>().SelecionaArma().gameObject.SetActive(false);
        }

        if (tag == Tags.PLAYER_TAG)
        {
            Invoke("RestartGame", 3f);
        }

        else
        {
            Invoke("TurnOffGameObject", 3f);
        }
    }

    void RestartGame()
    {
        UnityEngine.SceneManagement.SceneManager.LoadScene("Gameplay");
    }

    void TurnOffGameObject()
    {
        gameObject.SetActive(false);
    }

}

Я думаю, что проблема связана с коробочным коллайдером.Как я мог решить это, ребята?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...