Advertisement
Guest User

Approach1

a guest
Jul 20th, 2023
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.73 KB | Gaming | 0 0
  1. using Unity.Burst;
  2. using Unity.Collections;
  3. using Unity.Jobs;
  4. using UnityEngine;
  5. using UnityEngine.Jobs;
  6. using System.Collections.Generic;
  7.  
  8. public class ManagerEnemies : MonoBehaviour {
  9.  
  10.     [Header("Enemy Manager Settings")]
  11.     [SerializeField] private Transform player;
  12.     [SerializeField] private int maxNumEnemies = 5000;
  13.     [SerializeField] private string sounds = "Game/Enemies/";
  14.     [Space(20)]
  15.     [Header("Debugging")]
  16.     [SerializeField] private bool DebugMode = false;
  17.     [SerializeField] private bool enableAvoidance = true;
  18.     [SerializeField] private bool enableReAllocation = true;
  19.     [SerializeField] public int numEnemies;
  20.     [SerializeField] public int globalAvoidanceRadius;
  21.  
  22.     private EnemyUnit[] enemyUnits;
  23.     private List<EnemyUnit> reAllocUnits;
  24.  
  25.     private TransformAccessArray enemyTransforms;
  26.     private JobHandle enemyMoveJobHandle;
  27.  
  28.     private void Awake() {
  29.         enemyUnits = new EnemyUnit[maxNumEnemies];
  30.         reAllocUnits = new List<EnemyUnit>();
  31.         enemyTransforms = new TransformAccessArray(maxNumEnemies);
  32.     }
  33.  
  34.     private void Update() {
  35.         enemyMoveJobHandle.Complete();
  36.         enemyMoveJobHandle = MoveEnemiesJob();
  37.         enemyMoveJobHandle.Complete();
  38.     }
  39.  
  40.     private JobHandle MoveEnemiesJob() {
  41.         var job = new MoveEnemiesJob {
  42.             playerPosition = player.position,
  43.             enemyUnits = new NativeArray<EnemyUnit>(enemyUnits, Allocator.TempJob),
  44.             enemyTransforms = enemyTransforms,
  45.             enableAvoidance = enableAvoidance,
  46.             numEnemies = numEnemies,
  47.             deltaTime = Time.deltaTime
  48.         };
  49.         var jobHandle = job.Schedule(enemyUnits.Length, 64);
  50.         return jobHandle;
  51.     }
  52.  
  53.     private void LateUpdate() {
  54.         enemyMoveJobHandle.Complete();
  55.     }
  56.  
  57.     private void OnDestroy() {
  58.         enemyMoveJobHandle.Complete();
  59.         enemyTransforms.Dispose();
  60.     }
  61.  
  62.     public void RegisterEnemyUnit(EnemyUnit enemy) {
  63.         if (numEnemies < maxNumEnemies) {
  64.             enemyUnits[numEnemies] = enemy;
  65.             enemyTransforms.Add(enemy.transform);
  66.             numEnemies++;
  67.         } else {
  68.             if (DebugMode) { Debug.LogError("Maximum number of enemy units reached!"); }
  69.         }
  70.     }
  71.  
  72.     public void UnregisterEnemyUnit(EnemyUnit enemy) {
  73.         int index = System.Array.IndexOf(enemyUnits, enemy);
  74.         if (index >= 0) {
  75.             for (int i = index; i < numEnemies - 1; i++) {
  76.                 enemyUnits[i] = enemyUnits[i + 1];
  77.             }
  78.             numEnemies--;
  79.             enemyUnits[numEnemies] = null;
  80.             enemyTransforms.RemoveAtSwapBack(index);
  81.         } else {
  82.             if (DebugMode) { Debug.LogError("[<color=red>-</color>] Enemy unit not found in manager: " + enemy.uid.ToString()); }
  83.         }
  84.     }
  85.  
  86.     [BurstCompile]
  87.     private struct MoveEnemiesJob : IJobParallelForTransform {
  88.         public Vector3 playerPosition;
  89.         public NativeArray<EnemyUnit> enemyUnits;
  90.         public TransformAccessArray enemyTransforms;
  91.         public bool enableAvoidance;
  92.         public int numEnemies;
  93.         public float deltaTime;
  94.  
  95.         public void Execute(int index, TransformAccess transform) {
  96.             EnemyUnit enemyUnit = enemyUnits[index];
  97.             Vector3 direction = playerPosition - transform.position;
  98.             if (direction.magnitude > enemyUnit.playerRadius + enemyUnit.unitRadius) {
  99.                 Vector3 movementDirection = direction.normalized;
  100.                 float detectionAngle = 30f;
  101.                 float moveSpeed = enemyUnit.speed;
  102.                 Collider[] hitColliders = Physics.OverlapSphere(transform.position, 2f, LayerMask.GetMask("Enemy"));
  103.                 foreach (Collider collider in hitColliders) {
  104.                     if (collider != enemyUnit.GetComponent<Collider>())
  105.                     {
  106.                         Vector3 targetDirection = collider.transform.position - transform.position;
  107.                         float angle = Vector3.Angle(movementDirection, targetDirection);
  108.                         if (angle < detectionAngle)
  109.                         {
  110.                             moveSpeed = enemyUnit.speed / 2f;
  111.                             break;
  112.                         }
  113.                     }
  114.                 }
  115.                 transform.rotation = Quaternion.Euler(0f, transform.rotation.eulerAngles.y, transform.rotation.eulerAngles.z);
  116.                 transform.position = new Vector3(transform.position.x, 0f, transform.position.z);
  117.                 //transform.LookAt(playerPosition);
  118.                 transform.position += movementDirection * moveSpeed * deltaTime;
  119.             } else {
  120.                 Debug.Log("Attacking...");
  121.             }
  122.         }
  123.     }
  124. }
  125.  
Tags: Unity
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement