112 lines
3.4 KiB
C#
112 lines
3.4 KiB
C#
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<UIParticleAttractor> _uiParticleAttractors;
|
|
public int Type;
|
|
public int SubType;
|
|
public int Priority;
|
|
Animator ani;
|
|
IDisposable disposable;
|
|
|
|
private void Awake()
|
|
{
|
|
Init();
|
|
}
|
|
void Init()
|
|
{
|
|
_uiParticleAttractors = GetComponents<UIParticleAttractor>().ToList();
|
|
uiParticleAttractorTemplate = GetComponent<UIParticleAttractor>();
|
|
|
|
// uIParticleAttractor = uiParticleAttractors.FirstOrDefault(x => !x.IsTaken);
|
|
// if (uIParticleAttractor == null)
|
|
// {
|
|
// uIParticleAttractor = gameObject.AddComponent<UIParticleAttractor>();
|
|
// }
|
|
// uIParticleAttractor.enabled = false;
|
|
// uIParticleAttractor.destinationRadius = 1;
|
|
|
|
//uIParticleAttractor.delay = 0.2f;
|
|
// uIParticleAttractor.maxSpeed = 0.6f;
|
|
ani = GetComponent<Animator>();
|
|
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<ParticleAttractorData>().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<UIParticleAttractor>();
|
|
_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;
|
|
}
|
|
}
|