using System; using System.Collections.Generic; using ClusterVR.CreatorKit.Item; using UnityEditor; using UnityEngine; namespace ClusterVR.CreatorKit.Gimmick.Implements { [RequireComponent(typeof(Item.Implements.Item))] public sealed class CreateItemGimmick : MonoBehaviour, IItemGimmick, ICreateItemGimmick, IItemTemplateContainer { [SerializeField, HideInInspector] Item.Implements.Item item; [SerializeField, ItemGimmickKey] GimmickKey key = new GimmickKey(GimmickTarget.Item); [SerializeField] Item.Implements.Item itemTemplate; [SerializeField, HideInInspector] ItemTemplateId itemTemplateId; [SerializeField] Transform spawnPoint; ItemId IGimmick.ItemId => (item != null ? item : item = GetComponent()).Id; GimmickTarget IGimmick.Target => key.Target; string IGimmick.Key => key.Key; ParameterType IGimmick.ParameterType => ParameterType.Signal; public Transform SpawnPoint => spawnPoint; public IItem ItemTemplate => itemTemplate; public ItemTemplateId ItemTemplateId { get => itemTemplateId; #if UNITY_EDITOR set => itemTemplateId = value; #endif } public event CreateItemEventHandler OnCreateItem; DateTime lastTriggeredAt; void Start() { if (item == null) { item = GetComponent(); } } public void Run(GimmickValue value, DateTime current) { if (!this.IsValid()) { return; } if (value.TimeStamp <= lastTriggeredAt) { return; } lastTriggeredAt = value.TimeStamp; if ((current - value.TimeStamp).TotalSeconds > Constants.TriggerGimmick.TriggerExpireSeconds) { return; } var useSpawnPoint = spawnPoint != null ? spawnPoint : transform; var args = new CreateItemEventArgs { SenderId = item.Id, TemplateId = itemTemplateId, Position = useSpawnPoint.position, Rotation = useSpawnPoint.rotation }; OnCreateItem?.Invoke(args); } void Reset() { item = GetComponent(); } void OnValidate() { if (item == null || item.gameObject != gameObject) { item = GetComponent(); } if (spawnPoint == null) { spawnPoint = transform; } } public IEnumerable ItemTemplates() => this.IsValid() ? new ItemTemplateIdAndItem[] { new(itemTemplateId, itemTemplate) } : new ItemTemplateIdAndItem[]{}; #if UNITY_EDITOR public void SetItemTemplateId(IItem item, ItemTemplateId id) { if (itemTemplate.Equals(item)) { itemTemplateId = id; } } public void MarkObjectDirty() { EditorUtility.SetDirty(this); } #endif } }