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.
 
 
 
 
 
 

93 lines
2.8 KiB

using UnityEngine;
using Spine.Unity;
using Skill_V2;
using System.Collections.Generic;
public class IVMate : Entity
{
[SerializeField] uint id;
[SerializeField] SkeletonAnimation skeletonAnimation;
[SerializeField] CircleCollider2D castSkillDistance;
[SerializeField] StateHandler stateHandler;
[SerializeField] Skill skillPrefab;
Skill skillInstance;
ContactFilter2D castSkillDistFilter;
List<Collider2D> castSkillDistOverlaped = new List<Collider2D>();
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
{
castSkillDistance.radius = Data.DefaultCastSkillDistance;
castSkillDistOverlaped.Clear();
castSkillDistance.OverlapCollider(castSkillDistFilter, castSkillDistOverlaped);
for(int i = 0; i < castSkillDistOverlaped.Count; ++i)
{
var overlapped = castSkillDistOverlaped[i];
if (overlapped.CompareTag("Enemy") && overlapped.TryGetComponent(out CreatureBase creature) && creature.IsBattleAvail())
return true;
}
return false;
}
}
public Skill Skill => skillInstance;
private void Awake()
{
#if UNITY_EDITOR
if (MateDataGroup.Instance.TryGetMateData(id, out MateData result))
Data = result;
else
Logger.LogError("MateDataGroup does not have MateData with id: " + id);
#else
MateDataGroup.Instance.TryGetMateData(id, out Data);
#endif
skillInstance = Instantiate(skillPrefab);
skillInstance.Stop();
}
private void OnDestroy()
{
if(skillInstance != null)
{
skillInstance.Stop();
Destroy(skillInstance.gameObject);
}
}
public void UpdateSkillCoolTime() => skillInstance.UpdateSkillCoolTime();
public void Spawn(IVCharacter player, Vector2 lookDir, Transform spawnPosition = null)
{
gameObject.SetActive(true);
stateHandler?.ChangeState(new IVMateAppear(this, player, lookDir, spawnPosition));
}
public void Dispose()
{
stateHandler?.ChangeState(new IVMateDisappear(this, () => gameObject.SetActive(false)));
}
public bool CastSkill()
{
if (IsCastSkillAvailable)
{
stateHandler?.ChangeState(new IVMateCastSkill(this, BattleMgr.Instance.GetPlayer()));
return true;
}
return false;
}
}