using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
public class Jugador : MonoBehaviour
Awake_ObtenerComponentes();
private void Update_Test()
if (Input.GetKeyDown(KeyCode.V))
private CharacterController cc;
private Animator animator;
private void Awake_ObtenerComponentes()
cc = GetComponent<CharacterController>();
animator = transform.GetChild(0).GetComponent<Animator>();
[SerializeField] private float velocidad = 5;
[SerializeField] private float velocidadCorrer = 10;
private Vector3 mov = Vector3.zero;
private bool bloquearMovimiento = false;
public bool bloquearRotacion = false;
private bool corriendo = false;
private float tCorrerMax = 3;
private float tCorrer = 3;
public const float Gravedad = -9.81f;
private void Update_Movimiento()
if (tCorrer > 0) tCorrer -= Time.deltaTime;
if (tCorrer < tCorrerMax) tCorrer += Time.deltaTime / 2;
if (tCorrer < tCorrerMax)
UI.BarraCorrer.gameObject.SetActive(true);
UI.RellenoCorrer.fillAmount = tCorrer / tCorrerMax;
UI.BarraCorrer.gameObject.SetActive(false);
if (bloquearMovimiento) return;
axis = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
if (Input.GetKeyDown(KeyCode.LeftShift) && tCorrer > 0) corriendo = true;
if (Input.GetKeyUp(KeyCode.LeftShift)) corriendo = false;
float vel = corriendo ? velocidadCorrer : velocidad;
animator.SetFloat("x", axis.x);
animator.SetFloat("y", axis.z);
animator.SetFloat("velocidad", vel);
Vector3 movXZ = axis * vel;
mov.y += Gravedad * Time.deltaTime;
cc.Move(mov * Time.deltaTime);
if (bloquearRotacion) return;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
LayerMask capa = LayerMask.GetMask("Piso");
if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, capa))
Vector3 collision = hit.point;
collision.y = transform.position.y;
transform.LookAt(collision);
[SerializeField] private AnimationClip aDisparoI;
[SerializeField] private AnimationClip aDisparoR;
[SerializeField] private AnimationClip aDisparoA;
[SerializeField] private AnimationClip aRecarga;
public ModoDisparo ModoDisparo = ModoDisparo.Individual;
private bool disparando = false;
private void Update_Disparo()
if (Input.GetKeyDown(KeyCode.R)) Recargar();
if (Input.GetMouseButtonDown(0)) Disparar();
if(Input.GetMouseButtonUp(0))
if (ModoDisparo == ModoDisparo.Automatico)
PararDisparoAutomatico();
if (Input.GetKeyDown(KeyCode.Q)) CambiarModoDisparo();
public void PararDisparoAutomatico()
animator.SetBool(name: "disparoAutomatico", value: false);
bloquearMovimiento = false;
if (!PuedeDisparar) return;
bloquearMovimiento = true;
case ModoDisparo.Individual:
animator.SetTrigger(name:"disparoIndividual");
Invoke(methodName: "TimerAnimacionDisparo", aDisparoI.length);
animator.SetTrigger(name:"disparoRafaga");
Invoke(methodName: "TimerAnimacionDisparo", aDisparoR.length);
case ModoDisparo.Automatico:
animator.SetBool(name: "disparoAutomatico", value: true);
public void TimerAnimacionDisparo()
bloquearMovimiento = false;
private void CambiarModoDisparo()
case ModoDisparo.Individual: ModoDisparo = ModoDisparo.Rafaga; break;
case ModoDisparo.Rafaga: ModoDisparo = ModoDisparo.Automatico; break;
case ModoDisparo.Automatico: ModoDisparo = ModoDisparo.Individual; break;
public bool PuedeDisparar
if (disparando) return false;
if (BalasCargador <= 0) return false;
private bool recargando = false;
if (Municion <= 0) return;
bloquearMovimiento = true;
animator.SetTrigger(name: "recargar");
Invoke(methodName: "TerminarRecarga", aRecarga.length);
private void TerminarRecarga()
bloquearMovimiento = false;
if (Municion >= tamañoCargador)
Municion -= tamañoCargador;
BalasCargador = tamañoCargador;
BalasCargador = Municion;
private int tamañoCargador = 25;
private int _balasCargador = 25;
private int _municion = 80;
private int municionMax = 500;
public bool MunicionCompleta => Municion >= municionMax;
UI.Municion = BalasCargador + " / " + Municion;
if (value > municionMax) _municion = municionMax;
UI.Municion = BalasCargador + "/" + Municion;
private void Trigger_Municion(Municion municionObj)
if (MunicionCompleta) return;
Municion += municionObj.Cantidad;
Destroy(municionObj.gameObject);
#endregion DISPARO Municion
private void OnTriggerEnter(Collider other)
switch (other.gameObject.layer)
case 9: Trigger_Checkpoint(other.GetComponent<Checkpoint>()); break;
case 10: Trigger_Municion(other.GetComponent<Municion>());break;
private List<Vector3> listaCheckpoints = new List<Vector3>() { Vector3.zero };
private void Trigger_Checkpoint(Checkpoint checkpoint)
listaCheckpoints.Add(item:checkpoint.transform.position + (Vector3.back*2));
private Vector3 CheckpointMasCercano()
Vector3 origen = transform.position;
return listaCheckpoints.OrderBy(cp => Vector3.Distance(a:cp,b:origen)).FirstOrDefault();
[SerializeField] private Transform canvas;
[SerializeField] private Image barraVida;
private int vidaMaxima = 100;
public bool Muerto = false;
private void LateUpdate()
canvas.LookAt(Camera.main.transform);
private void Trigger_AtaqueZombie()
else if (value > vidaMaxima)
barraVida.fillAmount = (float)_vida / vidaMaxima;
animator.SetBool(name: "muerto", value: true);
bloquearMovimiento = true;
canvas.gameObject.SetActive(false);
Invoke(methodName: "Revivir", time: 3);
transform.position = CheckpointMasCercano();
animator.SetBool(name: "muerto", value: false);
bloquearMovimiento = false;
bloquearRotacion = false;
canvas.gameObject.SetActive(true);