Esempio n. 1
0
    public override void Fire()
    {
        if (!CanFire())
        {
            return;
        }

        if (!firing)
        {
            audioSource.Play();
        }

        firing = true;

        magazine.Fire();
        muzzleWaterDroplets.Play();

        lr.gameObject.SetActive(true);

        RaycastHit hit;
        Ray        ray = new Ray(muzzle.position, muzzle.forward);

        float totalDistance;

        if (Physics.BoxCast(
                ray.origin,
                lr.startWidth * muzzle.localScale,
                ray.direction,
                out hit,
                muzzle.rotation,
                maxDistance,
                layers,
                QueryTriggerInteraction.Ignore))
        {
            GameObject go = hit.collider.gameObject;
            Rigidbody  rb = go.GetComponentInParent <Rigidbody>();

            if (rb)
            {
                Doggo d = go.GetComponentInParent <Doggo>();
                if (d)
                {
                    PhysicsBehaviour pb = d.pb;
                    if (pb && pb.ControlledByAgent)
                    {
                        pb.DisableAgentAndSetupForPhysics();
                    }

                    d.status.AddBoost(Attributes.CLEANLINESS);
                }

                Vector3 force = waterStrengthDistanceCurve.Evaluate(hit.distance / maxDistance)
                                * maxWaterStrength * (-hit.normal + Vector3.up);

                rb.AddForceAtPosition(force, hit.point);
            }
            totalDistance = hit.distance;
        }
        else
        {
            onHitParticleSystem.Stop(true, ParticleSystemStopBehavior.StopEmitting);
            totalDistance = maxDistance;
        }

        Vector3 dir = ray.direction;

        lr.positionCount = numberOfSegments;

        for (int i = 0; i < numberOfSegments; i++)
        {
            float   perc     = i / (float)numberOfSegments;
            float   distance = perc * maxDistance;
            Vector3 pos      = ray.GetPoint(perc * maxDistance);

            Vector3 beamPos = pos +
                              Random.Range(0.01f, 0.015f) * Mathf.Sin(30 * (i % 2 == 0 ? 1 : -1) * Time.time) * Vector3.up;

            if (distance >= totalDistance)
            {
                lr.positionCount = i;

                break;
            }

            lr.SetPosition(i, beamPos);
        }

        onHitParticleSystem.transform.position = lr.GetPosition(lr.positionCount - 1);
        if (!onHitParticleSystem.isPlaying)
        {
            onHitParticleSystem.Play();
        }
    }