2024-06-09 13:36:38 +00:00
|
|
|
using System.Collections;
|
|
|
|
using BlueWater.Uis;
|
2024-06-03 18:26:03 +00:00
|
|
|
using Sirenix.OdinInspector;
|
|
|
|
using UnityEngine;
|
|
|
|
using UnityEngine.InputSystem;
|
|
|
|
|
|
|
|
namespace BlueWater.Players.Combat
|
|
|
|
{
|
|
|
|
public class CombatPlayer : MonoBehaviour
|
|
|
|
{
|
|
|
|
// Variables
|
|
|
|
#region Variables
|
|
|
|
|
|
|
|
// Components
|
|
|
|
[field: SerializeField]
|
|
|
|
public Rigidbody Rigidbody { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public CapsuleCollider CharacterCollider { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public PlayerInput PlayerInput { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public Transform VisualLook { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public BoxCollider HitBoxCollider { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public SpriteRenderer SpriteRenderer { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public Animator Animator { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public CombatInput CombatInput { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public CombatMovement CombatMovement { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public AnimationController AnimationController { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public CombatAttacker CombatAttacker { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public PlayerHealthPoint PlayerHealthPoint { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public CombatSkillController CombatSkillController { get; private set; }
|
|
|
|
|
|
|
|
[field: SerializeField]
|
|
|
|
public CombatStatus CombatStatus { get; private set; }
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
// Unity events
|
|
|
|
#region Unity events
|
|
|
|
|
|
|
|
private void Awake()
|
|
|
|
{
|
|
|
|
InitializeComponents();
|
2024-06-04 13:15:14 +00:00
|
|
|
InitializeChileComponents();
|
2024-06-03 18:26:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private void Start()
|
|
|
|
{
|
2024-06-07 17:31:08 +00:00
|
|
|
if (!GameManager.Instance.CurrentCombatPlayer)
|
|
|
|
{
|
|
|
|
GameManager.Instance.SetCurrentCombatPlayer(this);
|
|
|
|
}
|
|
|
|
|
2024-06-03 18:26:03 +00:00
|
|
|
SubscribeEvents();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnDestroy()
|
|
|
|
{
|
|
|
|
UnSubscribeEvents();
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
// Initialize methods
|
|
|
|
#region Initialize methods
|
|
|
|
|
|
|
|
[Button("컴포넌트 초기화")]
|
|
|
|
private void InitializeComponents()
|
|
|
|
{
|
|
|
|
Rigidbody = GetComponent<Rigidbody>();
|
|
|
|
CharacterCollider = GetComponent<CapsuleCollider>();
|
|
|
|
PlayerInput = GetComponent<PlayerInput>();
|
|
|
|
VisualLook = transform.Find("VisualLook");
|
|
|
|
SpriteRenderer = VisualLook.GetComponent<SpriteRenderer>();
|
|
|
|
Animator = VisualLook.GetComponent<Animator>();
|
|
|
|
HitBoxCollider = transform.Find("HitBox").GetComponent<BoxCollider>();
|
|
|
|
|
|
|
|
CombatInput = GetComponent<CombatInput>();
|
|
|
|
CombatMovement = GetComponent<CombatMovement>();
|
|
|
|
AnimationController = GetComponent<AnimationController>();
|
|
|
|
CombatAttacker = GetComponent<CombatAttacker>();
|
|
|
|
PlayerHealthPoint = GetComponent<PlayerHealthPoint>();
|
|
|
|
CombatSkillController = GetComponent<CombatSkillController>();
|
|
|
|
CombatStatus = GetComponent<CombatStatus>();
|
2024-06-04 13:15:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private void InitializeChileComponents()
|
|
|
|
{
|
2024-06-03 18:26:03 +00:00
|
|
|
CombatInput.InitializeComponents(PlayerInput);
|
|
|
|
CombatMovement.InitializeComponents(Rigidbody, VisualLook, AnimationController);
|
|
|
|
CombatAttacker.InitializeComponents(Rigidbody, AnimationController, CombatMovement);
|
|
|
|
PlayerHealthPoint.InitializeComponents(SpriteRenderer);
|
|
|
|
CombatStatus.InitializeComponents(SpriteRenderer);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
// Methods
|
|
|
|
#region Methods
|
|
|
|
|
|
|
|
private void SubscribeEvents()
|
|
|
|
{
|
|
|
|
// Input
|
|
|
|
CombatInput.OnMoveInputReceived += CombatMovement.HandleInputMovement;
|
|
|
|
CombatInput.OnDashInputReceived += CombatMovement.HandleDash;
|
|
|
|
CombatInput.OnAttackInputReceived += CombatAttacker.HandleAttack;
|
|
|
|
CombatInput.OnActivateMainSkillInputReceived += CombatSkillController.HandleMainSkill;
|
|
|
|
|
|
|
|
// Movement
|
|
|
|
CombatMovement.OnStartDash += CombatAttacker.HandleDashInAttack;
|
|
|
|
CombatMovement.OnStartDash += CombatSkillController.HandleDisableSkill;
|
|
|
|
CombatMovement.OnStartDash += PlayerHealthPoint.HandleDisableTakeDamage;
|
|
|
|
CombatMovement.OnStartDash += CombatStatus.HandleCanNotApplyStatusEffect;
|
|
|
|
|
|
|
|
CombatMovement.OnEndDash += CombatSkillController.HandleEnableSkill;
|
|
|
|
CombatMovement.OnEndDash += PlayerHealthPoint.HandleEnableTakeDamage;
|
|
|
|
CombatMovement.OnEndDash += CombatStatus.HandleCanApplyStatusEffect;
|
|
|
|
|
|
|
|
// Attacker
|
|
|
|
CombatAttacker.OnStartAttack += CombatMovement.HandleAttackInDash;
|
|
|
|
CombatAttacker.OnStartAttack += CombatMovement.HandleDisableMove;
|
|
|
|
CombatAttacker.OnStartAttack += CombatSkillController.HandleDisableSkill;
|
|
|
|
|
|
|
|
CombatAttacker.OnEndAttack += CombatMovement.HandleEnableMove;
|
|
|
|
CombatAttacker.OnEndAttack += CombatSkillController.HandleEnableSkill;
|
2024-06-09 13:36:38 +00:00
|
|
|
|
|
|
|
// PlayerHealthPoint
|
|
|
|
PlayerHealthPoint.OnDead += Die;
|
2024-06-03 18:26:03 +00:00
|
|
|
|
|
|
|
// SkillController
|
|
|
|
CombatSkillController.OnStartSkill += CombatMovement.HandleDisableMoveAndDash;
|
|
|
|
CombatSkillController.OnStartSkill += CombatAttacker.HandleDisableAttack;
|
|
|
|
CombatSkillController.OnStartSkill += PlayerHealthPoint.HandleDisableTakeDamage;
|
|
|
|
|
|
|
|
CombatSkillController.OnEndSkill += CombatMovement.HandleEnableMoveAndDash;
|
|
|
|
CombatSkillController.OnEndSkill += CombatAttacker.HandleEnableAttack;
|
|
|
|
CombatSkillController.OnEndSkill += PlayerHealthPoint.HandleEnableTakeDamage;
|
|
|
|
|
|
|
|
// Status
|
|
|
|
CombatStatus.OnStartStun += CombatMovement.HandleDisableMoveAndDash;
|
|
|
|
CombatStatus.OnStartStun += CombatAttacker.HandleDisableAttack;
|
|
|
|
CombatStatus.OnStartStun += CombatSkillController.HandleDisableSkill;
|
|
|
|
|
|
|
|
CombatStatus.OnEndStun += CombatMovement.HandleEnableMoveAndDash;
|
|
|
|
CombatStatus.OnEndStun += CombatAttacker.HandleEnableAttack;
|
|
|
|
CombatStatus.OnEndStun += CombatSkillController.HandleEnableSkill;
|
|
|
|
|
|
|
|
CombatStatus.OnStartSlowMoveSpeed += CombatMovement.HandleMoveSpeedCoefficient;
|
|
|
|
CombatStatus.OnEndSlowMoveSpeed += CombatMovement.HandleResetMoveSpeedCoefficient;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void UnSubscribeEvents()
|
|
|
|
{
|
|
|
|
// Input
|
|
|
|
CombatInput.OnMoveInputReceived -= CombatMovement.HandleInputMovement;
|
|
|
|
CombatInput.OnDashInputReceived -= CombatMovement.HandleDash;
|
|
|
|
CombatInput.OnAttackInputReceived -= CombatAttacker.HandleAttack;
|
|
|
|
CombatInput.OnActivateMainSkillInputReceived -= CombatSkillController.HandleMainSkill;
|
|
|
|
|
|
|
|
// Movement
|
|
|
|
CombatMovement.OnStartDash -= CombatAttacker.HandleDashInAttack;
|
|
|
|
CombatMovement.OnStartDash -= CombatSkillController.HandleDisableSkill;
|
|
|
|
CombatMovement.OnStartDash -= PlayerHealthPoint.HandleDisableTakeDamage;
|
|
|
|
CombatMovement.OnStartDash -= CombatStatus.HandleCanNotApplyStatusEffect;
|
|
|
|
|
|
|
|
CombatMovement.OnEndDash -= CombatSkillController.HandleEnableSkill;
|
|
|
|
CombatMovement.OnEndDash -= PlayerHealthPoint.HandleEnableTakeDamage;
|
|
|
|
CombatMovement.OnEndDash -= CombatStatus.HandleCanApplyStatusEffect;
|
|
|
|
|
|
|
|
// Attacker
|
|
|
|
CombatAttacker.OnStartAttack -= CombatMovement.HandleAttackInDash;
|
|
|
|
CombatAttacker.OnStartAttack -= CombatMovement.HandleDisableMove;
|
|
|
|
CombatAttacker.OnStartAttack -= CombatSkillController.HandleDisableSkill;
|
|
|
|
|
|
|
|
CombatAttacker.OnEndAttack -= CombatMovement.HandleEnableMove;
|
|
|
|
CombatAttacker.OnEndAttack -= CombatSkillController.HandleEnableSkill;
|
2024-06-09 13:36:38 +00:00
|
|
|
|
|
|
|
// PlayerHealthPoint
|
|
|
|
PlayerHealthPoint.OnDead -= Die;
|
2024-06-03 18:26:03 +00:00
|
|
|
|
|
|
|
// SkillController
|
|
|
|
CombatSkillController.OnStartSkill -= CombatMovement.HandleDisableMoveAndDash;
|
|
|
|
CombatSkillController.OnStartSkill -= CombatAttacker.HandleDisableAttack;
|
|
|
|
CombatSkillController.OnStartSkill -= PlayerHealthPoint.HandleDisableTakeDamage;
|
|
|
|
|
|
|
|
CombatSkillController.OnEndSkill -= CombatMovement.HandleEnableMoveAndDash;
|
|
|
|
CombatSkillController.OnEndSkill -= CombatAttacker.HandleEnableAttack;
|
|
|
|
CombatSkillController.OnEndSkill -= PlayerHealthPoint.HandleEnableTakeDamage;
|
|
|
|
|
|
|
|
// Status
|
|
|
|
CombatStatus.OnStartStun -= CombatMovement.HandleDisableMoveAndDash;
|
|
|
|
CombatStatus.OnStartStun -= CombatAttacker.HandleDisableAttack;
|
|
|
|
CombatStatus.OnStartStun -= CombatSkillController.HandleDisableSkill;
|
|
|
|
|
|
|
|
CombatStatus.OnEndStun -= CombatMovement.HandleEnableMoveAndDash;
|
|
|
|
CombatStatus.OnEndStun -= CombatAttacker.HandleEnableAttack;
|
|
|
|
CombatStatus.OnEndStun -= CombatSkillController.HandleEnableSkill;
|
|
|
|
|
|
|
|
CombatStatus.OnStartSlowMoveSpeed -= CombatMovement.HandleMoveSpeedCoefficient;
|
|
|
|
CombatStatus.OnEndSlowMoveSpeed -= CombatMovement.HandleResetMoveSpeedCoefficient;
|
|
|
|
}
|
2024-06-09 13:36:38 +00:00
|
|
|
|
|
|
|
private void Die()
|
|
|
|
{
|
|
|
|
StartCoroutine(nameof(DieCoroutine));
|
|
|
|
}
|
|
|
|
|
|
|
|
private IEnumerator DieCoroutine()
|
|
|
|
{
|
2024-06-09 18:19:32 +00:00
|
|
|
PostProcessingManager.Instance.ToggleRendererFeature(RendererFeatureName.GrayscaleRenderPassFeature, true);
|
|
|
|
|
2024-06-09 13:36:38 +00:00
|
|
|
PlayerInput.enabled = false;
|
|
|
|
Rigidbody.linearVelocity = Vector3.zero;
|
|
|
|
Rigidbody.isKinematic = true;
|
|
|
|
CharacterCollider.enabled = false;
|
|
|
|
HitBoxCollider.enabled = false;
|
|
|
|
|
|
|
|
AnimationController.SetAnimationTrigger("isDead");
|
|
|
|
|
|
|
|
var animationStarted = false;
|
|
|
|
yield return StartCoroutine(AnimationController.WaitForAnimationToRun("Die",
|
|
|
|
success => animationStarted = success));
|
|
|
|
|
|
|
|
if (!animationStarted)
|
|
|
|
{
|
|
|
|
yield break;
|
|
|
|
}
|
|
|
|
|
|
|
|
AnimationController.ResetAnimationSpeed();
|
|
|
|
|
|
|
|
while (AnimationController.IsComparingCurrentAnimation("Die") &&
|
|
|
|
AnimationController.GetCurrentAnimationNormalizedTime() < 1f)
|
|
|
|
{
|
|
|
|
yield return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
yield return new WaitForSeconds(1f);
|
|
|
|
Destroy(gameObject);
|
|
|
|
CombatUiManager.Instance.GameOverPopupUi.Open(CombatUiManager.Instance.PopupUiList);
|
|
|
|
}
|
2024-06-03 18:26:03 +00:00
|
|
|
|
|
|
|
// Wrapping methods
|
|
|
|
public LayerMask TargetLayer => CombatAttacker.TargetLayer;
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
}
|
|
|
|
}
|