You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.2 KiB
114 lines
3.2 KiB
using UnityEngine;
|
|
using Spine.Unity;
|
|
using Skill_V2;
|
|
|
|
public class IVMate : Entity
|
|
{
|
|
[SerializeField] SkeletonAnimation skeletonAnimation;
|
|
[SerializeField] StateHandler<IVMate> stateHandler;
|
|
|
|
Skill skillInstance;
|
|
|
|
public MateData Data { get; private set; }
|
|
public SkeletonAnimation SkeletonAnimation => skeletonAnimation;
|
|
public bool IsSafeChange => stateHandler.CurrentState is IVMateIdle || stateHandler.CurrentState is IVMateChasePlayer;
|
|
public bool IsCastSkillAvailable => IsSafeChange && !Skill.IsInCoolTime && IsEnemyExistInCastSkillDistance;
|
|
public bool IsEnemyExistInCastSkillDistance
|
|
{
|
|
get
|
|
{
|
|
skillInstance.transform.position = CenterPivot;
|
|
return skillInstance.IsTargetExistInCastRange();
|
|
}
|
|
}
|
|
|
|
public Skill Skill => skillInstance;
|
|
|
|
private void Awake()
|
|
{
|
|
if (skeletonAnimation == null)
|
|
skeletonAnimation = GetComponent<SkeletonAnimation>();
|
|
|
|
if (stateHandler == null)
|
|
stateHandler = GetComponent<StateHandler<IVMate>>();
|
|
|
|
AddTags(EntityTag.Character);
|
|
AddTags(EntityTag.Mate);
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if(skillInstance != null)
|
|
{
|
|
skillInstance.Stop();
|
|
Destroy(skillInstance.gameObject);
|
|
}
|
|
}
|
|
|
|
public void SetData(MateData mateData)
|
|
{
|
|
Debug.Assert(mateData != null, Logger.LogMessage(LogType.Assert, nameof(SetData), "Mate data is null"));
|
|
|
|
Data = mateData;
|
|
|
|
if (Data.Skill != null)
|
|
{
|
|
skillInstance = Instantiate(Data.Skill.Prefab);
|
|
skillInstance.SetSkillData(Data.Skill);
|
|
skillInstance.SetTargetTags(LayerMask.GetMask(GameProperty.Instance.CharacterLayerName), EntityTag.Enemy);
|
|
skillInstance.Stop();
|
|
}
|
|
|
|
stateHandler.Initialize(this);
|
|
}
|
|
|
|
public void UpdateSkillCoolTime() => skillInstance?.UpdateSkillCoolTime();
|
|
|
|
public void Spawn(IVCharacter player, Vector2 lookDir, Transform spawnPosition = null)
|
|
{
|
|
gameObject.SetActive(true);
|
|
|
|
if(stateHandler.TryGetState(out IVMateAppear appear))
|
|
{
|
|
appear.Setup(player, lookDir, spawnPosition);
|
|
stateHandler.ChangeState<IVMateAppear>();
|
|
}
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if(stateHandler.CurrentState is IVMateDisappear) return;
|
|
|
|
if(stateHandler.TryGetState(out IVMateDisappear disappear))
|
|
{
|
|
disappear.Setup(() => gameObject.SetActive(false));
|
|
stateHandler.ChangeState<IVMateDisappear>();
|
|
}
|
|
}
|
|
|
|
public bool CastSkill()
|
|
{
|
|
if (IsCastSkillAvailable)
|
|
{
|
|
stateHandler?.ChangeState<IVMateCastSkill>();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private void OnValidate()
|
|
{
|
|
if (skeletonAnimation == null)
|
|
skeletonAnimation = GetComponent<SkeletonAnimation>();
|
|
|
|
if (stateHandler == null)
|
|
stateHandler = GetComponent<StateHandler<IVMate>>();
|
|
|
|
if(skeletonAnimation != null)
|
|
{
|
|
skeletonAnimation.clearStateOnDisable = true;
|
|
skeletonAnimation.updateWhenInvisible = UpdateMode.EverythingExceptMesh;
|
|
}
|
|
}
|
|
}
|