mirror of
				https://github.com/DerTyp7/defrain-shooter-unity.git
				synced 2025-11-03 22:58:59 +01:00 
			
		
		
		
	Grenade data is now on Grenade.cs and not on Weapon.cs. You need both scripts to make a grenade work
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
public class Grenade : MonoBehaviour
 | 
						|
{
 | 
						|
 | 
						|
    [Header("Grenade Info")]
 | 
						|
    [SerializeField] float timer = 2f;
 | 
						|
    [SerializeField] float explosionForce = 500f;
 | 
						|
    [SerializeField] float grenadeRadius = 3f;
 | 
						|
    [SerializeField] bool hasExploded = false;
 | 
						|
    private float countdown;
 | 
						|
 | 
						|
    [Header("Explosion GameObject")]
 | 
						|
    [SerializeField] GameObject explodeParticle;
 | 
						|
    
 | 
						|
    [Header("Scripts")]
 | 
						|
    [SerializeField] Weapon weapon; 
 | 
						|
 | 
						|
    [Header("Debug")]
 | 
						|
    [SerializeField] bool showExplosion = true;
 | 
						|
 | 
						|
    void Start() {
 | 
						|
        countdown = timer;
 | 
						|
    }
 | 
						|
 | 
						|
    void Update() {
 | 
						|
        // If grenade has been thrown and countdown is over 0 and grenade has not exploded yet
 | 
						|
        if (weapon.HasBeenThrown && !hasExploded) {
 | 
						|
            // Decrease timer by 1 second
 | 
						|
            countdown -= Time.deltaTime;
 | 
						|
            // If countdown get to 0... BOOM!:
 | 
						|
            if(countdown <= 0) {
 | 
						|
                // Lets grenade explode
 | 
						|
                Explode();
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /* - Spawn explosion particles and add force to nearby objects - */
 | 
						|
    private void Explode() {
 | 
						|
        if (showExplosion)
 | 
						|
        {
 | 
						|
            // Spawns explosion particle
 | 
						|
            GameObject spawnedExplosion = Instantiate(explodeParticle, transform.position, transform.rotation);
 | 
						|
            // Destroys explosion particle after on second
 | 
						|
            Destroy(spawnedExplosion, 1);
 | 
						|
        }
 | 
						|
        
 | 
						|
 | 
						|
        // Gets all collider that are in a sphere around the grenade
 | 
						|
        Collider[] colliders = Physics.OverlapSphere(transform.position, grenadeRadius);
 | 
						|
        // Iterate over all colliders found in radius
 | 
						|
        foreach(Collider nearbyObject in colliders) {
 | 
						|
            // Check if nearby object is a Player and if Collider is not a CharacterController (can be changed to CapsuleCollider)
 | 
						|
            if (nearbyObject.transform.gameObject.GetComponent<Player>() && nearbyObject.GetType() != typeof(UnityEngine.CharacterController)) {
 | 
						|
                // Remove health from player
 | 
						|
                nearbyObject.transform.gameObject.GetComponent<Player>().RemoveHealth(weapon.Damage);
 | 
						|
            } else {
 | 
						|
                // Get Rigidbody from nearby object and...
 | 
						|
                Rigidbody rb = nearbyObject.GetComponent<Rigidbody>();
 | 
						|
                // if rigidbody exists...
 | 
						|
                if (rb != null) {
 | 
						|
                    // adds force to nearby objects
 | 
						|
                    rb.AddExplosionForce(explosionForce, transform.position, grenadeRadius);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        hasExploded = true;
 | 
						|
        // Destroys grenade
 | 
						|
        Destroy(gameObject);
 | 
						|
    }
 | 
						|
}
 |