// Update is called once per frame void Update() { timeSinceLastShot += Time.deltaTime; if (HasShootRequest() && ConsumePower()) { // Display lance if (!WasShootingLastFrame) { CreateBeams(); WasShootingLastFrame = true; } for (int i = 0; i < Barrels.Length; i++) { Transform barrel = Barrels[i]; Beams[i].transform.position = barrel.position; Beams[i].transform.rotation = barrel.rotation; RaycastHit hit; if (Physics.Raycast(transform.position, transform.forward, out hit, range, LayerMask.GetMask("Enemy") | LayerMask.GetMask("Environment"))) { EntityInfo target = hit.transform.GetComponent <EntityInfo>(); if (target != null) { if (!TargetDamageLogs.ContainsKey(target)) { TargetDamageLogs.Add(target, new WeaponInfo() { CritChance = Stats.CritChance, CritDamage = Stats.CritDamage }); } WeaponInfo info = TargetDamageLogs[target]; // convert damage from damage per second to damage per frame // add it to the pending damage stack foreach (DamageTypes value in types) { info.AddDamage(value, Stats.Damage(value) * Time.deltaTime); } } else { SetBeamScale(hit.distance); } } else if (Beams[0].transform.localScale.z != range) { SetBeamScale(range); } } } else if (WasShootingLastFrame) { RemoveBeams(); WasShootingLastFrame = false; } if (timeSinceLastShot >= TickRateInSeconds) { foreach (KeyValuePair <EntityInfo, WeaponInfo> data in TargetDamageLogs) { data.Key.TakeDamage(data.Value); } TargetDamageLogs.Clear(); timeSinceLastShot -= TickRateInSeconds; } }