示例#1
0
    void UpdatePoints()
    {
        beamLine.SetPosition(0, transform.position);
        beamLine.SetPosition(1, transform.position);
        if (targetProjectile != null)
        {
            if (hitEffect != null)
            {
                hitEffect.transform.position = targetProjectile.transform.position;
            }
            beamLine.SetPosition(1, targetProjectile.transform.position);
            beamLine.material.mainTextureScale = new Vector2(Vector3.Distance(transform.position, targetProjectile.transform.position), 1);
            float range  = (targetProjectile.transform.position - transform.position).sqrMagnitude;
            float damage = attachedWeapon.baseWeapon.CalculateDamage(range) * GetDeltaTime();
            damage            += damage * damageBonus;
            AccumulatedDamage += damage;
            totalDamage       += damage;
            if (DamageIntervalTimer > 0)
            {
                DamageIntervalTimer -= GetDeltaTime();
            }
            else
            {
                DamageIntervalTimer = ResourceManager.instance.GetGameConstants().BeamDamageIntervalTime;
                targetProjectile.TakeDamage(attachedWeapon.baseWeapon, AccumulatedDamage);
                AccumulatedDamage = 0;
            }
        }
        else
        {
            RaycastHit[] hits;
            hits = Physics.RaycastAll(transform.position, GetWorldTargetOffset() - transform.position, attachedWeapon.baseWeapon.GetMaxRange(), 1 << 12, QueryTriggerInteraction.Ignore);
            foreach (RaycastHit hit in hits)
            {
                if (LastHitObject == null)
                {
                    if (hit.transform.root.gameObject.tag == "Ship" || hit.transform.root.gameObject.tag == "Fighter" || hit.transform.root.gameObject.tag == "Station")
                    {
                        SpaceUnit HitUnit = hit.transform.root.GetComponent <SpaceUnit>();
                        if (attachedWeapon.isEnemy(HitUnit))
                        {
                            LastHitObject = hit.transform.root.gameObject;
                            LastHitUnit   = HitUnit;
                            LastHitUnit.CheckShieldHit(hit.point, transform.position);
                            if (hitEffect != null)
                            {
                                hitEffect.transform.position = hit.point;
                            }
                            beamLine.SetPosition(1, hit.point);
                            beamLine.material.mainTextureScale = new Vector2(Vector3.Distance(transform.position, hit.point), 1);
                            float range  = (hit.point - transform.position).sqrMagnitude;
                            float damage = attachedWeapon.baseWeapon.CalculateDamage(range) * GetDeltaTime();
                            damage             += damage * damageBonus;
                            totalDamage        += damage;
                            AccumulatedDamage   = damage;
                            DamageIntervalTimer = ResourceManager.instance.GetGameConstants().BeamDamageIntervalTime;
                            return;
                        }
                    }
                }
                else
                {
                    if (hit.transform.root.gameObject == LastHitObject)
                    {
                        LastHitUnit.CheckShieldHit(hit.point, transform.position);
                        if (hitEffect != null)
                        {
                            hitEffect.transform.position = hit.point;
                        }
                        beamLine.SetPosition(1, hit.point);
                        beamLine.material.mainTextureScale = new Vector2(Vector3.Distance(transform.position, hit.point), 1);
                        float range  = (hit.point - transform.position).sqrMagnitude;
                        float damage = attachedWeapon.baseWeapon.CalculateDamage(range) * GetDeltaTime();
                        damage            += damage * damageBonus;
                        totalDamage       += damage;
                        AccumulatedDamage += damage;

                        if (DamageIntervalTimer > 0)
                        {
                            DamageIntervalTimer -= GetDeltaTime();
                        }
                        else
                        {
                            DamageIntervalTimer = ResourceManager.instance.GetGameConstants().BeamDamageIntervalTime;
                            DealDamage(LastHitUnit, AccumulatedDamage);
                            AccumulatedDamage = 0;
                        }
                        return;
                    }
                    else if (hit.transform.root.gameObject.tag == "Ship" || hit.transform.root.gameObject.tag == "Fighter" || hit.transform.root.gameObject.tag == "Station")
                    {
                        SpaceUnit HitUnit = hit.transform.root.GetComponent <SpaceUnit>();
                        if (attachedWeapon.isEnemy(HitUnit))
                        {
                            if (LastHitUnit != null && AccumulatedDamage > 0)
                            {
                                DealDamage(LastHitUnit, AccumulatedDamage);
                            }
                            LastHitObject = hit.transform.root.gameObject;
                            LastHitUnit   = HitUnit;
                            LastHitUnit.CheckShieldHit(hit.point, transform.position);
                            if (hitEffect != null)
                            {
                                hitEffect.transform.position = hit.point;
                            }
                            beamLine.SetPosition(1, hit.point);
                            beamLine.material.mainTextureScale = new Vector2(Vector3.Distance(transform.position, hit.point), 1);
                            float range  = (hit.point - transform.position).sqrMagnitude;
                            float damage = attachedWeapon.baseWeapon.CalculateDamage(range) * GetDeltaTime();
                            damage             += damage * damageBonus;
                            totalDamage        += damage;
                            AccumulatedDamage   = damage;
                            DamageIntervalTimer = ResourceManager.instance.GetGameConstants().BeamDamageIntervalTime;
                            return;
                        }
                    }
                }
            }
        }
    }