Страница 1 из 1

Entity Component System unity

СообщениеДобавлено: 05 окт 2019, 13:11
Legend2856
Entity Component System как правильно его использовать? И стоит ли его вообще использовать в этом случае? Делаю что-то типа шутера и где будут много стрельбы(Спавн эффектов, декалей и тд).
С обычными объектами все понятно просто активировать при попадании передавая 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 });
    }
}
 

Ошибка:
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?

Re: Entity Component System unity

СообщениеДобавлено: 07 окт 2019, 14:56
getAlex
Тут обычный Пулл справится. Не понимаю почему лепят ECS во все щели где не нужно. Потому что это модно? Это что-то из серсии "линукс круче винды потому что линус это круто"?

Re: Entity Component System unity

СообщениеДобавлено: 07 окт 2019, 15:19
Friend123
getAlex писал(а):Не понимаю почему лепят ECS во все щели где не нужно. Потому что это модно?

Вероятно, что так. Я лично отказался от этого ECS после того, как попробовал что-то закодить с его помощью. Это лютейшей извращение и глубокое неуважение к кодеру.

Re: Entity Component System unity

СообщениеДобавлено: 07 окт 2019, 15:40
1max1
Friend123 писал(а):
getAlex писал(а):Не понимаю почему лепят ECS во все щели где не нужно. Потому что это модно?

Это лютейшей извращение и глубокое неуважение к кодеру.


Изображение

Re: Entity Component System unity

СообщениеДобавлено: 07 окт 2019, 17:22
Shekn
А мне наоборот очень понравился паттерн ECS, и теперь в Юнити всё что можно пишу на нём. В принципе сложность кода примерно такая же, как если использовать MonoBehaviour. Что касается проблемы ТС-а, то ты неправильно используешь ECS. Взаимодействие с сущностями надо делать в системах, а не в каких-то непонятных наследниках от MonoBehaviour.

Re: Entity Component System unity

СообщениеДобавлено: 07 окт 2019, 18:50
1max1
Shekn писал(а):А мне наоборот очень понравился паттерн ECS, и теперь в Юнити всё что можно пишу на нём. В принципе сложность кода примерно такая же, как если использовать MonoBehaviour. Что касается проблемы ТС-а, то ты неправильно используешь ECS. Взаимодействие с сущностями надо делать в системах, а не в каких-то непонятных наследниках от MonoBehaviour.

+++