204 lines
5.8 KiB
C#
204 lines
5.8 KiB
C#
using System.Collections;
|
|
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,
|
|
BoomBarrel,
|
|
SwordBarrel,
|
|
LavaBarrel
|
|
}
|
|
|
|
public enum BossSkillName
|
|
{
|
|
___SlimeSkillList___ = 0,
|
|
JumpSlam,
|
|
___RhinocerosSkillList___,
|
|
BullCharge,
|
|
HammerSlam,
|
|
MeteorSwing,
|
|
SeismicThrust,
|
|
SkyFallSmash,
|
|
___SandMoleSkillList___,
|
|
GateOfSpikes,
|
|
MultiThrowSpikes,
|
|
SingleRoll,
|
|
SpikeBarrage
|
|
}
|
|
|
|
public abstract class Boss : MonoBehaviour, ITarget, IMaterialInstance
|
|
{
|
|
// 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]
|
|
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;
|
|
public Material MaterialInstance { get; protected set; }
|
|
|
|
[Title("디졸브 스폰 효과")]
|
|
[SerializeField]
|
|
protected bool IsDissolveActive = true;
|
|
|
|
[SerializeField]
|
|
protected float SpawnDissolveTime = 2f;
|
|
|
|
[SerializeField]
|
|
protected float DieDissolveTime = 1f;
|
|
|
|
protected bool IsInitialized;
|
|
|
|
// Hashes
|
|
protected static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue");
|
|
|
|
#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<Collider>();
|
|
}
|
|
|
|
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<Rigidbody>();
|
|
CharacterCollider = GetComponent<CapsuleCollider>();
|
|
BehaviorTree = GetComponent<BehaviorTree>();
|
|
VisualLook = transform.Find("VisualLook");
|
|
HitBoxCollider = transform.Find("HitBox").GetComponent<BoxCollider>();
|
|
|
|
BossHealthPoint = GetComponent<BossHealthPoint>();
|
|
AIMovement = GetComponent<AiMovement>();
|
|
BossSkillController = GetComponent<BossSkillController>();
|
|
|
|
AstarAi = GetComponent<IAstarAI>();
|
|
}
|
|
|
|
#endregion
|
|
|
|
// Methods
|
|
#region Methods
|
|
|
|
// Abstract methods
|
|
public virtual void Initialize() { }
|
|
protected abstract IEnumerator DissolveCoroutine(float start, float end, float dissolveTime);
|
|
|
|
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 endPosition) => AIMovement.IsPositionMovable(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
|
|
}
|
|
} |