using System; using System.Collections.Generic; using ClusterVR.CreatorKit.Gimmick; using ClusterVR.CreatorKit.Item; using UnityEngine; using Object = UnityEngine.Object; namespace ClusterVR.CreatorKit.Editor.Preview.Item { public sealed class ItemCreator { readonly Dictionary itemTemplates = new Dictionary(); public event Action OnCreate; public event Action OnCreateCompleted; public ItemCreator(IEnumerable createItemGimmicks) { foreach (var createItemGimmick in createItemGimmicks) { AddItemTemplate(createItemGimmick); } } void AddItemTemplate(ICreateItemGimmick gimmick) { if (!gimmick.IsValid()) { return; } var templateId = gimmick.ItemTemplateId; if (itemTemplates.ContainsKey(templateId)) { return; } var template = gimmick.ItemTemplate; itemTemplates.Add(templateId, template); foreach (var descendantGimmick in template.gameObject.GetComponents()) { AddItemTemplate(descendantGimmick); } } public void Create(ItemTemplateId templateId, Vector3 position, Quaternion rotation) { if (!itemTemplates.TryGetValue(templateId, out var itemTemplate)) { return; } if (itemTemplate.gameObject == null) { return; } var createdGameObject = Object.Instantiate(itemTemplate.gameObject, position, rotation); var createdItem = createdGameObject.GetComponent(); createdItem.Id = ItemId.Create(); // todo: 重複チェック OnCreate?.Invoke(createdItem); OnCreateCompleted?.Invoke(createdItem); } } }