Advertisement
Guest User

Approach 3

a guest
Jul 20th, 2023
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.34 KB | Gaming | 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] private Transform player;
  13.     private List<EnemyUnitBURST> m_Enemies = new List<EnemyUnitBURST>();
  14.     private NativeArray<EnemyTransform> m_Transforms;
  15.     private JobHandle m_MoveJobHandle;
  16.     private bool delay = true;
  17.  
  18.     private void Awake() {
  19.         m_Transforms = new NativeArray<EnemyTransform>(m_Enemies.Count, Allocator.Persistent);
  20.     }
  21.  
  22.     private void Update() {
  23.         if(delay == true){
  24.             var moveJob = new MoveJob {
  25.                 transforms = m_Transforms,
  26.                 deltaTime = Time.deltaTime,
  27.                 playerPosition = player.position
  28.             };
  29.             m_MoveJobHandle = moveJob.Schedule(m_Transforms.Length, 64);          // ERROR
  30.             // wait for job to finish
  31.             StartCoroutine(WaitForMoveJob(m_MoveJobHandle));
  32.             delay = false;
  33.         }
  34.     }
  35.  
  36.     private IEnumerator WaitForMoveJob(JobHandle jobHandle) {
  37.         while (!jobHandle.IsCompleted) {
  38.             yield return null;
  39.         }
  40.         jobHandle.Complete();
  41.         Debug.Log("Completed Job...");
  42.         for (int i = 0; i < m_Enemies.Count; i++) {
  43.             m_Enemies[i].transform.position = m_Transforms[i].position;
  44.             m_Enemies[i].transform.rotation = m_Transforms[i].rotation;
  45.         }
  46.         delay = true;
  47.     }
  48.  
  49.     public void RegisterEnemy(EnemyUnitBURST enemy) {
  50.         m_Enemies.Add(enemy);
  51.         var newTransforms = new NativeArray<EnemyTransform>(m_Enemies.Count, Allocator.Persistent);
  52.         NativeArray<EnemyTransform>.Copy(m_Transforms, newTransforms, m_Enemies.Count - 1);
  53.         newTransforms[m_Enemies.Count - 1] = new EnemyTransform(enemy.transform);
  54.         m_Transforms.Dispose();
  55.         m_Transforms = newTransforms;
  56.     }
  57.  
  58.     private void OnDestroy() {
  59.         m_Transforms.Dispose();
  60.     }
  61.  
  62.     [BurstCompile]
  63.     private struct MoveJob : IJobParallelForTransform  {
  64.         public NativeArray<EnemyTransform> transforms;
  65.         public float deltaTime;
  66.         public float3 playerPosition;
  67.  
  68.         public void Execute(int index, TransformAccess transform) {
  69.             float3 direction = math.normalize(playerPosition - (float3)transform.position);
  70.             transform.position = (float3)transform.position + (direction * transforms[index].moveSpeed * deltaTime);
  71.             transform.rotation = quaternion.LookRotation(direction, math.up());
  72.             transforms[index] = new EnemyTransform(transform);
  73.         }
  74.     }
  75.  
  76.     private struct EnemyTransform {
  77.         public float3 position;
  78.         public quaternion rotation;
  79.         public float moveSpeed;
  80.  
  81.         public EnemyTransform(Transform transform) {
  82.             position = transform.position;
  83.             rotation = transform.rotation;
  84.             moveSpeed = transform.GetComponent<EnemyUnitBURST>().moveSpeed;
  85.         }
  86.  
  87.         public EnemyTransform(TransformAccess transform) {
  88.             position  = transform.position;
  89.             rotation  = transform.rotation;
  90.             moveSpeed = 1;
  91.             //moveSpeed = transform.GetComponent<EnemyUnitBURST>().moveSpeed;  // ERROR
  92.         }
  93.     }
  94. }
Tags: Unity
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement