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;
[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<EnemyState> stateMachine = new StateMachine<EnemyState>();
public Transform target;
public NetworkAnimator networkAnimator;
private CustomNetworkManager _networkManager;
private NetworkGameManager _networkGameManager;
@ -41,6 +42,8 @@ namespace Characters.Enemy
_networkManager = NetworkManager.singleton.GetComponent<CustomNetworkManager>();
_networkGameManager = NetworkGameManager.singleton;
networkAnimator = GetComponent<NetworkAnimator>();
_footstepClip = Resources.Load<AudioClip>("Audio/EnemySounds/Steps/monsterStep1");
stateMachine.Add(new IdleState(this));
@ -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()
@ -93,11 +96,19 @@ namespace Characters.Enemy
{
base.TakeDamage();
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);
}
}

View File

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

View File

@ -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);
}
}

View File

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

View File

@ -10,9 +10,10 @@ namespace Characters.Enemy.States
public class StunnedState : State<EnemyState>
{
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<NetworkAnimator>().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;
}
}
}

View File

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