Client-server sync
This commit is contained in:
parent
aeabb5344c
commit
4d6cf50961
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user