165 lines
4.5 KiB
C#
165 lines
4.5 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 角色基类
|
|
/// 有Sprite实现和Animator实现
|
|
/// </summary>
|
|
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>();
|
|
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<GameObject>(ConstRef.ActorPrefabName);
|
|
_spriteActorPrefab = ResourceKit.LoadAssetSync<GameObject>(ConstRef.SpriteActorPrefabName);
|
|
}
|
|
|
|
public AbsActor CreateActor(string actorName, ActorSlot slot, ActorType actorType)
|
|
{
|
|
var actor = actorType switch
|
|
{
|
|
ActorType.Sprite => Object.Instantiate(_spriteActorPrefab, _actorRoot).GetComponent<AbsActor>(),
|
|
ActorType.Anima => Object.Instantiate(_actorAnimaPrefab, _actorRoot).GetComponent<AbsActor>(),
|
|
_ => 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<AbsActor>(),
|
|
ActorType.Anima => Object.Instantiate(_actorAnimaPrefab, _actorRoot).GetComponent<AbsActor>(),
|
|
_ => 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;
|
|
}
|
|
} |