using System.Collections; using BlueWater.Uis; 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 PlayerHealthPoint PlayerHealthPoint { get; private set; } [field: SerializeField] public AnimationController AnimationController { get; private set; } [field: SerializeField] public CombatInput CombatInput { get; private set; } [field: SerializeField] public CombatMovement CombatMovement { get; private set; } [field: SerializeField] public CombatAttacker CombatAttacker { 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(); } private void Start() { if (!GameManager.Instance.CurrentCombatPlayer) { GameManager.Instance.SetCurrentCombatPlayer(this); } 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(); PlayerHealthPoint = GetComponent(); AnimationController = GetComponent(); CombatInput = GetComponent(); CombatMovement = GetComponent(); CombatAttacker = GetComponent(); CombatSkillController = GetComponent(); CombatStatus = GetComponent(); } #endregion // Methods #region Methods private void SubscribeEvents() { // Input CombatInput.OnMoveInputReceived += CombatMovement.InputMovement; CombatInput.OnDashInputReceived += CombatMovement.Dash; CombatInput.OnAttackInputReceived += CombatAttacker.Attack; CombatInput.OnActivateMainSkillInputReceived += CombatSkillController.TryActivateSkill; // PlayerHealthPoint PlayerHealthPoint.OnDead += Die; } private void UnSubscribeEvents() { // Input CombatInput.OnMoveInputReceived -= CombatMovement.InputMovement; CombatInput.OnDashInputReceived -= CombatMovement.Dash; CombatInput.OnAttackInputReceived -= CombatAttacker.Attack; CombatInput.OnActivateMainSkillInputReceived -= CombatSkillController.TryActivateSkill; // PlayerHealthPoint PlayerHealthPoint.OnDead -= Die; } private void Die() { StartCoroutine(nameof(DieCoroutine)); } private IEnumerator DieCoroutine() { PostProcessingManager.Instance.ToggleRendererFeature(RendererFeatureName.GrayscaleRenderPassFeature, true); 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); } #endregion } }