using UnityEngine; namespace GameDev.CoreSystems { public class Weapon : MonoBehaviour, IWeapon { [field: Header("RigConnections")] [field: SerializeField] public Transform PivotPoint { get; private set; } [field: SerializeField] public Transform BarrelEndPoint { get; private set; } [field: Header("Config")] [field: SerializeField] public float FireRate { get; set; } [field: SerializeField] public int Damage { get; set; } [field: Header("State")] [field: SerializeField] public bool FireWeapon { get; set; } [field: SerializeField] private float _timeUntilFire; [field: Header("Stats")] [field: SerializeField] public int NumberOfKills { get; set; } [field: SerializeField] public int DamageDealt { get; set; } private void Update() { if (FireWeapon) { _timeUntilFire -= Time.deltaTime; var reloading = _timeUntilFire > 0; if (reloading) return; var position = BarrelEndPoint.position; var forward = BarrelEndPoint.forward; var ray = new Ray(position, forward); if (Physics.Raycast(ray, out RaycastHit hitInfo)) { if (hitInfo.transform.TryGetComponent(out Targetable target)) { Debug.DrawRay(position, forward * Vector3.Distance(position, target.GetCenterPosition()), Color.red, 0.1f); target.Damageable.ModifyHealth(-Damage, gameObject); } } _timeUntilFire = FireRate; } else { _timeUntilFire = 0; } } public void IncrementDamageDealt(int damage) { DamageDealt += damage; } public void IncrementKillCount() { NumberOfKills += 1; } } }