CapersProject/Assets/02.Scripts/Character/Enemy/Boss/Boss.cs
Nam Tae Gun 15bfe87a09 #20 미니 모래 두더지 소환 기능 추가
+ MiniSandMole 프리팹 추가
+ BossConfiguration So에 MiniSandMole 추가
+ MiniSandMoleData, MiniSingleRollData So 추가
+ MiniSandMole BehaviorTree 추가
+ SandMoleMapController 클래스 추가
+ ITarget, ICurrentDirection 인터페이스 추가
+ Bt Actions - CanSkill, ActivateSkill 로직 변경
+ BossHealthPoint 로직 변경
+ 미니 모래 두더지에 소환할 때, 죽을 때, 디졸브 효과 추가

Closes #20
2024-06-16 20:09:42 +09:00

188 lines
5.4 KiB
C#

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
}
public enum BossSkillName
{
___SlimeSkillList___ = 0,
JumpSlam,
___RhinocerosSkillList___,
BullCharge,
HammerSlam,
MeteorSwing,
SeismicThrust,
SkyFallSmash,
___SandMoleSkillList___,
GateOfSpikes,
MultiThrowSpikes,
SingleRoll,
}
public abstract class Boss : MonoBehaviour, ITarget
{
// Variables
#region Variables
// Components
[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 SpriteRenderer SpriteRenderer { get; private set; }
[field: SerializeField]
public Animator Animator { 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 AnimationController AnimationController { 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; private set; }
public IAstarAI IAstarAi;
#endregion
// Unity events
#region Unity events
protected virtual void Awake()
{
InitializeComponents();
}
protected virtual void OnEnable()
{
}
protected virtual void Start()
{
BossHealthPoint.OnDead += HandleDie;
Target = GameManager.Instance.CurrentCombatPlayer.GetComponent<Collider>();
}
protected virtual void Update()
{
}
protected virtual void FixedUpdate()
{
}
protected virtual void OnDisable()
{
}
protected virtual void OnDestroy()
{
BossHealthPoint.OnDead -= HandleDie;
}
#endregion
// Initialize methods
#region Initialize methods
[Button("컴포넌트 초기화")]
protected virtual void InitializeComponents()
{
Rigidbody = GetComponent<Rigidbody>();
CharacterCollider = GetComponent<CapsuleCollider>();
BehaviorTree = GetComponent<BehaviorTree>();
VisualLook = transform.Find("VisualLook");
SpriteRenderer = VisualLook.GetComponent<SpriteRenderer>();
Animator = VisualLook.GetComponent<Animator>();
HitBoxCollider = transform.Find("HitBox").GetComponent<BoxCollider>();
AnimationController = GetComponent<AnimationController>();
BossHealthPoint = GetComponent<BossHealthPoint>();
AIMovement = GetComponent<AiMovement>();
BossSkillController = GetComponent<BossSkillController>();
IAstarAi = GetComponent<IAstarAI>();
}
#endregion
// Methods
#region Methods
// Abstract methods
public virtual void Initialize() { }
protected abstract void HandleDie();
// 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
#endregion
}
}