using BehaviorDesigner.Runtime; using BlueWater.Interfaces; using Pathfinding; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Enemies.Bosses { public enum BossType { None = 0, TitanSlime, Rhinoceros, SandMole, MiniSandMole, GhostBarrel } public enum BossSkillName { ___SlimeSkillList___ = 0, JumpSlam, ___RhinocerosSkillList___, BullCharge, HammerSlam, MeteorSwing, SeismicThrust, SkyFallSmash, ___SandMoleSkillList___, GateOfSpikes, MultiThrowSpikes, SingleRoll, SpikeBarrage } public abstract class Boss : MonoBehaviour, ITarget { // Variables #region Variables // Components [field: Title("보스 컴포넌트")] [field: SerializeField] public Rigidbody Rigidbody { get; private set; } [field: SerializeField] public CapsuleCollider CharacterCollider { get; private set; } [field: SerializeField] public BehaviorTree BehaviorTree { get; private set; } [field: SerializeField] public Transform VisualLook { get; private set; } [field: SerializeField] public BoxCollider HitBoxCollider { get; private set; } // Classes [field: SerializeField, Required] public BossData BossData { get; private set; } [field: SerializeField, Required] public BossHealthPoint BossHealthPoint { get; private set; } [field: SerializeField, Required] public AiMovement AIMovement { get; private set; } [field: SerializeField, Required] public BossSkillController BossSkillController { get; private set; } [field: SerializeField] public Collider Target { get; protected set; } public IAstarAI AstarAi; protected MaterialPropertyBlock MaterialPropertyBlock; #endregion // Unity events #region Unity events protected virtual void Awake() { InitializeComponents(); } protected virtual void OnEnable() { } protected virtual void Start() { BossHealthPoint.OnDead += Die; Target = GameManager.Instance.CurrentCombatPlayer.GetComponent(); } protected virtual void Update() { } protected virtual void FixedUpdate() { } protected virtual void OnDisable() { } protected virtual void OnDestroy() { BossHealthPoint.OnDead -= Die; } #endregion // Initialize methods #region Initialize methods [Button("컴포넌트 초기화")] protected virtual void InitializeComponents() { Rigidbody = GetComponent(); CharacterCollider = GetComponent(); BehaviorTree = GetComponent(); VisualLook = transform.Find("VisualLook"); HitBoxCollider = transform.Find("HitBox").GetComponent(); BossHealthPoint = GetComponent(); AIMovement = GetComponent(); BossSkillController = GetComponent(); AstarAi = GetComponent(); MaterialPropertyBlock = new MaterialPropertyBlock(); BossHealthPoint.SetMaterialPropertyBlock(MaterialPropertyBlock); } #endregion // Methods #region Methods // Abstract methods public virtual void Initialize() { } protected abstract void Die(); // Wrapping // BossHealthPoint public int CurrentHealthPoint { get => BossHealthPoint.CurrentHealthPoint; private set => BossHealthPoint.SetCurrentHealthPoint(value); } // AiMovement public void EnableMove() => AIMovement.EnableMove(); public void StopMove() => AIMovement.StopMove(); public void Move(Vector3 position) => AIMovement.Move(position); public void MoveTarget(Collider target) => AIMovement.MoveTarget(target); public void Teleport(Vector3 position) => AIMovement.Teleport(position); public bool HasReachedDestination() => AIMovement.HasReachedDestination(); public void SetMoveSpeed(float speed) => AIMovement.SetMoveSpeed(speed); public bool IsPositionMovable(Vector3 startPosition, Vector3 endPosition) => AIMovement.IsPositionMovable(startPosition, endPosition); // BossSkillController public bool IsSkillActive => BossSkillController.IsSkillActive; public void ActivateSkill(string skillName) => BossSkillController.ActivateSkill(skillName); public bool CanSkill(string skillName) => BossSkillController.CanSkill(skillName); // BossData public LayerMask TargetLayer => BossData.TargetLayer; // Methods public void ForceKillBoss() { BossHealthPoint.TakeDamage(100000); } #endregion } }