示例#1
0
    // 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;
        }
    }