DugganSC

Untitled

Oct 1st, 2025
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.52 KB | None | 0 0
  1. using GameDevHQ.FileBase.Gatling_Gun;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using UnityEngine;
  7. using UnityEngine.AI;
  8.  
  9. public class HitscanTurret : Emplacement, IDamageable
  10. {
  11.     [SerializeField] float _attackRange = 1f;
  12.     [SerializeField] float _damagePerSecond = 10f;
  13.     [SerializeField] float _turnSpeed = 1f;
  14.     [SerializeField] float _targetingArc = 5f;
  15.  
  16.     [SerializeField, ReadOnly(true)] Collider _triggerCollider;
  17.  
  18.     [SerializeField] GameObject _turretObject;
  19.  
  20.     [SerializeField] GameObject _closestEnemy;
  21.     [SerializeField] float _idleTurnSpeed = 0.2f;
  22.  
  23.     [SerializeField] Gatling_Gun _gun;
  24.     Dictionary<int, GameObject> _enemyDict;
  25.     List<GameObject> _availableEnemies;
  26.  
  27.     private void Start()
  28.     {
  29.         _enemyDict = new Dictionary<int, GameObject>();
  30.  
  31.         SphereCollider collider = gameObject.AddComponent<SphereCollider>();
  32.         collider.radius = _attackRange;
  33.         collider.isTrigger = true;
  34.  
  35.         _triggerCollider = collider;
  36.     }
  37.  
  38.     private void OnDrawGizmos()
  39.     {
  40.         Gizmos.DrawWireSphere(transform.position, _attackRange);
  41.     }
  42.  
  43.     // Update is called once per frame
  44.     void Update()
  45.     {
  46.         if (!_active) { return; }
  47.  
  48.         FindEnemy();
  49.  
  50.         AimAtAndShootAtCurrentEnemy();
  51.     }
  52.  
  53.     private void OnTriggerEnter(Collider other)
  54.     {
  55.         if (other.CompareTag("EnemyTarget"))
  56.         {
  57.             Debug.Log("Adding enemy", other.gameObject);
  58.             _enemyDict.Add(other.gameObject.GetInstanceID(), other.gameObject);
  59.  
  60.             if (_closestEnemy != null)
  61.             {
  62.                 _closestEnemy = other.gameObject;
  63.             }
  64.         }
  65.     }
  66.  
  67.     private void OnTriggerExit(Collider other)
  68.     {
  69.         int instanceID = other.gameObject.GetInstanceID();
  70.         if (other.CompareTag("EnemyTarget") && _enemyDict.ContainsKey(instanceID))
  71.         {
  72.             Debug.Log("Removing enemy", other.gameObject);
  73.             _enemyDict.Remove(instanceID);
  74.  
  75.             if (_closestEnemy && _closestEnemy.GetInstanceID() == instanceID)
  76.             {
  77.                 _closestEnemy = null;   // We'll find them in the Aim
  78.                 // EventManager.Instance.StopFiring(_closestEnemy);
  79.             }
  80.         }
  81.     }
  82.  
  83.     private int? GetClosestEnemyID()
  84.     {
  85.         GameObject enemy = _closestEnemy;
  86.         while (!enemy.transform.root)
  87.         {
  88.             enemy = enemy.transform.root.gameObject;
  89.             if (enemy.CompareTag("Enemy"))
  90.             {
  91.                 return enemy.GetInstanceID();
  92.             }
  93.         }
  94.  
  95.         return null;
  96.     }
  97.  
  98.     private void AimAtAndShootAtCurrentEnemy()
  99.     {
  100.         if (_closestEnemy == null)
  101.         {
  102.             _gun.Firing = false;
  103.             return;
  104.         }
  105.  
  106.         // Shouldn't need to do distance check since our trigger volume handles it
  107.  
  108.         Vector3 targetVector = _closestEnemy.transform.position - _turretObject.transform.position;
  109.         // Rotate toward the hit
  110.         _turretObject.transform.forward = Vector3.RotateTowards(_turretObject.transform.forward, targetVector, _turnSpeed * Time.deltaTime, 0f);
  111.  
  112.         // If in target arc, fire
  113.         if (Vector3.Angle(_turretObject.transform.forward, targetVector) < _targetingArc && !_gun.Firing)
  114.         {
  115.             // Play the animation for firing
  116.             _gun.Firing = true;
  117.  
  118.             int? enemyID = GetClosestEnemyID();
  119.             if (enemyID != null)
  120.             {
  121.                 EventManager.Instance.DispatchAttackStart((int)enemyID, _damagePerSecond);
  122.             }
  123.         } else
  124.         {
  125.             _gun.Firing = false;
  126.         }
  127.     }
  128.  
  129.     private void FindEnemy()
  130.     {
  131.         if (_closestEnemy != null)
  132.         {
  133.             return;
  134.         }
  135.        
  136.         if (_enemyDict.Count < 1)
  137.         {
  138.             // General spin
  139.             _turretObject.transform.Rotate(Vector3.up, _idleTurnSpeed * Time.deltaTime);
  140.             _gun.Firing = false;
  141.             return;
  142.         }
  143.  
  144.         _closestEnemy = _enemyDict[0];
  145.         float _closestDistance = Vector3.Distance(transform.position, _closestEnemy.transform.position);
  146.  
  147.         for (int i = 1; i < _enemyDict.Count; i++)
  148.         {
  149.             float distance = Vector3.Distance(transform.position, _enemyDict[i].transform.position);
  150.             if (distance < _closestDistance) {
  151.                 _closestDistance = distance;
  152.                 _closestEnemy = _enemyDict[i];
  153.             }
  154.         }        
  155.     }
  156. }
  157.  
Advertisement
Add Comment
Please, Sign In to add comment