Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using Unity.Burst;
- using Unity.Collections;
- using Unity.Jobs;
- using Unity.Mathematics;
- using UnityEngine;
- using UnityEngine.Jobs;
- public class EnemyManagerBURST : MonoBehaviour
- {
- [SerializeField] Transform _player;
- [SerializeField] List<EnemyUnitBURST> _enemies = new List<EnemyUnitBURST>(); // always up to date list of enemies
- NativeList<EnemyData> _enemyDatas; // any movement relevant data
- TransformAccessArray _transformAccessArray; // transforms for job system
- JobHandle? _moveJobHandle; // nullable for first run
- Transform[] _transformCache = new Transform[0]; // helper to set TransformAccessArray
- public void RegisterEnemy(EnemyUnitBURST enemy)
- {
- _enemies.Add(enemy);
- }
- public void UnRegisterEnemy(EnemyUnitBURST enemy)
- {
- _enemies.Remove(enemy);
- }
- private void Awake()
- {
- _enemyDatas = new NativeList<EnemyData>(0, Allocator.Persistent);
- _transformAccessArray = new TransformAccessArray(0);
- }
- private void OnDestroy()
- {
- _enemyDatas.Dispose();
- _transformAccessArray.Dispose();
- }
- private void Update()
- {
- HandleJobActions();
- }
- // is in own method so there is no return in Update, which can get confusing
- void HandleJobActions()
- {
- // job is running
- if (_moveJobHandle.HasValue && !_moveJobHandle.Value.IsCompleted) return;
- // complete the handle if it exists
- if (_moveJobHandle.HasValue)
- {
- _moveJobHandle.Value.Complete();
- Debug.Log($"Completed Job ...");
- }
- // update collections when the job is completed, so they are free
- UpdateNativeCollections();
- // start the job whenever the old one is completed
- RestartJob();
- }
- void UpdateNativeCollections()
- {
- if(_enemyDatas.Length != _enemies.Count || _transformAccessArray.length != _enemies.Count)
- {
- Debug.Log("Update Collections");
- _enemyDatas.Resize(_enemies.Count, NativeArrayOptions.UninitializedMemory);
- System.Array.Resize(ref _transformCache, _enemies.Count);
- for (int i = 0; i < _enemies.Count; i++)
- {
- _enemyDatas[i] = new EnemyData(_enemies[i]);
- _transformCache[i] = _enemies[i].transform;
- }
- // use helper array to set the TransformAccessArray
- _transformAccessArray.SetTransforms(_transformCache);
- }
- }
- void RestartJob()
- {
- var moveJob = new MoveJob
- {
- enemyDatas = _enemyDatas,
- deltaTime = Time.deltaTime,
- playerPosition = _player.position
- };
- _moveJobHandle = moveJob.Schedule(_transformAccessArray);
- }
- [BurstCompile]
- private struct MoveJob : IJobParallelForTransform
- {
- [ReadOnly] public float deltaTime;
- [ReadOnly] public float3 playerPosition;
- [ReadOnly] public NativeList<EnemyData> enemyDatas;
- public void Execute(int index, TransformAccess transform)
- {
- float3 direction = math.normalize(playerPosition - (float3)transform.position);
- transform.position = (float3)transform.position + (direction * enemyDatas[index].moveSpeed * deltaTime);
- transform.rotation = quaternion.LookRotation(direction, math.up());
- }
- }
- private struct EnemyData
- {
- public float moveSpeed;
- public EnemyData(EnemyUnitBURST enemyUnit)
- {
- this.moveSpeed = enemyUnit.moveSpeed;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement