Exemplo n.º 1
0
    private void OnCollisionEnter(Collision col)
    {
        if (projectileType == ProjectileType.Instant)
        {
            if (collisionLayers == (collisionLayers | (1 << col.gameObject.layer)))
            {
                Rigidbody colRigid = col.gameObject.GetComponent <Rigidbody>();
                if (colRigid)
                {
                    colRigid.AddForce(transform.forward * GetComponent <Rigidbody>().velocity.magnitude);
                }

                Breakable hitBreakable = col.gameObject.GetComponent <Breakable>();
                if (hitBreakable)
                {
                    hitBreakable.Impact(col.contacts[0].normal, damage);
                }
                ActivateProjectile(col, col.contacts[0].normal);
            }
        }

        if (projectileType == ProjectileType.Timed)
        {
            if (col.gameObject.layer == 12) //Ai
            {
                Rigidbody colRigid = col.gameObject.GetComponent <Rigidbody>();
                if (colRigid)
                {
                    colRigid.AddForce(transform.forward * GetComponent <Rigidbody>().velocity.magnitude);
                }
                ActivateProjectile(col, col.contacts[0].normal);
            }
        }
    }
Exemplo n.º 2
0
 private void OnTriggerEnter(Collider col)
 {
     if (damageMask == (damageMask | (1 << col.gameObject.layer)) && doDamage)
     {
         if (haveBeenHit.Contains(col.gameObject) == false)
         {
             haveBeenHit.Add(col.gameObject);
             Rigidbody colRigid = col.gameObject.GetComponent <Rigidbody>();
             if (col.gameObject.layer == 12)
             {
                 if (col.transform.parent)
                 {
                     AIController controller = col.transform.parent.gameObject.GetComponent <AIController>();
                     if (controller)
                     {
                         if (!controller.isDead)
                         {
                             controller.TakeDamage(damage, incomingVector * explosionForce * 25);
                         }
                         else
                         {
                             col.transform.parent.GetComponent <Rigidbody>().AddExplosionForce(explosionForce * 10, transform.position, transform.localScale.magnitude);
                         }
                     }
                 }
             }
             else if (col.gameObject.layer == 8 && !hasHitPlayer)
             {
                 hasHitPlayer = true;
                 if (!InteractionController.instance.hasPlayerDied)
                 {
                     InteractionController.instance.TakeDamage(damage / 2);
                 }
             }
             else
             {
                 Breakable hitBreakable = col.gameObject.GetComponent <Breakable>();
                 if (hitBreakable)
                 {
                     hitBreakable.Impact(incomingVector * explosionForce, damage);
                 }
                 if (colRigid)
                 {
                     colRigid.AddExplosionForce(explosionForce, transform.position, transform.localScale.magnitude);
                 }
             }
         }
     }
 }
Exemplo n.º 3
0
    public void ActivateProjectile(Collision col, Vector3 hitNormal = new Vector3())
    {
        if (damagePrefab)
        {
            GameObject damageObject = Instantiate(damagePrefab, transform.position, Quaternion.identity);
            damageObject.tag = "PlayerProjectile";
            damageObject.GetComponent <ProjectileDamage>().incomingVector = -hitNormal;
            damageObject.GetComponent <ProjectileDamage>().damage         = damage;
            //damageObject.GetComponent<ProjectileDamage>().damageMask = collisionLayers;
            damageObject.transform.localScale = Vector3.one * sizeOfDamage;
        }
        else
        {
            if (col != null)
            {
                if (destroySound)
                {
                    GameVars.instance.audioManager.PlaySFX(destroySound, 0.5f, transform.position, null, 0, 1);
                }

                Rigidbody colRigid = col.gameObject.GetComponent <Rigidbody>();
                if (col.gameObject.layer == 12)
                {
                    if (col.transform.parent)
                    {
                        AIController controller = col.transform.parent.gameObject.GetComponent <AIController>();
                        if (controller)
                        {
                            if (!controller.isDead)
                            {
                                controller.TakeDamage(damage, -hitNormal * 25);
                            }
                            else
                            {
                                col.transform.parent.GetComponent <Rigidbody>().AddForce(hitForce * -hitNormal);
                            }
                        }
                    }
                }
                else if (col.gameObject.layer == 8 && !hasHitPlayer)
                {
                    if (!InteractionController.instance.hasPlayerDied)
                    {
                        hasHitPlayer = true;
                        InteractionController.instance.TakeDamage(damage);
                    }
                }
                else
                {
                    Breakable hitBreakable = col.gameObject.GetComponent <Breakable>();
                    if (hitBreakable)
                    {
                        hitBreakable.Impact(-hitNormal * hitForce, damage);
                    }
                    if (colRigid)
                    {
                        colRigid.AddForce(hitForce * -hitNormal);
                    }
                }
            }
        }
        Destroy(gameObject);
    }
Exemplo n.º 4
0
    /// <summary>
    /// Handles the bullets & damage of the enemy attack
    /// </summary>
    public void EnemyAttack()
    {
        if (InteractionController.instance.hasPlayerDied == false)
        {
            UpdateSprite(attackState);

            if (enemyParams.enemyType != Enemy.EnemyType.Melee)
            {
                GameVars.instance.audioManager.PlaySFX(enemyParams.attackSound, 0.8f, transform.position, "WeaponSound", 0, 0.7f);
            }
            if (attackParticle)
            {
                Instantiate(attackParticle, transform.position, Quaternion.identity);
            }

            RaycastHit hitInfo = new RaycastHit();
            bool       rayCast = false;

            for (int i = 0; i < enemyParams.totalRoundsPerShot; i++)
            {
                if (enemyParams.enemyType != Enemy.EnemyType.Projectile)
                {
                    if (enemyParams.enemyType == Enemy.EnemyType.Ranged)
                    {
                        Vector3    deviation3D = Random.insideUnitCircle * enemyParams.spreadMaxDivation;
                        Quaternion rot         = Quaternion.LookRotation(Vector3.forward * (((enemyParams.attackRange) - Vector3.Distance(transform.position, player.transform.position)) - 30) + deviation3D);
                        forwardVector = rot * (player.transform.position - transform.position);

                        rayCast = Physics.Raycast(transform.position, forwardVector, out hitInfo, enemyParams.attackRange, enemyParams.damageMask);
                    }
                    else
                    {
                        rayCast = Physics.SphereCast(transform.position, 0.5f, (player.transform.position - transform.position), out hitInfo, enemyParams.attackRange, enemyParams.damageMask);
                    }

                    if (rayCast)
                    {
                        if (hitInfo.rigidbody != null)
                        {
                            hitInfo.rigidbody.AddForce(-hitInfo.normal * enemyParams.attackForce);
                        }

                        Breakable hitBreakable = hitInfo.collider.gameObject.GetComponent <Breakable>();
                        if (hitBreakable)
                        {
                            hitBreakable.Impact(-hitInfo.normal * enemyParams.attackForce, enemyParams.attackDamage);
                        }

                        if ((hitInfo.transform.gameObject.layer == 0 || hitInfo.transform.gameObject.layer == 14) && enemyParams.enemyType == Enemy.EnemyType.Ranged)
                        {
                            GameObject bulletHole = Instantiate(InteractionController.instance.bulletHolePrefab, hitInfo.point - (-hitInfo.normal * 0.01f), Quaternion.LookRotation(-hitInfo.normal));
                            bulletHole.transform.parent = hitInfo.transform;
                            InteractionController.instance.bulletHoles.Add(bulletHole);
                        }

                        if (enemyParams.enemyType == Enemy.EnemyType.Melee)
                        {
                            GameVars.instance.audioManager.PlaySFX(enemyParams.attackSound, 0.8f, transform.position, "WeaponSound", 0, 0.7f);
                        }

                        //Take Damange Here If Enemy
                        if (hitInfo.transform.gameObject.layer == 12)
                        {
                            if (hitInfo.transform.parent)
                            {
                                AIController controller = hitInfo.transform.parent.gameObject.GetComponent <AIController>();
                                if (controller)
                                {
                                    controller.TakeDamage(enemyParams.attackDamage, -hitInfo.normal * enemyParams.attackForce * 10);
                                }
                            }
                        }
                        else if (hitInfo.transform.gameObject.layer == 8) //Player Damage
                        {
                            if (hitInfo.transform.parent)
                            {
                                InteractionController.instance.TakeDamage(enemyParams.attackDamage);
                            }
                        }
                    }
                    else
                    {
                        if (enemyParams.enemyType == Enemy.EnemyType.Melee)
                        {
                            if (enemyParams.missSound)
                            {
                                GameVars.instance.audioManager.PlaySFX(enemyParams.missSound, 0.8f, transform.position, "WeaponSound", 0, 0.7f);
                            }
                        }
                    }
                }
                else
                {
                    FireProjectile();
                }
            }
        }
    }
Exemplo n.º 5
0
    public IEnumerator Damage()
    {
        yield return(new WaitForSeconds(weaponParams.attackHitDelay));

        if (weaponParams.attackHitDelay > 0 && attackParticle)
        {
            Instantiate(attackParticle, transform.position, Quaternion.identity);
        }

        RaycastHit hitInfo = new RaycastHit();
        bool       rayCast = false;

        for (int i = 0; i < weaponParams.totalRoundsPerShot; i++)
        {
            if (weaponParams.weaponType != Weapon.WeaponType.Projectile)
            {
                if (weaponParams.weaponType == Weapon.WeaponType.Ranged)
                {
                    Vector3 forwardVector = Vector3.forward;
                    float   deviation     = Random.Range(0f, weaponParams.spreadMaxDivation);
                    float   angle         = Random.Range(0f, 360f);
                    forwardVector = Quaternion.AngleAxis(deviation, Vector3.up) * forwardVector;
                    forwardVector = Quaternion.AngleAxis(angle, Vector3.forward) * forwardVector;
                    forwardVector = Camera.main.transform.rotation * forwardVector;

                    rayCast = Physics.Raycast(Camera.main.transform.position, forwardVector, out hitInfo, weaponParams.attackRange, InteractionController.instance.bulletLayers);
                }
                else
                {
                    rayCast = Physics.SphereCast(Camera.main.transform.position, 0.5f, Camera.main.transform.forward, out hitInfo, weaponParams.attackRange, InteractionController.instance.punchLayers);
                }

                if (rayCast)
                {
                    if (hitInfo.rigidbody != null)
                    {
                        hitInfo.rigidbody.AddForce(-hitInfo.normal * weaponParams.attackForce);
                    }

                    Breakable hitBreakable = hitInfo.collider.gameObject.GetComponent <Breakable>();
                    if (hitBreakable)
                    {
                        hitBreakable.Impact(-hitInfo.normal * weaponParams.attackForce, weaponParams.attackDamage);
                    }

                    if ((hitInfo.transform.gameObject.layer == 0 || hitInfo.transform.gameObject.layer == 14) && weaponParams.weaponType == Weapon.WeaponType.Ranged)
                    {
                        GameObject bulletHole = Instantiate(InteractionController.instance.bulletHolePrefab, hitInfo.point - (-hitInfo.normal * 0.01f), Quaternion.LookRotation(-hitInfo.normal));
                        bulletHole.transform.parent = hitInfo.transform;
                        bulletHole.transform.GetChild(0).GetChild(0).transform.Rotate(0, 0, Random.Range(0, 360f));
                        InteractionController.instance.bulletHoles.Add(bulletHole);
                    }

                    if (weaponParams.weaponType == Weapon.WeaponType.Melee)
                    {
                        GameVars.instance.audioManager.PlaySFX(weaponParams.attackSound, 0.8f, transform.position, "WeaponSound");
                    }

                    //Take Damange Here If Enemy
                    if (hitInfo.transform.gameObject.layer == 12)
                    {
                        if (hitInfo.transform.parent)
                        {
                            AIController controller = hitInfo.transform.parent.gameObject.GetComponent <AIController>();
                            if (controller)
                            {
                                controller.TakeDamage(weaponParams.attackDamage, -hitInfo.normal * weaponParams.attackForce * 10);

                                if (!controller.isDead)
                                {
                                    GameObject bloodSplat = Instantiate(InteractionController.instance.bloodSplatPrefab, hitInfo.point - (-hitInfo.normal * 0.01f), Quaternion.LookRotation(-hitInfo.normal));
                                    InteractionController.instance.bloodSplats.Add(bloodSplat);
                                }
                            }
                        }
                    }
                }
                else
                {
                    if (weaponParams.weaponType == Weapon.WeaponType.Melee)
                    {
                        if (weaponParams.missSound)
                        {
                            GameVars.instance.audioManager.PlaySFX(weaponParams.missSound, 0.8f, transform.position, "WeaponSound");
                        }
                    }
                }
            }
            else
            {
                StartCoroutine(FireProjectile());
            }
        }
    }