using System.Collections; using System.Collections.Generic; using AibisDream.Utility; using UnityEngine; using Yarn.Unity; public class ActorManager : MonoBehaviour { [Header("Actors")] private List actors = new(); [Header("Slots")] public List slotList = new(); // 用于在编辑器中设置插槽 private Dictionary slots = new(); [YarnCommand("fade_in_actor")] public IEnumerator FadeInActorByName(string actorName, float duration) { var actor = actors.Find(a => a.name == actorName); if (actor != null) { yield return StartCoroutine(FadeActor(actor.GetComponent(), 0f, 1f, duration)); } else { Debug.LogError($"Actor with name {actorName} not found."); } } [YarnCommand("fade_out_actor")] public IEnumerator FadeOutActorByName(string actorName, float duration) { var actor = actors.Find(a => a.name == actorName); if (actor != null) { yield return StartCoroutine(FadeActor(actor.GetComponent(), 1f, 0f, duration)); } else { Debug.LogError($"Actor with name {actorName} not found."); } } [YarnCommand("play_actor_animation")] public void PlayActorAnimation(string actorName, string animationName) { var actor = actors.Find(a => a.name == actorName); if (actor != null) { actor.SetAnimationState(animationName); } else { Debug.LogError($"Actor with name {actorName} not found."); } } [YarnCommand("initialize_actor_at_slot")] public void InitializeActorAtSlot(string actorName, string slotName) { var prefab = Resources.Load($"CharacterPrefab/{actorName}"); if (prefab != null && slots.TryGetValue(slotName, out var slot)) { var actorInstance = Instantiate(prefab, slot.position, slot.rotation,this.transform); actorInstance.name = actorName; // 去掉 "(Clone)" 后缀 var actor = actorInstance.GetComponent(); if (actor != null) { actors.Add(actor); actor.InitializeAtSlot(slot); } } else { Debug.LogError($"Actor prefab with name {actorName} not found or slot with name {slotName} not found."); } } private IEnumerator FadeActor(SpriteRenderer actor, float startAlpha, float endAlpha, float duration) { float elapsedTime = 0f; Color color = actor.color; while (elapsedTime < duration) { elapsedTime += Time.deltaTime; float alpha = Mathf.Lerp(startAlpha, endAlpha, elapsedTime / duration); actor.color = new Color(color.r, color.g, color.b, alpha); yield return null; } actor.color = new Color(color.r, color.g, color.b, endAlpha); } private void SetActorAlphaZero(SpriteRenderer actor) { actor.SetAlpha(0); } private void Start() { InitializeSlots(); HideAllActors(); } private void InitializeSlots() { foreach (var slot in slotList) { if (slot != null) { slots[slot.name] = slot; } } } private void HideAllActors() { foreach (var actor in actors) { var spriteRenderer = actor.GetComponent(); if (spriteRenderer != null) { spriteRenderer.color = new Color(spriteRenderer.color.r, spriteRenderer.color.g, spriteRenderer.color.b, 0f); } } } }