Advertisement
Guest User

Untitled

a guest
Jul 20th, 2023
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.19 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Unity.Burst;
  4. using Unity.Collections;
  5. using Unity.Jobs;
  6. using Unity.Mathematics;
  7. using UnityEngine;
  8. using UnityEngine.Jobs;
  9.  
  10. public class EnemyManagerBURST : MonoBehaviour
  11. {
  12.     [SerializeField] Transform _player;
  13.  
  14.     [SerializeField] List<EnemyUnitBURST> _enemies = new List<EnemyUnitBURST>(); // always up to date list of enemies
  15.  
  16.     NativeList<EnemyData> _enemyDatas; // any movement relevant data
  17.     TransformAccessArray _transformAccessArray; // transforms for job system
  18.     JobHandle? _moveJobHandle; // nullable for first run
  19.  
  20.     Transform[] _transformCache = new Transform[0]; // helper to set TransformAccessArray
  21.  
  22.     public void RegisterEnemy(EnemyUnitBURST enemy)
  23.     {
  24.         _enemies.Add(enemy);
  25.     }
  26.     public void UnRegisterEnemy(EnemyUnitBURST enemy)
  27.     {
  28.         _enemies.Remove(enemy);
  29.     }
  30.  
  31.     private void Awake()
  32.     {
  33.         _enemyDatas = new NativeList<EnemyData>(0, Allocator.Persistent);
  34.         _transformAccessArray = new TransformAccessArray(0);
  35.     }
  36.     private void OnDestroy()
  37.     {
  38.         _enemyDatas.Dispose();
  39.         _transformAccessArray.Dispose();
  40.     }
  41.  
  42.     private void Update()
  43.     {
  44.         HandleJobActions();
  45.     }
  46.  
  47.     // is in own method so there is no return in Update, which can get confusing
  48.     void HandleJobActions()
  49.     {
  50.         // job is running
  51.         if (_moveJobHandle.HasValue && !_moveJobHandle.Value.IsCompleted) return;
  52.  
  53.         // complete the handle if it exists
  54.         if (_moveJobHandle.HasValue)
  55.         {
  56.             _moveJobHandle.Value.Complete();
  57.             Debug.Log($"Completed Job ...");
  58.         }
  59.  
  60.         // update collections when the job is completed, so they are free
  61.         UpdateNativeCollections();
  62.  
  63.         // start the job whenever the old one is completed
  64.         RestartJob();
  65.     }
  66.  
  67.     void UpdateNativeCollections()
  68.     {
  69.         if(_enemyDatas.Length != _enemies.Count || _transformAccessArray.length != _enemies.Count)
  70.         {
  71.             Debug.Log("Update Collections");
  72.             _enemyDatas.Resize(_enemies.Count, NativeArrayOptions.UninitializedMemory);
  73.             System.Array.Resize(ref _transformCache, _enemies.Count);
  74.  
  75.             for (int i = 0; i < _enemies.Count; i++)
  76.             {
  77.                 _enemyDatas[i] = new EnemyData(_enemies[i]);
  78.                 _transformCache[i] = _enemies[i].transform;
  79.             }
  80.             // use helper array to set the TransformAccessArray
  81.             _transformAccessArray.SetTransforms(_transformCache);
  82.         }
  83.     }
  84.  
  85.     void RestartJob()
  86.     {
  87.         var moveJob = new MoveJob
  88.         {
  89.             enemyDatas = _enemyDatas,
  90.             deltaTime = Time.deltaTime,
  91.             playerPosition = _player.position
  92.         };
  93.         _moveJobHandle = moveJob.Schedule(_transformAccessArray);
  94.     }
  95.  
  96.     [BurstCompile]
  97.     private struct MoveJob : IJobParallelForTransform
  98.     {
  99.         [ReadOnly] public float deltaTime;
  100.         [ReadOnly] public float3 playerPosition;
  101.         [ReadOnly] public NativeList<EnemyData> enemyDatas;
  102.  
  103.         public void Execute(int index, TransformAccess transform)
  104.         {
  105.             float3 direction = math.normalize(playerPosition - (float3)transform.position);
  106.             transform.position = (float3)transform.position + (direction * enemyDatas[index].moveSpeed * deltaTime);
  107.             transform.rotation = quaternion.LookRotation(direction, math.up());
  108.         }
  109.     }
  110.  
  111.     private struct EnemyData
  112.     {
  113.         public float moveSpeed;
  114.  
  115.         public EnemyData(EnemyUnitBURST enemyUnit)
  116.         {
  117.             this.moveSpeed = enemyUnit.moveSpeed;
  118.         }
  119.     }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement