public void KillBullet()
    {
        C_ShootTrigger triggerShoot = GetComponent <C_ShootTrigger>();

        if (triggerShoot != null)
        {
            triggerShoot.OnBulletTrigger();
        }

        Destroy(hCircle);
        Destroy(this.gameObject);
    }
Beispiel #2
0
    /// <summary>
    /// Called after the <c>Rigidbody</c> hit a layer, and after OnTriggerEnter. Depending on the bullet type, it either make it bounce, pierce, or just inflict damage.
    /// </summary>
    /// <param name="collideTo"></param>
    /// <param name="hitPoint"></param>
    public virtual void OnBulletHit(GameObject collideTo, Vector3 hitPoint)
    {
        int   BulletDammage = bullet.nDamage;
        float BulletStun    = bullet.StunValue;
        float fDist         = Vector3.Distance(Camera.main.transform.position, hitPoint);

        if (bullet.bDammageFadeWithDistance)
        {
            BulletDammage = fDist > bullet.fDistanceDammageFade ? 0 : bullet.nDamage - Mathf.CeilToInt(fDist * bullet.nDamage / bullet.fDistanceDammageFade);
        }
        if (bullet.bStunFadeWithDistance)
        {
            BulletStun = fDist > bullet.fDistanceStunFade ? 0 : bullet.StunValue - (fDist * bullet.StunValue / bullet.fDistanceStunFade);
        }

        //Debug.Log(fDist * bullet.nDamage / bullet.fDistanceDammageFade);

        FindObjectOfType <C_Main>().OnBulletHit(collideTo, hitPoint, bullet.bExplosionAtImpact, bullet.fExplosionRange, bullet.bActivateStopTimeAtImpact, BulletDammage, bullet.fExplosionForce, bullet.ShakePerExplosion, BulletStun, bullet.BulletName, bullet.bExplosionDealsDamage);

        C_ShootTrigger trig = collideTo.GetComponent <C_ShootTrigger>();

        if (trig != null)
        {
            trig.OnBulletTrigger();
        }

        //Debug.Log("bullet hit");

        if (Random.Range(0f, 1f) < bullet.fSlowMoProbability)
        {
            GameObject.FindObjectOfType <C_TimeScale>().AddSlowMo(bullet.fSlowMoPower, bullet.fSlowMoDuration);
        }

        if (bullet.bBouncingBullet)
        {
            nNbImpact++;
            if (nNbImpact >= bullet.nImpactBeforeDie)
            {
                Kill();
            }
        }
        else if (bullet.bPiercingBullet && (bullet.piercedLayers == (bullet.piercedLayers | (1 << collideTo.layer))) && (nNbPierces < bullet.nPiercingsMax || bullet.nPiercingsMax == -1))
        {
            nNbPierces++;

            //On fait de la balistique c'est drôle :)
            Vector3 shotDirection  = (hitPoint - MainCam.transform.position).normalized;
            Vector3 finalPiercePos = hitPoint;

            do
            {
                finalPiercePos    += (shotDirection * bullet.pierceStep);
                transform.position = finalPiercePos;
            } while (Physics.Raycast(finalPiercePos, shotDirection, bullet.pierceStep, bullet.piercedLayers));

            transform.position = finalPiercePos + shotDirection * bullet.pierceStep;


            if (Physics.Raycast(transform.position, shotDirection, out RaycastHit hit, Mathf.Infinity, bullet.layerMaskHit))
            {
                this.OnBulletHit(hit.collider.gameObject, hit.point);
            }
        }
        else
        {
            if (bullet.bBouncingBullet && nNbBounces < bullet.nImpactBeforeDie)
            {
                nNbBounces++;

                Invoke("BoostBulletBounce", .05f);
            }
            else
            {
                Kill();
            }
        }
    }