using UnityEngine; using Spine.Unity; using Skill_V2; public class IVMate : Entity { [SerializeField] SkeletonAnimation skeletonAnimation; [SerializeField] StateHandler 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(); if (stateHandler == null) stateHandler = GetComponent>(); 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(); } } public void Dispose() { if(stateHandler.CurrentState is IVMateDisappear) return; if(stateHandler.TryGetState(out IVMateDisappear disappear)) { disappear.Setup(() => gameObject.SetActive(false)); stateHandler.ChangeState(); } } public bool CastSkill() { if (IsCastSkillAvailable) { stateHandler?.ChangeState(); return true; } return false; } private void OnValidate() { if (skeletonAnimation == null) skeletonAnimation = GetComponent(); if (stateHandler == null) stateHandler = GetComponent>(); if(skeletonAnimation != null) { skeletonAnimation.clearStateOnDisable = true; skeletonAnimation.updateWhenInvisible = UpdateMode.EverythingExceptMesh; } } }