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); } } }
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); } } } } }
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); }
/// <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(); } } } }
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()); } } }