Client-server sync

This commit is contained in:
Nikita Kruglickiy 2024-03-19 20:18:01 +03:00
parent aeabb5344c
commit 4d6cf50961
6 changed files with 57 additions and 29 deletions

View File

@ -19,12 +19,13 @@ namespace Characters.Enemy
[HideInInspector] public bool canAttack; [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; [SyncVar, HideInInspector] public float aimRigWeight;
public readonly StateMachine<EnemyState> stateMachine = new StateMachine<EnemyState>(); public readonly StateMachine<EnemyState> stateMachine = new StateMachine<EnemyState>();
public Transform target; public Transform target;
public NetworkAnimator networkAnimator;
private CustomNetworkManager _networkManager; private CustomNetworkManager _networkManager;
private NetworkGameManager _networkGameManager; private NetworkGameManager _networkGameManager;
@ -41,6 +42,8 @@ namespace Characters.Enemy
_networkManager = NetworkManager.singleton.GetComponent<CustomNetworkManager>(); _networkManager = NetworkManager.singleton.GetComponent<CustomNetworkManager>();
_networkGameManager = NetworkGameManager.singleton; _networkGameManager = NetworkGameManager.singleton;
networkAnimator = GetComponent<NetworkAnimator>();
_footstepClip = Resources.Load<AudioClip>("Audio/EnemySounds/Steps/monsterStep1"); _footstepClip = Resources.Load<AudioClip>("Audio/EnemySounds/Steps/monsterStep1");
stateMachine.Add(new IdleState(this)); stateMachine.Add(new IdleState(this));
@ -48,7 +51,7 @@ namespace Characters.Enemy
stateMachine.Add(new ChaseState(this)); stateMachine.Add(new ChaseState(this));
stateMachine.Add(new StunnedState(this)); stateMachine.Add(new StunnedState(this));
stateMachine.SetCurrentState(EnemyState.Idle); stateMachine.SetCurrentState(state);
} }
void Update() void Update()
@ -93,11 +96,19 @@ namespace Characters.Enemy
{ {
base.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); stateMachine.SetCurrentState(newState);
} }
} }

View File

@ -16,6 +16,7 @@ namespace Characters.Enemy.States
{ {
if (!_enemy.isServer) return; if (!_enemy.isServer) return;
_enemy.SetSpeedMul(1f);
_enemy.SetAimRigWeight(1f); _enemy.SetAimRigWeight(1f);
} }

View File

@ -1,4 +1,5 @@
using Koptilnya.StateMachine; using Koptilnya.StateMachine;
using Mirror;
using UnityEngine; using UnityEngine;
namespace Characters.Enemy.States namespace Characters.Enemy.States
@ -8,6 +9,8 @@ namespace Characters.Enemy.States
private readonly Enemy _enemy; private readonly Enemy _enemy;
private static readonly int DanceAnimHash = Animator.StringToHash("dance"); private static readonly int DanceAnimHash = Animator.StringToHash("dance");
private bool _entered;
public IdleState(Enemy enemy) : base(EnemyState.Idle) public IdleState(Enemy enemy) : base(EnemyState.Idle)
{ {
_enemy = enemy; _enemy = enemy;
@ -18,7 +21,7 @@ namespace Characters.Enemy.States
if (!_enemy.isServer) return; if (!_enemy.isServer) return;
_enemy.SetSpeedMul(0f); _enemy.SetSpeedMul(0f);
_enemy.animator.SetBool(DanceAnimHash, true); _enemy.networkAnimator.SetTrigger(DanceAnimHash);
} }
public override void Update() public override void Update()
@ -27,17 +30,19 @@ namespace Characters.Enemy.States
var stateInfo = _enemy.animator.GetCurrentAnimatorStateInfo(0); var stateInfo = _enemy.animator.GetCurrentAnimatorStateInfo(0);
if (stateInfo.shortNameHash == DanceAnimHash && stateInfo.normalizedTime >= 1) bool inAnim = stateInfo.shortNameHash == DanceAnimHash;
{
_enemy.state = EnemyState.Patrol; if (!_entered && inAnim) _entered = true;
}
if (_entered && !inAnim) _enemy.state = EnemyState.Patrol;
} }
public override void Exit() public override void Exit()
{ {
if (!_enemy.isServer) return; if (!_enemy.isServer) return;
_enemy.animator.SetBool(DanceAnimHash, false); _entered = false;
_enemy.networkAnimator.ResetTrigger(DanceAnimHash);
_enemy.SetSpeedMul(1f); _enemy.SetSpeedMul(1f);
} }
} }

View File

@ -23,6 +23,7 @@ namespace Characters.Enemy.States
{ {
if (!_enemy.isServer) return; if (!_enemy.isServer) return;
_enemy.SetSpeedMul(1f);
_enemy.SetAimRigWeight(0f); _enemy.SetAimRigWeight(0f);
} }

View File

@ -10,9 +10,10 @@ namespace Characters.Enemy.States
public class StunnedState : State<EnemyState> public class StunnedState : State<EnemyState>
{ {
private readonly Enemy _enemy; 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) public StunnedState(Enemy enemy) : base(EnemyState.Stunned)
{ {
@ -27,11 +28,10 @@ namespace Characters.Enemy.States
_enemy.target = null; _enemy.target = null;
_enemy.SetSpeedMul(0f); _enemy.SetSpeedMul(0f);
_enemy.GetComponent<NetworkAnimator>().SetTrigger(DamageAnimHash); _enemy.networkAnimator.SetTrigger(StunnedAnimHash);
_task = new Task(GetStunned());
} }
else
if(_enemy.isClient)
{ {
_enemy.hitVFX.Stop(); _enemy.hitVFX.Stop();
_enemy.hitVFX.Play(); _enemy.hitVFX.Play();
@ -41,25 +41,36 @@ namespace Characters.Enemy.States
[Server] [Server]
public override void ReEnter() public override void ReEnter()
{ {
_task.Stop(); Debug.Log("Reenter stunned state");
_task.Start();
_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() public override void Exit()
{ {
if (!_enemy.isServer) return; if (!_enemy.isServer) return;
_task.Stop(); _entered = false;
_enemy.networkAnimator.ResetTrigger(StunnedAnimHash);
_enemy.SetSpeedMul(1f); _enemy.SetSpeedMul(1f);
_enemy.canAttack = true; _enemy.canAttack = true;
} }
IEnumerator GetStunned()
{
yield return new WaitForSeconds(6);
_enemy.state = EnemyState.Patrol;
}
} }
} }

View File

@ -221,7 +221,6 @@ public class Interactions : NetworkBehaviour
[Command(requiresAuthority = false)] [Command(requiresAuthority = false)]
void CmdHitPawn(Pawn pawn) void CmdHitPawn(Pawn pawn)
{ {
pawn.TakeDamage();
RpcHitPawn(pawn); RpcHitPawn(pawn);
} }