using System; using System.Collections; using AibisDream.Framework; using AibisDream.Utility; using DG.Tweening; using Newtonsoft.Json; using UnityEngine; using UnityEngine.Events; using Object = UnityEngine.Object; namespace AibisDream { /// /// 角色基类 /// 有Sprite实现和Animator实现 /// public abstract class AbsActor : MonoBehaviour { public ActorData actorData; public string ActorName => actorData.actorName; public string SlotName => actorData.slotName; protected SpriteRenderer spriteRenderer; public void Init(string actorName, ActorSlot slot) { actorData = new ActorData { actorName = actorName, slotName = slot.slotName, alpha = 0 }; Init(); SetSlot(slot); } public void Init(ActorData data, ActorSlot slot) { actorData = data; Init(); SetSlot(slot); } protected virtual void Init() { gameObject.name = ActorName; spriteRenderer = GetComponent(); spriteRenderer.SetAlpha(0); } public void Show() { actorData.alpha = 1; spriteRenderer.SetAlpha(1); } public void Hide() { actorData.alpha = 0; spriteRenderer.SetAlpha(0); } public void SetSlot(ActorSlot slot) { transform.position = slot.Position; spriteRenderer.sortingOrder = slot.sortingOrder; spriteRenderer.sortingLayerID = slot.sortingLayer; actorData.slotName = slot.slotName; } public IEnumerator FadeInAsync(float duration) { actorData.alpha = 1; yield return spriteRenderer.DOFade(1, duration).WaitForCompletion(); } public IEnumerator FadeOutAsync(float duration) { actorData.alpha = 0; yield return spriteRenderer.DOFade(0, duration).WaitForCompletion(); } public void SetAlpha(int alpha) { actorData.alpha = alpha; spriteRenderer.SetAlpha(alpha); } public abstract void ChangeState(string stateName); public virtual IEnumerator ChangeStateAsync(string stateName) { ChangeState(stateName); yield break; } } // 工厂类 public class ActorFactory { private readonly Transform _actorRoot; private readonly GameObject _actorAnimaPrefab; private readonly GameObject _spriteActorPrefab; public ActorFactory(Transform actorRoot) { _actorRoot = actorRoot; _actorAnimaPrefab = ResourceKit.LoadAssetSync(ConstRef.ActorPrefabName); _spriteActorPrefab = ResourceKit.LoadAssetSync(ConstRef.SpriteActorPrefabName); } public AbsActor CreateActor(string actorName, ActorSlot slot, ActorType actorType) { var actor = actorType switch { ActorType.Sprite => Object.Instantiate(_spriteActorPrefab, _actorRoot).GetComponent(), ActorType.Anima => Object.Instantiate(_actorAnimaPrefab, _actorRoot).GetComponent(), _ => null }; if (actor) { actor.Init(actorName, slot); } return actor; } public AbsActor CreateActor(ActorData actorData, ActorSlot slot) { var actor = actorData.actorType switch { ActorType.Sprite => Object.Instantiate(_spriteActorPrefab, _actorRoot).GetComponent(), ActorType.Anima => Object.Instantiate(_actorAnimaPrefab, _actorRoot).GetComponent(), _ => null }; if (actor) { actor.Init(actorData, slot); } return actor; } } public enum ActorType { Sprite, Anima } [Serializable] public class ActorData { [JsonIgnore] public UnityEvent onSave = new(); public string actorName; public string slotName; public ActorType actorType; public string stateName; public float alpha; } }