С обычными объектами все понятно просто активировать при попадании передавая position и rotation, затем деактивировать через некоторое время, а как проделать это с Entity?
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Collections;
using Unity.Rendering;
using Unity.Mathematics;
public class Testing : MonoBehaviour
{
public Mesh mesh;
public Material material;
//public ParticleSystem particleSystem;
private EntityManager entityManager;
[HideInInspector] public NativeArray<Entity> entityArray;
private void Start()
{
entityManager = World.Active.EntityManager;
entityArray = new NativeArray<Entity>(5, Allocator.Temp);
EntityArchetype entityArchetype = entityManager.CreateArchetype(
typeof(RenderMesh),
typeof(LocalToWorld),
typeof(Translation),
typeof(Rotation)
);
entityManager.CreateEntity(entityArchetype, entityArray);
for (int i = 0; i < entityArray.Length; i++) //заполнение и деактивация
{
entityManager.SetSharedComponentData(entityArray[i], new RenderMesh { mesh = mesh, material = material, });
entityManager.SetEnabled(entityArray[i], false);
}
//SpawnEntity(transform.position, transform.rotation);
}
public void SpawnEntity(Vector3 pos, Quaternion rot) //передача вращения и позиции из другого класса, но вылезает ошибка
{
entityManager.SetEnabled(entityArray[0], true);
entityManager.SetComponentData(entityArray[0], new Translation { Value = pos });
entityManager.SetComponentData(entityArray[0], new Rotation { Value = rot });
}
}
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Collections;
using Unity.Rendering;
using Unity.Mathematics;
public class Testing : MonoBehaviour
{
public Mesh mesh;
public Material material;
//public ParticleSystem particleSystem;
private EntityManager entityManager;
[HideInInspector] public NativeArray<Entity> entityArray;
private void Start()
{
entityManager = World.Active.EntityManager;
entityArray = new NativeArray<Entity>(5, Allocator.Temp);
EntityArchetype entityArchetype = entityManager.CreateArchetype(
typeof(RenderMesh),
typeof(LocalToWorld),
typeof(Translation),
typeof(Rotation)
);
entityManager.CreateEntity(entityArchetype, entityArray);
for (int i = 0; i < entityArray.Length; i++) //заполнение и деактивация
{
entityManager.SetSharedComponentData(entityArray[i], new RenderMesh { mesh = mesh, material = material, });
entityManager.SetEnabled(entityArray[i], false);
}
//SpawnEntity(transform.position, transform.rotation);
}
public void SpawnEntity(Vector3 pos, Quaternion rot) //передача вращения и позиции из другого класса, но вылезает ошибка
{
entityManager.SetEnabled(entityArray[0], true);
entityManager.SetComponentData(entityArray[0], new Translation { Value = pos });
entityManager.SetComponentData(entityArray[0], new Rotation { Value = rot });
}
}
Ошибка:
InvalidOperationException: The NativeArray has been deallocated, it is not allowed to access it Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckReadAndThrowNoEarlyOut (Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle handle) <0x2900aa76ec0 + 0x00052> in <e3232360d51c46c786dd547e2f0b3f8b>:0 Unity.Collections.NativeArray`1[T].CheckElementReadAccess (System.Int32 index) (at C:/buildslave/unity/build/Runtime/Export/NativeArray/NativeArray.cs:118)
Как это правильно сделать? Так же при спавне декалей нужно будет вызывать AddForce() в RigidBody. Это можно сделать с Entities?