diff --git a/Assets/Scripts/Characters/Enemy/Enemy.cs b/Assets/Scripts/Characters/Enemy/Enemy.cs index 8ac3d46..36171dc 100644 --- a/Assets/Scripts/Characters/Enemy/Enemy.cs +++ b/Assets/Scripts/Characters/Enemy/Enemy.cs @@ -19,12 +19,13 @@ namespace Characters.Enemy [HideInInspector] public bool canAttack; - [SyncVar(hook = nameof(OnStateChanged)), HideInInspector] public EnemyState state = EnemyState.Idle; + [SyncVar(hook = nameof(OnStateChanged))] public EnemyState state = EnemyState.Idle; [SyncVar, HideInInspector] public float aimRigWeight; public readonly StateMachine stateMachine = new StateMachine(); public Transform target; + public NetworkAnimator networkAnimator; private CustomNetworkManager _networkManager; private NetworkGameManager _networkGameManager; @@ -40,6 +41,8 @@ namespace Characters.Enemy { _networkManager = NetworkManager.singleton.GetComponent(); _networkGameManager = NetworkGameManager.singleton; + + networkAnimator = GetComponent(); _footstepClip = Resources.Load("Audio/EnemySounds/Steps/monsterStep1"); @@ -48,7 +51,7 @@ namespace Characters.Enemy stateMachine.Add(new ChaseState(this)); stateMachine.Add(new StunnedState(this)); - stateMachine.SetCurrentState(EnemyState.Idle); + stateMachine.SetCurrentState(state); } void Update() @@ -92,12 +95,20 @@ namespace Characters.Enemy public override void TakeDamage() { base.TakeDamage(); - - state = EnemyState.Stunned; + + if (state == EnemyState.Stunned) + { + stateMachine.GetCurrentState().ReEnter(); + } + else + { + state = EnemyState.Stunned; + } } - void OnStateChanged(EnemyState prevState, EnemyState newState) + void OnStateChanged(EnemyState _, EnemyState newState) { + Debug.Log($"{_} -> {newState}"); stateMachine.SetCurrentState(newState); } } diff --git a/Assets/Scripts/Characters/Enemy/States/ChaseState.cs b/Assets/Scripts/Characters/Enemy/States/ChaseState.cs index 908c79d..f870ab7 100644 --- a/Assets/Scripts/Characters/Enemy/States/ChaseState.cs +++ b/Assets/Scripts/Characters/Enemy/States/ChaseState.cs @@ -16,6 +16,7 @@ namespace Characters.Enemy.States { if (!_enemy.isServer) return; + _enemy.SetSpeedMul(1f); _enemy.SetAimRigWeight(1f); } diff --git a/Assets/Scripts/Characters/Enemy/States/IdleState.cs b/Assets/Scripts/Characters/Enemy/States/IdleState.cs index 020d244..3e16d9a 100644 --- a/Assets/Scripts/Characters/Enemy/States/IdleState.cs +++ b/Assets/Scripts/Characters/Enemy/States/IdleState.cs @@ -1,4 +1,5 @@ using Koptilnya.StateMachine; +using Mirror; using UnityEngine; namespace Characters.Enemy.States @@ -8,6 +9,8 @@ namespace Characters.Enemy.States private readonly Enemy _enemy; private static readonly int DanceAnimHash = Animator.StringToHash("dance"); + private bool _entered; + public IdleState(Enemy enemy) : base(EnemyState.Idle) { _enemy = enemy; @@ -18,7 +21,7 @@ namespace Characters.Enemy.States if (!_enemy.isServer) return; _enemy.SetSpeedMul(0f); - _enemy.animator.SetBool(DanceAnimHash, true); + _enemy.networkAnimator.SetTrigger(DanceAnimHash); } public override void Update() @@ -27,17 +30,19 @@ namespace Characters.Enemy.States var stateInfo = _enemy.animator.GetCurrentAnimatorStateInfo(0); - if (stateInfo.shortNameHash == DanceAnimHash && stateInfo.normalizedTime >= 1) - { - _enemy.state = EnemyState.Patrol; - } + bool inAnim = stateInfo.shortNameHash == DanceAnimHash; + + if (!_entered && inAnim) _entered = true; + + if (_entered && !inAnim) _enemy.state = EnemyState.Patrol; } public override void Exit() { if (!_enemy.isServer) return; - _enemy.animator.SetBool(DanceAnimHash, false); + _entered = false; + _enemy.networkAnimator.ResetTrigger(DanceAnimHash); _enemy.SetSpeedMul(1f); } } diff --git a/Assets/Scripts/Characters/Enemy/States/PatrolState.cs b/Assets/Scripts/Characters/Enemy/States/PatrolState.cs index b9cdb42..77a35fd 100644 --- a/Assets/Scripts/Characters/Enemy/States/PatrolState.cs +++ b/Assets/Scripts/Characters/Enemy/States/PatrolState.cs @@ -23,6 +23,7 @@ namespace Characters.Enemy.States { if (!_enemy.isServer) return; + _enemy.SetSpeedMul(1f); _enemy.SetAimRigWeight(0f); } diff --git a/Assets/Scripts/Characters/Enemy/States/StunnedState.cs b/Assets/Scripts/Characters/Enemy/States/StunnedState.cs index fb1a653..5de687e 100644 --- a/Assets/Scripts/Characters/Enemy/States/StunnedState.cs +++ b/Assets/Scripts/Characters/Enemy/States/StunnedState.cs @@ -10,9 +10,10 @@ namespace Characters.Enemy.States public class StunnedState : State { private readonly Enemy _enemy; - private Task _task; - private static readonly int DamageAnimHash = Animator.StringToHash("damage"); + private static readonly int StunnedAnimHash = Animator.StringToHash("stunned"); + + private bool _entered; public StunnedState(Enemy enemy) : base(EnemyState.Stunned) { @@ -27,11 +28,10 @@ namespace Characters.Enemy.States _enemy.target = null; _enemy.SetSpeedMul(0f); - _enemy.GetComponent().SetTrigger(DamageAnimHash); - - _task = new Task(GetStunned()); + _enemy.networkAnimator.SetTrigger(StunnedAnimHash); } - else + + if(_enemy.isClient) { _enemy.hitVFX.Stop(); _enemy.hitVFX.Play(); @@ -41,25 +41,36 @@ namespace Characters.Enemy.States [Server] public override void ReEnter() { - _task.Stop(); - _task.Start(); + Debug.Log("Reenter stunned state"); + + _enemy.networkAnimator.SetTrigger(StunnedAnimHash); + } + + public override void Update() + { + if (!_enemy.isServer) return; + + var stateInfo = _enemy.animator.GetCurrentAnimatorStateInfo(0); + + bool inAnim = stateInfo.shortNameHash == StunnedAnimHash; + + if (!_entered && inAnim) _entered = true; + + if (_entered && !inAnim) + { + _enemy.state = EnemyState.Patrol; + } } public override void Exit() { if (!_enemy.isServer) return; - - _task.Stop(); + + _entered = false; + _enemy.networkAnimator.ResetTrigger(StunnedAnimHash); _enemy.SetSpeedMul(1f); _enemy.canAttack = true; } - - IEnumerator GetStunned() - { - yield return new WaitForSeconds(6); - - _enemy.state = EnemyState.Patrol; - } } } \ No newline at end of file diff --git a/Assets/Scripts/Characters/PersonController/Interactions.cs b/Assets/Scripts/Characters/PersonController/Interactions.cs index 2ce8004..958b0c7 100644 --- a/Assets/Scripts/Characters/PersonController/Interactions.cs +++ b/Assets/Scripts/Characters/PersonController/Interactions.cs @@ -221,7 +221,6 @@ public class Interactions : NetworkBehaviour [Command(requiresAuthority = false)] void CmdHitPawn(Pawn pawn) { - pawn.TakeDamage(); RpcHitPawn(pawn); }