using System.Collections; using System.Collections.Generic; using Convention; using UnityEngine; namespace Demo.Game { public class ParticleJudgement : IJudgementHookObject, IAssetBundleLoader { public static ParticleJudgement Make() { return new GameObject().AddComponent(); } [Content, SerializeField] private Dictionary AssetBundles = new(); [Content, SerializeField] private Dictionary Prefabs = new(); [Content, SerializeField] private Dictionary Durations = new(); public override IEnumerator UnloadScript() { yield return base.UnloadScript(); foreach (var ab in AssetBundles) yield return this.UnloadAssetBundle(ab.Value); } /// /// 加载预制体作为子物体 /// /// 正整数, 0级判定为最佳判定, 判定等级对应会出现的粒子效果 /// /// /// 判定效果会现形的持续时间 [Convention.RScript.Variable.Attr.Method] public IEnumerator Load(string level, string ab, string prefab, string duration) { var levelId = (IInteraction.JudgementLevel)int.Parse(level); AssetBundle assetBundle = null; yield return this.LoadAssetBundle(ab, x => assetBundle = x); var req = assetBundle.LoadAssetAsync(prefab); yield return req; GameObject sub = Instantiate(req.asset as GameObject); sub.SetActive(false); Prefabs.Add(levelId, sub); sub.transform.SetParent(transform); AssetBundles.Add(levelId, ab); Durations.Add(levelId, float.Parse(duration)); } private void CreateParticle(GameObject prefab) { prefab.SetActive(true); } private void DestroyParticle(GameObject prefab) { prefab.SetActive(false); } public override void OnJudgement(IInteraction.JudgementLevel level) { if (Prefabs.TryGetValue(level, out var effect)) { ConventionUtility.CreateSteps() .Next(() => CreateParticle(effect)) .Wait(Durations[level], () => DestroyParticle(effect)) .Invoke(); } } } }