Modifiquei algumas coisas à meu modo, mas no geral te segui. somente quando chega na linha que te falei que dá erro.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Cinemachine;
public class GerenciadorDeArmas : MonoBehaviour
{
[SerializeField] private List armasDisponiveis;
[SerializeField] private Arma armaPrimaria;
[SerializeField] private Arma armaSecundaria;
[SerializeField] private GameObject efeitoImpactoDeTiro;
[SerializeField] private GameObject efeitoDeSangue;
[SerializeField] private LayerMask tiroLayerMask;
private Transform cameraPrincipal;
private float tempoProximoTiro;
private MovimentoJogador movimentoJogador;
private Coroutine recarregarCoroutine;
private bool recarregando;
[SerializeField] private CinemachineImpulseSource cinemachineImpulseSource;
// Adicionando a variável pública para o ponto de disparo
[SerializeField] private Transform pontoDeDisparo; // Referência para o ponto de disparo
void Start()
{
cameraPrincipal = Camera.main.transform;
armaPrimaria.gameObject.SetActive(true);
armaSecundaria?.gameObject.SetActive(false);
movimentoJogador = GetComponent<MovimentoJogador>();
}
void Update()
{
if (recarregando) return;
Arma armaAtual = GetArmaAtual();
Recarregar(armaAtual); // Chama a função Recarregar
Atirar(armaAtual);
Mirar(armaAtual); // Chama a função Mirar
if (Time.frameCount % 5 == 0)
{
if (pontoDeDisparo != null) // Verifica se o pontoDeDisparo está atribuído
{
// Posição do ponto de disparo (objeto vazio na ponta da arma)
Vector3 rayStart = pontoDeDisparo.position;
// Direção para frente da arma
Vector3 rayDirection = armaPrimaria.transform.forward;
// Desenha o raio a partir do ponto de disparo
Debug.DrawRay(rayStart, rayDirection * 5, Color.red); // O raio tem comprimento de 5 unidades
}
}
}
public Arma GetArmaAtual()
{
return armaPrimaria.gameObject.activeSelf ? armaPrimaria : armaSecundaria;
}
private void Atirar(Arma armaAtual)
{
if (Input.GetButton("Fire1") && Time.time >= tempoProximoTiro && armaAtual.municaoAtual > 0 && !movimentoJogador.EstaCorrendo())
{
cinemachineImpulseSource.GenerateImpulse();
tempoProximoTiro = Time.time + 1f / armaAtual.tirosPorSegundo;
armaAtual.RealizarDisparo();
RaycastHit hit;
Vector3 rayStart = pontoDeDisparo.position; // Posição do ponto de disparo
Vector3 rayDirection = armaPrimaria.transform.forward; // Direção para frente da arma
// Desenha o raio na cena com a cor vermelha
Debug.DrawRay(rayStart, rayDirection * 1000, Color.red, 0.1f); // 1000 é o comprimento do raio
// Verifica colisões com o raio
if (Physics.Raycast(rayStart, rayDirection, out hit, 1000, tiroLayerMask, QueryTriggerInteraction.Ignore))
{
var parteDoCorpoInimigo = hit.transform.GetComponent<ParteDoCorpo>();
if (parteDoCorpoInimigo)
{
Instantiate(efeitoDeSangue, hit.point, Quaternion.LookRotation(hit.normal));
var vidaInimigo = parteDoCorpoInimigo.transform.root.GetComponent<VidaInimigo>();
int dano = armaAtual.GetDano(hit.distance, parteDoCorpoInimigo.nivelDeDano);
bool inimigoMorto = vidaInimigo.ReduzirVida(dano);
if(inimigoMorto)
{
if(parteDoCorpoInimigo.nivelDeDano == NivelDeDano.ALTO)
{
Jogador.Instance.AdicionarPontos(vidaInimigo.GetPontosDerrota() * 2);
}
else
{
Jogador.Instance.AdicionarPontos(vidaInimigo.GetPontosDerrota());
}
}
}
else
{
Instantiate(efeitoImpactoDeTiro, hit.point, Quaternion.LookRotation(hit.normal));
}
}
}
}
private void Recarregar(Arma armaAtual)
{
if ((Input.GetKeyDown(KeyCode.R) || armaAtual.municaoAtual <= 0) && armaAtual.municaoNoInventario > 0)
{
CancelarRecarga();
recarregarCoroutine = StartCoroutine(ExecutarRecarga(armaAtual));
}
}
private void CancelarRecarga()
{
if (recarregarCoroutine != null)
{
StopCoroutine(recarregarCoroutine);
}
recarregando = false;
}
private IEnumerator ExecutarRecarga(Arma armaAtual)
{
recarregando = true;
armaAtual.animator.SetTrigger("Recarregar");
yield return new WaitForSeconds(armaAtual.tempoDelayRecarregar);
int balasParaRecarregar = Mathf.Min(armaAtual.capacidadeDoPente, armaAtual.municaoNoInventario) - armaAtual.municaoAtual;
armaAtual.RecarregarArma(balasParaRecarregar);
recarregando = false;
}
private void Mirar(Arma armaAtual)
{
if (Input.GetKeyDown(KeyCode.Mouse1))
{
armaAtual.AlterarMira();
}
}