using System; using System.Collections; using System.Collections.Generic; using System.Linq; using AibisDream.Kit; using UnityEngine; using Yarn.Unity; namespace AibisDream { public class ActorManager : Singleton { #region 索引 private Transform _actorRoot; private Dictionary _slotDict; private Dictionary _actorDict; private ActorFactory _actorFactory; #endregion public override void OnSingletonInit() { InitRefs(); } private void InitRefs() { _actorRoot = transform.Find("ActorRoot"); _slotDict = new Dictionary(); foreach (var child in transform.Find("Slots").GetComponentsInChildren()) { _slotDict[child.slotName] = child; } _actorDict = new Dictionary(); _actorFactory = new ActorFactory(_actorRoot); } public void InitActor(string actorName, string slotName, ActorType actorType) { var slot = _slotDict[slotName]; // 生成新组件 var actor = _actorFactory.CreateActor(actorName, slot, actorType); // 保存 _actorDict.Add(actorName, actor); } public bool TryFindActor(string actorOrSlot, out AbsActor actor) { if (_actorDict.TryGetValue(actorOrSlot, out actor)) { return true; } actor = _actorDict.Values.FirstOrDefault(item => item.SlotName == actorOrSlot); return actor != null; } public void ChangeSlot(string actorOrSlot, string targetSlot) { if (!_slotDict.TryGetValue(targetSlot, out var targetSlotObj)) return; if (!TryFindActor(actorOrSlot, out var actor)) return; actor.SetSlot(targetSlotObj); } } public static class ActorYarnCommand { private const string ClinicSlotName = "clinic"; [YarnCommand("init_actor")] public static void InitActor(string actorName, string slotName = ClinicSlotName, string actorType = "Anima") { if (Enum.TryParse(actorType, out var actorTypeEnum)) { ActorManager.Instance.InitActor(actorName, slotName, actorTypeEnum); } else { Debug.Log($"Actor类型{actorType}有问题"); } } [YarnCommand("change_actor_state")] public static void PlayAnima(string animaName, string slotOrActorName = ClinicSlotName) { if (ActorManager.Instance.TryFindActor(slotOrActorName, out var actor)) { actor.ChangeState(animaName); } } [YarnCommand("change_actor_state_async")] public static IEnumerator PlayAnimaAsync(string animaName, string slotOrActorName = ClinicSlotName) { if (ActorManager.Instance.TryFindActor(slotOrActorName, out var actor)) { yield return actor.ChangeStateAsync(animaName); } } [YarnCommand("actor_fade_in")] public static IEnumerator ActorFadeIn(string actorName = ClinicSlotName, float duration = 1) { if (ActorManager.Instance.TryFindActor(actorName, out var actor)) { yield return actor.FadeInAsync(duration); } } [YarnCommand("actor_fade_out")] public static IEnumerator ActorFadeOut(string actorName = ClinicSlotName, float duration = 1) { if (ActorManager.Instance.TryFindActor(actorName, out var actor)) { yield return actor.FadeOutAsync(duration); } } [YarnCommand("change_actor_slot")] public static void ChangeSlot(string actorOrSlot, string targetSlot) { ActorManager.Instance.ChangeSlot(actorOrSlot, targetSlot); } [YarnCommand("show_actor")] public static void ShowActor(string actorName = ClinicSlotName) { if (ActorManager.Instance.TryFindActor(actorName, out var actor)) { actor.Show(); } } [YarnCommand("hide_actor")] public static void HideActor(string actorName = ClinicSlotName) { if (ActorManager.Instance.TryFindActor(actorName, out var actor)) { actor.Hide(); } } } }