using System; using Unity.Entities; using UnityEngine; using Zenject; using Hash128 = Unity.Entities.Hash128; namespace DefaultNamespace { public class ItemContainerFactory : IFactory> { [Serializable] public class Settings { } [Inject] private readonly Settings settings; public AsyncOperationWrapper Create(ItemPrefab item, Hash128 id) { if (item.UseCustomContainer) { var op = item.ContainerPrefab.InstantiateAsync(); op.Completed += operation => { InitializeContainer(op.Result.GetComponent(), id); }; return new AsyncOperationWrapper(op); } var obj = new GameObject(item.name) { layer = LayerMask.NameToLayer("Pickups") }; var renderer = obj.AddComponent(); renderer.sortingLayerID = SortingLayer.NameToID("Pickups"); renderer.sprite = item.Icon; switch (item.ColliderType) { case ColliderType.Box: obj.AddComponent(); break; case ColliderType.Circle: obj.AddComponent(); break; case ColliderType.Polygon: obj.AddComponent(); break; default: throw new ArgumentOutOfRangeException(); } var rigidBody = obj.AddComponent(); rigidBody.useAutoMass = true; var objEntity = obj.AddComponent(); InitializeContainer(objEntity, id); return new AsyncOperationWrapper(obj); } private void InitializeContainer(GameObjectEntity obj, Hash128 itemId) { obj.EntityManager.AddComponentData(obj.Entity, new ItemContainerData { ItemPrefab = itemId }); obj.EntityManager.AddComponent(obj.Entity, ComponentType.ReadWrite()); } } }