using asap.core; using Coffee.UIExtensions; using UnityEngine; using UniRx; using System; using System.Linq; using System.Collections.Generic; public class ParticleAttractorData { public bool IgnorePack; public int Type; public int SubType; public int ParticleCount; public int Priority; public UIParticleAttractorCenter uIParticleAttractorCenter; } public class UIParticleAttractorCenter : MonoBehaviour { [SerializeField] UIParticleAttractor uiParticleAttractorTemplate; private List _uiParticleAttractors; public int Type; public int SubType; public int Priority; Animator ani; IDisposable disposable; private void Awake() { Init(); } void Init() { _uiParticleAttractors = GetComponents().ToList(); uiParticleAttractorTemplate = GetComponent(); // uIParticleAttractor = uiParticleAttractors.FirstOrDefault(x => !x.IsTaken); // if (uIParticleAttractor == null) // { // uIParticleAttractor = gameObject.AddComponent(); // } // uIParticleAttractor.enabled = false; // uIParticleAttractor.destinationRadius = 1; //uIParticleAttractor.delay = 0.2f; // uIParticleAttractor.maxSpeed = 0.6f; ani = GetComponent(); if (ani != null && uiParticleAttractorTemplate != null) { uiParticleAttractorTemplate.onAttractedStart.AddListener(() => ani.Play("reward_gain_loop")); uiParticleAttractorTemplate.onAttractedEnd.AddListener(OnEnd); } } async void OnEnd() { await Awaiters.Seconds(0.2f); if (ani) { ani.Play("Init"); } } private void OnEnable() { disposable = GContext.OnEvent().Subscribe(OnParticleAttractor); } void OnParticleAttractor(ParticleAttractorData data) { bool doesTypeMatch = (!data.IgnorePack && Type == -1) || (data.Type == Type && data.SubType == SubType); if (doesTypeMatch && data.Priority < Priority) { data.Priority = Priority; data.uIParticleAttractorCenter = this; } } public UIParticleAttractor GetUIParticleAttractor() { var uiParticleAttractor = _uiParticleAttractors.FirstOrDefault(x => x.particleSystem == null); if (uiParticleAttractor == null) { uiParticleAttractor = gameObject.AddComponent(); _uiParticleAttractors.Add(uiParticleAttractor); } uiParticleAttractor.enabled = false; if (uiParticleAttractorTemplate != null) { uiParticleAttractor.destinationRadius = uiParticleAttractorTemplate.destinationRadius; uiParticleAttractor.delay = uiParticleAttractorTemplate.delay; uiParticleAttractor.maxSpeed = uiParticleAttractorTemplate.maxSpeed; if (ani != null) { uiParticleAttractor.onAttractedStart = uiParticleAttractorTemplate.onAttractedStart; uiParticleAttractor.onAttractedEnd = uiParticleAttractorTemplate.onAttractedEnd; } } else { uiParticleAttractor.destinationRadius = 1; } return uiParticleAttractor; } private void OnDisable() { disposable?.Dispose(); disposable = null; } }