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(); InitializeChileComponents(); } private void Start() { SubscribeEvents(); } private void OnDestroy() { UnSubscribeEvents(); } #endregion // Initialize methods #region Initialize methods [Button("컴포넌트 초기화")] private void InitializeComponents() { Rigidbody = GetComponent(); CharacterCollider = GetComponent(); PlayerInput = GetComponent(); VisualLook = transform.Find("VisualLook"); SpriteRenderer = VisualLook.GetComponent(); Animator = VisualLook.GetComponent(); HitBoxCollider = transform.Find("HitBox").GetComponent(); CombatInput = GetComponent(); CombatMovement = GetComponent(); AnimationController = GetComponent(); CombatAttacker = GetComponent(); PlayerHealthPoint = GetComponent(); CombatSkillController = GetComponent(); CombatStatus = GetComponent(); } private void InitializeChileComponents() { CombatInput.InitializeComponents(PlayerInput); CombatMovement.InitializeComponents(Rigidbody, VisualLook, AnimationController); AnimationController.InitializeComponents(Animator); 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; // 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; // 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; } // Wrapping methods public LayerMask TargetLayer => CombatAttacker.TargetLayer; #endregion } }