void Update() { if (isInvulnerable) { m_timeSinceLastHit += Time.deltaTime; if (m_timeSinceLastHit > invulnerabiltyTime) { m_timeSinceLastHit = 0.0f; isInvulnerable = false; OnBecomeVulnerable.Invoke(); } } }
void LateUpdate() //This must not be blocked by derived classes!!! { if (isInvulnerable) { m_timeSinceLastHit += Time.deltaTime; if (m_timeSinceLastHit > invulnerableTime) { m_timeSinceLastHit = 0f; isInvulnerable = false; OnBecomeVulnerable.Invoke(); } } }
void Update() { if (m_Invulnerable) { m_InulnerabilityTimer -= Time.deltaTime; if (m_InulnerabilityTimer <= 0f) { m_Invulnerable = false; OnBecomeVulnerable.Invoke(); } } }
void Update() { m_currentHitPoints = (int)(dstManager.GetComponentData<AttributeValues>(this.attributeEntity).CurrentValue.Health); if (isInvulnerable) { m_timeSinceLastHit += Time.deltaTime; if (m_timeSinceLastHit > invulnerabiltyTime) { m_timeSinceLastHit = 0.0f; isInvulnerable = false; OnBecomeVulnerable.Invoke(); } } // This logic is to delay the processing of hp checks by a frame, since the // attribute update logic runs after one frame if (wasDamaged) { wasDamaged = false; for (var j = 0; j < damageMessagesToAction.Count; j++) { var data = damageMessagesToAction[j]; if (currentHitPoints <= 0) schedule += OnDeath.Invoke; //This avoid race condition when objects kill each other. else OnReceiveDamage.Invoke(); var messageType = currentHitPoints <= 0 ? MessageType.DEAD : MessageType.DAMAGED; for (var i = 0; i < onDamageMessageReceivers.Count; ++i) { var receiver = onDamageMessageReceivers[i] as IMessageReceiver; receiver.OnReceiveMessage(messageType, this, data); } } damageMessagesToAction.Clear(); } if (damageMessagesToAction.Count > 0) { wasDamaged = true; } }