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] private Transform player;
- private List<EnemyUnitBURST> m_Enemies = new List<EnemyUnitBURST>();
- private NativeArray<EnemyTransform> m_Transforms;
- private JobHandle m_MoveJobHandle;
- private bool delay = true;
- private void Awake() {
- m_Transforms = new NativeArray<EnemyTransform>(m_Enemies.Count, Allocator.Persistent);
- }
- private void Update() {
- if(delay == true){
- var moveJob = new MoveJob {
- transforms = m_Transforms,
- deltaTime = Time.deltaTime,
- playerPosition = player.position
- };
- m_MoveJobHandle = moveJob.Schedule(m_Transforms.Length, 64); // ERROR
- // wait for job to finish
- StartCoroutine(WaitForMoveJob(m_MoveJobHandle));
- delay = false;
- }
- }
- private IEnumerator WaitForMoveJob(JobHandle jobHandle) {
- while (!jobHandle.IsCompleted) {
- yield return null;
- }
- jobHandle.Complete();
- Debug.Log("Completed Job...");
- for (int i = 0; i < m_Enemies.Count; i++) {
- m_Enemies[i].transform.position = m_Transforms[i].position;
- m_Enemies[i].transform.rotation = m_Transforms[i].rotation;
- }
- delay = true;
- }
- public void RegisterEnemy(EnemyUnitBURST enemy) {
- m_Enemies.Add(enemy);
- var newTransforms = new NativeArray<EnemyTransform>(m_Enemies.Count, Allocator.Persistent);
- NativeArray<EnemyTransform>.Copy(m_Transforms, newTransforms, m_Enemies.Count - 1);
- newTransforms[m_Enemies.Count - 1] = new EnemyTransform(enemy.transform);
- m_Transforms.Dispose();
- m_Transforms = newTransforms;
- }
- private void OnDestroy() {
- m_Transforms.Dispose();
- }
- [BurstCompile]
- private struct MoveJob : IJobParallelForTransform {
- public NativeArray<EnemyTransform> transforms;
- public float deltaTime;
- public float3 playerPosition;
- public void Execute(int index, TransformAccess transform) {
- float3 direction = math.normalize(playerPosition - (float3)transform.position);
- transform.position = (float3)transform.position + (direction * transforms[index].moveSpeed * deltaTime);
- transform.rotation = quaternion.LookRotation(direction, math.up());
- transforms[index] = new EnemyTransform(transform);
- }
- }
- private struct EnemyTransform {
- public float3 position;
- public quaternion rotation;
- public float moveSpeed;
- public EnemyTransform(Transform transform) {
- position = transform.position;
- rotation = transform.rotation;
- moveSpeed = transform.GetComponent<EnemyUnitBURST>().moveSpeed;
- }
- public EnemyTransform(TransformAccess transform) {
- position = transform.position;
- rotation = transform.rotation;
- moveSpeed = 1;
- //moveSpeed = transform.GetComponent<EnemyUnitBURST>().moveSpeed; // ERROR
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement