void UpdateStatusEffect(int status) { HealthManager.StatusEffect sEffect = (HealthManager.StatusEffect)status; myBotManager.burnedP.Stop(); myBotManager.frozenP.Stop(); myBotManager.shockedP.Stop(); myBotManager.slowedP.Stop(); myBotManager.confusedP.Stop(); switch (sEffect) { case HealthManager.StatusEffect.BURNED: myBotManager.burnedP.Play(); break; } }
// Update is called once per frame void Update() { if (!networkView.isMine) { return; } //If the status effect has changed since last update, reset the timer if (myHPManager.statusEffect != prevStatus) { healthEffectTimer = 0f; gradualDamageTimer = 0f; } switch (myHPManager.statusEffect) { case HealthManager.StatusEffect.NORMAL: myBotManager.burnedP.Stop(); myBotManager.frozenP.Stop(); myBotManager.shockedP.Stop(); myBotManager.slowedP.Stop(); myBotManager.confusedP.Stop(); healthEffectTimer = 0f; gradualDamageTimer = 0f; break; case HealthManager.StatusEffect.BURNED: myBotManager.burnedP.Play(); myBotManager.frozenP.Stop(); myBotManager.shockedP.Stop(); myBotManager.slowedP.Stop(); myBotManager.confusedP.Stop(); if (healthEffectTimer > 3f) { myHPManager.statusEffect = HealthManager.StatusEffect.NORMAL; healthEffectTimer = 0f; gradualDamageTimer = 0f; } else { gradualDamageTimer += Time.deltaTime; if (gradualDamageTimer > 0.5f) { gradualDamageTimer = 0f; myHPManager.ReceiveDamage(10, Projectile.DamageType.STATUS, Projectile.DamageElement.STATUS); } healthEffectTimer += Time.deltaTime; } break; case HealthManager.StatusEffect.CONFUSED: myBotManager.burnedP.Stop(); myBotManager.frozenP.Stop(); myBotManager.shockedP.Stop(); myBotManager.slowedP.Stop(); myBotManager.confusedP.Play(); if (healthEffectTimer > 3f) { myHPManager.statusEffect = HealthManager.StatusEffect.NORMAL; myBotManager.movementSpeed = initSpeed; myBotManager.acceleration = initAcceleration; myBotManager.timeBetweenAttacksInSeconds = initFireRate; healthEffectTimer = 0f; } else { myBotManager.movementSpeed = 0f; myBotManager.acceleration = 0f; myBotManager.timeBetweenAttacksInSeconds = 999f; healthEffectTimer += Time.deltaTime; } break; } prevStatus = myHPManager.statusEffect; }
//State Sync function //Although the real calculations are done with navmesh agent, the clients are using rb to navigate void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info) { bool rbEnabled = false; Vector3 position = Vector3.zero; Vector3 forwardDir = Vector3.zero; Vector3 velocity = Vector3.zero; Vector3 nmDestination = Vector3.zero; bool isMovingAnim = false, takingDamageAnim = false, isDeadAnim = false, isAttackingAnim = false; int status = 99; if (stream.isWriting) { rbEnabled = !rigidbody.isKinematic; position = transform.position; forwardDir = transform.forward; if (rbEnabled) { velocity = rigidbody.velocity; } else { velocity = myNavMeshAgent.velocity; } isMovingAnim = myBotAnimator.isMoving; takingDamageAnim = myBotAnimator.takingDamage; isDeadAnim = myBotAnimator.isDead; isAttackingAnim = myBotAnimator.isAttacking; status = (int)myHPManager.statusEffect; //stream.Serialize(ref rbEnabled); stream.Serialize(ref position); stream.Serialize(ref forwardDir); stream.Serialize(ref velocity); stream.Serialize(ref isMovingAnim); stream.Serialize(ref takingDamageAnim); stream.Serialize(ref isDeadAnim); stream.Serialize(ref isAttackingAnim); stream.Serialize(ref status); } else { //stream.Serialize(ref rbEnabled); stream.Serialize(ref position); stream.Serialize(ref forwardDir); stream.Serialize(ref velocity); stream.Serialize(ref isMovingAnim); stream.Serialize(ref takingDamageAnim); stream.Serialize(ref isDeadAnim); stream.Serialize(ref isAttackingAnim); stream.Serialize(ref status); transform.position = position; transform.forward = forwardDir; //if (rbEnabled) { rigidbody.isKinematic = false; rigidbody.velocity = velocity; myNavMeshAgent.Stop(); // } // else { // rigidbody.isKinematic = true; // myNavMeshAgent.velocity = velocity; // } myAnimator.SetBool("isMoving", isMovingAnim); myAnimator.SetBool("takingDamage", takingDamageAnim); myAnimator.SetBool("isDead", isDeadAnim); myAnimator.SetBool("isAttacking", isAttackingAnim); HealthManager.StatusEffect prevEffect = myHPManager.statusEffect; myHPManager.statusEffect = (HealthManager.StatusEffect)status; if (prevEffect != myHPManager.statusEffect) { burnedP.Stop(); frozenP.Stop(); shockedP.Stop(); slowedP.Stop(); confusedP.Stop(); switch (myHPManager.statusEffect) { case HealthManager.StatusEffect.BURNED: burnedP.Play(); break; case HealthManager.StatusEffect.CONFUSED: confusedP.Play(); break; } } } }