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;
}
}