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

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