From 88a032c39b6b1585ec340bedb804d97bb535a3c3 Mon Sep 17 00:00:00 2001 From: Nikita Kruglickiy Date: Tue, 19 Mar 2024 21:38:59 +0300 Subject: [PATCH] #25 --- .../Animations/EnemyController.controller | 241 ++++++------------ Assets/Scripts/Characters/Enemy/Enemy.cs | 68 +++-- .../Characters/Enemy/States/AttackState.cs | 37 +++ .../Enemy/States/AttackState.cs.meta | 3 + .../Characters/Enemy/States/ChaseState.cs | 40 ++- .../Characters/Enemy/States/IdleState.cs | 18 +- .../Characters/Enemy/States/PatrolState.cs | 23 +- .../Characters/Enemy/States/StunnedState.cs | 24 +- 8 files changed, 208 insertions(+), 246 deletions(-) create mode 100644 Assets/Scripts/Characters/Enemy/States/AttackState.cs create mode 100644 Assets/Scripts/Characters/Enemy/States/AttackState.cs.meta diff --git a/Assets/Characters/AlienCharacter/Animations/EnemyController.controller b/Assets/Characters/AlienCharacter/Animations/EnemyController.controller index 09e1326..383081b 100644 --- a/Assets/Characters/AlienCharacter/Animations/EnemyController.controller +++ b/Assets/Characters/AlienCharacter/Animations/EnemyController.controller @@ -1,5 +1,27 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1101 &-8008422709658283192 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 0} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 1 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.94 + m_HasExitTime: 1 + m_HasFixedDuration: 0 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &-7177139180987167045 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -13,7 +35,7 @@ AnimatorStateTransition: m_EventTreshold: 0 m_DstStateMachine: {fileID: 0} m_DstState: {fileID: -3543533935865275089} - m_Solo: 0 + m_Solo: 1 m_Mute: 0 m_IsExit: 0 serializedVersion: 3 @@ -24,31 +46,6 @@ AnimatorStateTransition: m_HasFixedDuration: 1 m_InterruptionSource: 0 m_OrderedInterruption: 1 - m_CanTransitionToSelf: 0 ---- !u!1101 &-6818529094234887481 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: - - m_ConditionMode: 1 - m_ConditionEvent: attack - m_EventTreshold: 0 - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 6469307968501949992} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.105819285 - m_TransitionOffset: 0 - m_ExitTime: 0.000000016145702 - m_HasExitTime: 1 - m_HasFixedDuration: 1 - m_InterruptionSource: 0 - m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 --- !u!1101 &-6298246179504697329 AnimatorStateTransition: @@ -57,44 +54,16 @@ AnimatorStateTransition: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: - m_Conditions: - - m_ConditionMode: 2 - m_ConditionEvent: dance - m_EventTreshold: 0 + m_Conditions: [] m_DstStateMachine: {fileID: 0} m_DstState: {fileID: 0} m_Solo: 0 m_Mute: 0 m_IsExit: 1 serializedVersion: 3 - m_TransitionDuration: 0.25 + m_TransitionDuration: 0 m_TransitionOffset: 0 m_ExitTime: 0.9632353 - m_HasExitTime: 0 - m_HasFixedDuration: 1 - m_InterruptionSource: 0 - m_OrderedInterruption: 1 - m_CanTransitionToSelf: 1 ---- !u!1101 &-5992129908580872030 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: - - m_ConditionMode: 1 - m_ConditionEvent: attack - m_EventTreshold: 0 - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 6469307968501949992} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.25 - m_TransitionOffset: 0 - m_ExitTime: 0.94186044 m_HasExitTime: 1 m_HasFixedDuration: 1 m_InterruptionSource: 0 @@ -107,7 +76,7 @@ AnimatorState: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: z fall to bite and stand 0 + m_Name: stunned m_Speed: 1 m_CycleOffset: 0 m_Transitions: @@ -179,28 +148,6 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: speed ---- !u!1101 &-3088080077202337175 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: [] - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 1102751178008254848} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.25 - m_TransitionOffset: 0 - m_ExitTime: 0.94 - m_HasExitTime: 1 - m_HasFixedDuration: 1 - m_InterruptionSource: 0 - m_OrderedInterruption: 1 - m_CanTransitionToSelf: 1 --- !u!1101 &-2680946984351937023 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -210,15 +157,15 @@ AnimatorStateTransition: m_Name: m_Conditions: - m_ConditionMode: 1 - m_ConditionEvent: damage + m_ConditionEvent: stunned m_EventTreshold: 0 m_DstStateMachine: {fileID: 0} m_DstState: {fileID: -5914887121904355405} - m_Solo: 0 + m_Solo: 1 m_Mute: 0 m_IsExit: 0 serializedVersion: 3 - m_TransitionDuration: 1.10299 + m_TransitionDuration: 0.25 m_TransitionOffset: 0 m_ExitTime: 0.080844834 m_HasExitTime: 0 @@ -284,20 +231,20 @@ AnimatorController: m_DefaultInt: 0 m_DefaultBool: 0 m_Controller: {fileID: 0} - - m_Name: stun - m_Type: 4 - m_DefaultFloat: 0 - m_DefaultInt: 0 - m_DefaultBool: 0 - m_Controller: {fileID: 0} - - m_Name: attack + - m_Name: stunned m_Type: 9 m_DefaultFloat: 0 m_DefaultInt: 0 m_DefaultBool: 0 m_Controller: {fileID: 0} - m_Name: dance - m_Type: 4 + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + - m_Name: attack + m_Type: 9 m_DefaultFloat: 0 m_DefaultInt: 0 m_DefaultBool: 0 @@ -417,7 +364,6 @@ AnimatorState: m_Transitions: - {fileID: 1101976969126293670} - {fileID: -4063881565528374387} - - {fileID: 8378993677699007574} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -445,7 +391,6 @@ AnimatorState: m_CycleOffset: 0 m_Transitions: - {fileID: 1101067943808544730} - - {fileID: -5992129908580872030} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -479,28 +424,26 @@ AnimatorStateMachine: - serializedVersion: 1 m_State: {fileID: 2316826469527330622} m_Position: {x: 120, y: -170, z: 0} - - serializedVersion: 1 - m_State: {fileID: 3530830070236652748} - m_Position: {x: 560, y: 440, z: 0} - serializedVersion: 1 m_State: {fileID: -5914887121904355405} - m_Position: {x: 650, y: 10, z: 0} + m_Position: {x: 800, y: 100, z: 0} - serializedVersion: 1 m_State: {fileID: 6469307968501949992} - m_Position: {x: 540, y: -170, z: 0} + m_Position: {x: 800, y: 150, z: 0} - serializedVersion: 1 m_State: {fileID: -3543533935865275089} - m_Position: {x: 500, y: 210, z: 0} + m_Position: {x: 800, y: 50, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: - {fileID: -2680946984351937023} - {fileID: -7177139180987167045} + - {fileID: 5837019369696166552} m_EntryTransitions: [] m_StateMachineTransitions: {} m_StateMachineBehaviours: [] - m_AnyStatePosition: {x: 520, y: 100, z: 0} + m_AnyStatePosition: {x: 500, y: 100, z: 0} m_EntryPosition: {x: 140, y: 120, z: 0} - m_ExitPosition: {x: 864, y: 144, z: 0} + m_ExitPosition: {x: 1100, y: 100, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_DefaultState: {fileID: 1102751178008254848} --- !u!1102 &2316826469527330622 @@ -515,7 +458,6 @@ AnimatorState: m_CycleOffset: 0 m_Transitions: - {fileID: -1746738016173991043} - - {fileID: -6818529094234887481} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -531,32 +473,6 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: ---- !u!1102 &3530830070236652748 -AnimatorState: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: z fall to bite and stand - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: [] - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: -203655887218126122, guid: 9175fddd2326b1545ac71cf4346baa83, type: 3} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: --- !u!1101 &4133929114904890219 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -564,52 +480,22 @@ AnimatorStateTransition: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: - m_Conditions: - - m_ConditionMode: 2 - m_ConditionEvent: stun - m_EventTreshold: 0 + m_Conditions: [] m_DstStateMachine: {fileID: 0} m_DstState: {fileID: 0} m_Solo: 0 m_Mute: 0 m_IsExit: 1 serializedVersion: 3 - m_TransitionDuration: 0.25 + m_TransitionDuration: 0 m_TransitionOffset: 0 m_ExitTime: 0.9639423 m_HasExitTime: 1 - m_HasFixedDuration: 1 + m_HasFixedDuration: 0 m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 ---- !u!1102 &6469307968501949992 -AnimatorState: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: zNeckBite - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: - - {fileID: -3088080077202337175} - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: -203655887218126122, guid: 44e7c5a9d9018944591bb3f85d64726b, type: 3} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: ---- !u!1101 &8378993677699007574 +--- !u!1101 &5837019369696166552 AnimatorStateTransition: m_ObjectHideFlags: 1 m_CorrespondingSourceObject: {fileID: 0} @@ -628,9 +514,36 @@ AnimatorStateTransition: serializedVersion: 3 m_TransitionDuration: 0.25 m_TransitionOffset: 0 - m_ExitTime: 0.9375 - m_HasExitTime: 1 + m_ExitTime: 0.75 + m_HasExitTime: 0 m_HasFixedDuration: 1 m_InterruptionSource: 0 m_OrderedInterruption: 1 - m_CanTransitionToSelf: 1 + m_CanTransitionToSelf: 0 +--- !u!1102 &6469307968501949992 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: attack + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -8008422709658283192} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -203655887218126122, guid: 44e7c5a9d9018944591bb3f85d64726b, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Assets/Scripts/Characters/Enemy/Enemy.cs b/Assets/Scripts/Characters/Enemy/Enemy.cs index 36171dc..6237ed2 100644 --- a/Assets/Scripts/Characters/Enemy/Enemy.cs +++ b/Assets/Scripts/Characters/Enemy/Enemy.cs @@ -4,6 +4,7 @@ using Mirror; using UnityEngine; using UnityEngine.AI; using UnityEngine.Animations.Rigging; +using UnityEngine.Serialization; namespace Characters.Enemy { @@ -19,13 +20,14 @@ namespace Characters.Enemy [HideInInspector] public bool canAttack; - [SyncVar(hook = nameof(OnStateChanged))] public EnemyState state = EnemyState.Idle; + [SyncVar] public EnemyState state = EnemyState.Idle; [SyncVar, HideInInspector] public float aimRigWeight; public readonly StateMachine stateMachine = new StateMachine(); - public Transform target; + [FormerlySerializedAs("target")] public Transform targetTransform; public NetworkAnimator networkAnimator; + public float DistanceToTarget => Vector3.Distance(targetTransform.transform.position, transform.position); private CustomNetworkManager _networkManager; private NetworkGameManager _networkGameManager; @@ -50,6 +52,7 @@ namespace Characters.Enemy stateMachine.Add(new PatrolState(this)); stateMachine.Add(new ChaseState(this)); stateMachine.Add(new StunnedState(this)); + stateMachine.Add(new AttackState(this)); stateMachine.SetCurrentState(state); } @@ -58,13 +61,16 @@ namespace Characters.Enemy { Footsteps(); - stateMachine.Update(); + if (isServer) + { + agent.speed = _speedMul * RunSpeed; + animator.SetFloat(SpeedAnimHash, agent.velocity.magnitude); + } - agent.speed = _speedMul * RunSpeed; aimRigWeight = isServer ? Mathf.Lerp(aimRigWeight, _targetAimRigWeight, Time.deltaTime) : aimRigWeight; aimRig.weight = aimRigWeight; - animator.SetFloat(SpeedAnimHash, agent.velocity.magnitude); + stateMachine.Update(); } void FixedUpdate() @@ -92,24 +98,54 @@ namespace Characters.Enemy } } + [ClientRpc] + public void RpcKillTarget(Transform target) + { + Interactions interactions = target.GetComponent(); + + if (interactions != null) interactions.DropProp(); + + target.GetComponent().Die(); + } + + [ServerCallback] public override void TakeDamage() { base.TakeDamage(); - - if (state == EnemyState.Stunned) - { - stateMachine.GetCurrentState().ReEnter(); - } - else - { - state = EnemyState.Stunned; - } + + ChangeState(EnemyState.Stunned); } - void OnStateChanged(EnemyState _, EnemyState newState) + public void ChangeState(EnemyState newState) { - Debug.Log($"{_} -> {newState}"); + state = newState; stateMachine.SetCurrentState(newState); } + + public Transform GetClosestTarget() + { + var alivePlayers = _networkManager.alive; + + if (targetTransform != null && alivePlayers.Count == 1 && alivePlayers[0].transform == targetTransform) + { + return targetTransform; + } + + Transform closestTarget = null; + + float sortDistance = float.MaxValue; + foreach (var player in _networkManager.alive) + { + float distance = Vector3.Distance(player.transform.position, transform.position); + + if (distance <= aggressionDistance && distance < sortDistance && agent.SetDestination(player.transform.position)) + { + sortDistance = distance; + closestTarget = player.transform; + } + } + + return closestTarget; + } } } \ No newline at end of file diff --git a/Assets/Scripts/Characters/Enemy/States/AttackState.cs b/Assets/Scripts/Characters/Enemy/States/AttackState.cs new file mode 100644 index 0000000..cbdf49f --- /dev/null +++ b/Assets/Scripts/Characters/Enemy/States/AttackState.cs @@ -0,0 +1,37 @@ +using Koptilnya.StateMachine; +using Mirror; +using UnityEngine; + +namespace Characters.Enemy.States +{ + public class AttackState : State + { + private readonly Enemy _enemy; + private static readonly int AttackAnimHash = Animator.StringToHash("attack"); + + public AttackState(Enemy enemy) : base(EnemyState.Attack) + { + _enemy = enemy; + } + + [ServerCallback] + public override void Enter() + { + _enemy.SetSpeedMul(1f); + } + + [ServerCallback] + public override void Update() + { + _enemy.networkAnimator.SetTrigger(AttackAnimHash); + _enemy.RpcKillTarget(_enemy.targetTransform); + _enemy.ChangeState(EnemyState.Patrol); + } + + [ServerCallback] + public override void Exit() + { + _enemy.targetTransform = null; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Characters/Enemy/States/AttackState.cs.meta b/Assets/Scripts/Characters/Enemy/States/AttackState.cs.meta new file mode 100644 index 0000000..ffd92c1 --- /dev/null +++ b/Assets/Scripts/Characters/Enemy/States/AttackState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3e9f5beb8e3e4632a4fb963810a1386f +timeCreated: 1710870974 \ No newline at end of file diff --git a/Assets/Scripts/Characters/Enemy/States/ChaseState.cs b/Assets/Scripts/Characters/Enemy/States/ChaseState.cs index f870ab7..c78f623 100644 --- a/Assets/Scripts/Characters/Enemy/States/ChaseState.cs +++ b/Assets/Scripts/Characters/Enemy/States/ChaseState.cs @@ -1,4 +1,5 @@ using Koptilnya.StateMachine; +using Mirror; using UnityEngine; namespace Characters.Enemy.States @@ -12,48 +13,41 @@ namespace Characters.Enemy.States _enemy = enemy; } + [ServerCallback] public override void Enter() { - if (!_enemy.isServer) return; - _enemy.SetSpeedMul(1f); _enemy.SetAimRigWeight(1f); } + [ServerCallback] public override void Update() { - if (!_enemy.isServer) return; + _enemy.agent.destination = _enemy.targetTransform.position; + + var distanceToTarget = _enemy.DistanceToTarget; - _enemy.agent.destination = _enemy.target.position; - - float distance = Vector3.Distance(_enemy.target.transform.position, _enemy.transform.position); - - if (distance < _enemy.aggressionDistance) + if (distanceToTarget < _enemy.aggressionDistance) { - _enemy.aimTransform.position = _enemy.target.position + _enemy.target.up * 1.2f; + _enemy.aimTransform.position = _enemy.targetTransform.position + _enemy.targetTransform.up * 1.2f; - // if (distance < 1f) - // { - // if (canAttack && !isKilling) - // { - // RpcKillPlayer(_target); - // animator.SetTrigger("attack"); - // - // StartCoroutine(AfterKillTimer()); - // } - // } + if (distanceToTarget < 1f) + { + _enemy.ChangeState(EnemyState.Attack); + } } else { - _enemy.state = EnemyState.Idle; + _enemy.ChangeState(EnemyState.Idle); } + + _enemy.targetTransform = _enemy.GetClosestTarget(); } + [ServerCallback] public override void Exit() { - if (!_enemy.isServer) return; - - _enemy.target = null; + _enemy.targetTransform = null; _enemy.SetAimRigWeight(0f); } diff --git a/Assets/Scripts/Characters/Enemy/States/IdleState.cs b/Assets/Scripts/Characters/Enemy/States/IdleState.cs index af611e5..307334a 100644 --- a/Assets/Scripts/Characters/Enemy/States/IdleState.cs +++ b/Assets/Scripts/Characters/Enemy/States/IdleState.cs @@ -15,34 +15,32 @@ namespace Characters.Enemy.States { _enemy = enemy; } - + + [ServerCallback] public override void Enter() { - if (!_enemy.isServer) return; - _enemy.SetSpeedMul(0f); - _enemy.networkAnimator.SetTrigger("dance"); + _enemy.networkAnimator.SetTrigger(DanceAnimHash); } + [ServerCallback] public override void Update() { - if (!_enemy.isServer) return; - var stateInfo = _enemy.animator.GetCurrentAnimatorStateInfo(0); bool inAnim = stateInfo.shortNameHash == DanceAnimHash; if (!_entered && inAnim) _entered = true; - if (_entered && !inAnim) _enemy.state = EnemyState.Patrol; + if (_entered && !inAnim) _enemy.ChangeState(EnemyState.Patrol); } + [ServerCallback] public override void Exit() { - if (!_enemy.isServer) return; - _entered = false; - _enemy.networkAnimator.ResetTrigger("dance"); + + _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 857d964..f875c82 100644 --- a/Assets/Scripts/Characters/Enemy/States/PatrolState.cs +++ b/Assets/Scripts/Characters/Enemy/States/PatrolState.cs @@ -19,33 +19,20 @@ namespace Characters.Enemy.States _networkManager = NetworkManager.singleton.GetComponent(); } + [ServerCallback] public override void Enter() { - if (!_enemy.isServer) return; - _enemy.SetSpeedMul(1f); - _enemy.SetAimRigWeight(0f); } + [ServerCallback] public override void Update() { - if (!_enemy.isServer) return; - - float sortDistance = float.MaxValue; - foreach (var player in _networkManager.alive) - { - float distance = Vector3.Distance(player.transform.position, _enemy.transform.position); - - if (distance <= _enemy.aggressionDistance && distance < sortDistance && _enemy.agent.SetDestination(player.transform.position)) - { - sortDistance = distance; - _enemy.target = player.transform; - } - } + _enemy.targetTransform = _enemy.GetClosestTarget(); - if (_enemy.target != null) + if (_enemy.targetTransform != null) { - _enemy.state = EnemyState.Chase; + _enemy.ChangeState(EnemyState.Chase); return; } diff --git a/Assets/Scripts/Characters/Enemy/States/StunnedState.cs b/Assets/Scripts/Characters/Enemy/States/StunnedState.cs index fb0ca7e..069b1c1 100644 --- a/Assets/Scripts/Characters/Enemy/States/StunnedState.cs +++ b/Assets/Scripts/Characters/Enemy/States/StunnedState.cs @@ -25,10 +25,10 @@ namespace Characters.Enemy.States if (_enemy.isServer) { _enemy.canAttack = false; - _enemy.target = null; + _enemy.targetTransform = null; _enemy.SetSpeedMul(0f); - _enemy.networkAnimator.SetTrigger("stunned"); + _enemy.networkAnimator.SetTrigger(StunnedAnimHash); } if(_enemy.isClient) @@ -38,36 +38,30 @@ namespace Characters.Enemy.States } } - [Server] + [ServerCallback] public override void ReEnter() { - Debug.Log("Reenter stunned state"); - - _enemy.networkAnimator.SetTrigger("stunned"); + _enemy.networkAnimator.SetTrigger(StunnedAnimHash); } + [ServerCallback] 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; - } + if (_entered && !inAnim) _enemy.ChangeState(EnemyState.Patrol); } + [ServerCallback] public override void Exit() { - if (!_enemy.isServer) return; - _entered = false; - _enemy.networkAnimator.ResetTrigger("stunned"); + + _enemy.networkAnimator.ResetTrigger(StunnedAnimHash); _enemy.SetSpeedMul(1f); _enemy.canAttack = true;