protected override void OnUpdate() { foreach (var e in GetEntities <Group>()) { var _bullet = e._Bullet; if (_bullet.isActive) { var _transform = e._Transform; _bullet.timer.Update(); if (Physics.Raycast(_transform.position, _transform.forward, out _bullet.hit, _bullet.speed * Time.deltaTime, _bullet.layerMask)) { var hitInfo = _bullet.hit; var hitTag = hitInfo.collider.tag; var _attackListener = hitInfo.collider.gameObject.GetComponentInParent <C_AttackListener>(); if (_attackListener != null) { if (_attackListener.isActive) { // Add impact effect if (Aspect.IsAvatarTags(hitTag)) { var attack = _bullet.attack; // Modify demage by different body part attack.demage = (int)(_bullet.attack.demage * AvatarTagsData.demageRate[hitTag]); // Set if head shot attack.headShot = AvatarTagsData.IsHead(hitTag); // Add blood effect Effect.AddEffect(_attackListener.hitEffect, hitInfo); // Add attack info in attackListener component if (_bullet.isLocal) { _attackListener.attackList.Add(_bullet.attack); } } } } else { Effect.AddEffect(_bullet.impactEffect, hitInfo); Sound.PlayOneShot(_bullet.audioSource, _bullet.sounds); } this.CloseBullet(_bullet, _transform); } // ------------------------------------------- _transform.Translate(Vector3.forward * _bullet.speed * Time.deltaTime); if (!_bullet.timer.isRunning) { this.CloseBullet(_bullet, _transform); } } } }