72 lines
2.1 KiB
C#
72 lines
2.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using BITKit;
|
|
using UnityEngine.Events;
|
|
using UnityEngine.Pool;
|
|
using UnityEngine.UIElements;
|
|
|
|
namespace BITKit
|
|
{
|
|
public struct VFXMessage
|
|
{
|
|
public string path;
|
|
public Location location;
|
|
}
|
|
public class VFXService : MonoBehaviour, IObjectMatcher<string, Transform>
|
|
{
|
|
private static VFXService sinleton;
|
|
public VFX[] vfxs;
|
|
private readonly Dictionary<string, UnityPool<Transform>> pools = new();
|
|
|
|
[SerializeField] private Optional<int> defaultCapacity;
|
|
private void Awake()
|
|
{
|
|
sinleton = this;
|
|
DI.Register(this);
|
|
}
|
|
public Transform Spawn(RaycastHit hit, params string[] keyWords)
|
|
{
|
|
return Spawn(new Location()
|
|
{
|
|
position = hit.point,
|
|
rotation = Quaternion.LookRotation(hit.normal),
|
|
forward = hit.normal,
|
|
}, keyWords);
|
|
}
|
|
public Transform Spawn(Location location, params string[] keyWords)
|
|
{
|
|
if (TryMatch(out var prefab, keyWords))
|
|
{
|
|
var pool = pools.Get(prefab.name);
|
|
if (defaultCapacity.Allow)
|
|
pool.DefaultCapacity = defaultCapacity.Value;
|
|
var instance = pool.Get(prefab, transform);
|
|
instance.SetPositionAndRotation(location, location);
|
|
if (location.forward.sqrMagnitude is not 0)
|
|
instance.forward = location.forward;
|
|
return instance;
|
|
}
|
|
else
|
|
{
|
|
BIT4Log.Log<VFXService>($"未找到:{JsonHelper.Get(keyWords)}");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public bool TryMatch(out Transform value, params string[] key)
|
|
{
|
|
foreach (var vfx in vfxs)
|
|
{
|
|
if (vfx.IsMatch(key))
|
|
{
|
|
value = vfx.prefab;
|
|
return true;
|
|
}
|
|
}
|
|
value = null;
|
|
return false;
|
|
}
|
|
}
|
|
} |