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
|
|||
|
}
|
|||
|
}
|