182 lines
5.3 KiB
C#
182 lines
5.3 KiB
C#
using BehaviorDesigner.Runtime;
|
|
using Pathfinding;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine;
|
|
|
|
namespace BlueWater.Enemies.Bosses
|
|
{
|
|
public enum BossType
|
|
{
|
|
None = 0,
|
|
Slime,
|
|
Rhinoceros
|
|
}
|
|
|
|
public enum BossSkillName
|
|
{
|
|
___SlimeSkillList___ = 0,
|
|
JumpSlam,
|
|
___RhinocerosSkillList___,
|
|
BullCharge,
|
|
HammerSlam,
|
|
MeteorSwing,
|
|
SeismicThrust,
|
|
SkyFallSmash
|
|
}
|
|
|
|
public abstract class Boss : MonoBehaviour
|
|
{
|
|
// 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>();
|
|
|
|
AnimationController.InitializeComponents(Animator);
|
|
AIMovement.InitializeComponents(IAstarAi);
|
|
}
|
|
|
|
#endregion
|
|
|
|
// Methods
|
|
#region Methods
|
|
|
|
// Abstract methods
|
|
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
|
|
}
|
|
} |