so i have a gun script and a custom bullet script does any one know how i can make a damage system like the enemy will have 100 health and not a one shot
this is the gun script
//bullet force
public float shootForce, upwardForce;
//Gun stats
public float timeBetweenShooting, spread, reloadTime, timeBetweenShots;
public int magazineSize, bulletsPerTap;
public bool allowButtonHold;
int bulletsLeft, bulletsShot;
//Recoil
public Rigidbody playerRb;
public float recoilForce;
//bools
bool shooting, readyToShoot, reloading;
//Reference
public Camera fpsCam;
public Transform attackPoint;
//Graphics
public GameObject muzzleFlash;
public TextMeshProUGUI ammunitionDisplay;
//bug fixing :D
public bool allowInvoke = true;
private void Awake()
{
//make sure magazine is full
bulletsLeft = magazineSize;
readyToShoot = true;
}
private void Update()
{
MyInput();
//Set ammo display, if it exists :D
if (ammunitionDisplay != null)
ammunitionDisplay.SetText(bulletsLeft / bulletsPerTap + " / " + magazineSize / bulletsPerTap);
}
private void MyInput()
{
//Check if allowed to hold down button and take corresponding input
if (allowButtonHold) shooting = Input.GetKey(KeyCode.Mouse0);
else shooting = Input.GetKeyDown(KeyCode.Mouse0);
//Reloading
if (Input.GetKeyDown(KeyCode.R) && bulletsLeft < magazineSize && !reloading) Reload();
//Reload automatically when trying to shoot without ammo
if (readyToShoot && shooting && !reloading && bulletsLeft <= 0) Reload();
//Shooting
if (readyToShoot && shooting && !reloading && bulletsLeft > 0)
{
//Set bullets shot to 0
bulletsShot = 0;
Shoot();
}
}
private void Shoot()
{
readyToShoot = false;
//Find the exact hit position using a raycast
Ray ray = fpsCam.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0)); //Just a ray through the middle of your current view
RaycastHit hit;
//check if ray hits something
Vector3 targetPoint;
if (Physics.Raycast(ray, out hit))
targetPoint = hit.point;
else
targetPoint = ray.GetPoint(75); //Just a point far away from the player
//Calculate direction from attackPoint to targetPoint
Vector3 directionWithoutSpread = targetPoint - attackPoint.position;
//Calculate spread
float x = Random.Range(-spread, spread);
float y = Random.Range(-spread, spread);
//Calculate new direction with spread
Vector3 directionWithSpread = directionWithoutSpread + new Vector3(x, y, 0); //Just add spread to last direction
//Instantiate bullet/projectile
GameObject currentBullet = Instantiate(bullet, attackPoint.position, Quaternion.identity); //store instantiated bullet in currentBullet
//Rotate bullet to shoot direction
currentBullet.transform.forward = directionWithSpread.normalized;
//Add forces to bullet
currentBullet.GetComponent().AddForce(directionWithSpread.normalized * shootForce, ForceMode.Impulse);
currentBullet.GetComponent().AddForce(fpsCam.transform.up * upwardForce, ForceMode.Impulse);
//Instantiate muzzle flash, if you have one
if (muzzleFlash != null)
Instantiate(muzzleFlash, attackPoint.position, Quaternion.identity);
bulletsLeft--;
bulletsShot++;
//Invoke resetShot function (if not already invoked), with your timeBetweenShooting
if (allowInvoke)
{
Invoke("ResetShot", timeBetweenShooting);
allowInvoke = false;
//Add recoil to player (should only be called once)
playerRb.AddForce(-directionWithSpread.normalized * recoilForce, ForceMode.Impulse);
}
//if more than one bulletsPerTap make sure to repeat shoot function
if (bulletsShot < bulletsPerTap && bulletsLeft > 0)
Invoke("Shoot", timeBetweenShots);
}
private void ResetShot()
{
//Allow shooting and invoking again
readyToShoot = true;
allowInvoke = true;
}
private void Reload()
{
reloading = true;
Invoke("ReloadFinished", reloadTime); //Invoke ReloadFinished function with your reloadTime as delay
}
private void ReloadFinished()
{
//Fill magazine
bulletsLeft = magazineSize;
reloading = false;
}
}
this is the custom bullet public class CustomBullet : MonoBehaviour
{
//Assignables
public Rigidbody rb;
public GameObject explosion;
public LayerMask whatIsEnemies;
//Stats
[Range(0f,1f)]
public float bounciness;
public bool useGravity;
//Damage
public int explosionDamage;
public float explosionRange;
public float explosionForce;
//Lifetime
public int maxCollisions;
public float maxLifetime;
public bool explodeOnTouch = true;
int collisions;
PhysicMaterial physics_mat;
private void Start()
{
Setup();
}
private void Update()
{
//When to explode:
if (collisions > maxCollisions) Explode();
//Count down lifetime
maxLifetime -= Time.deltaTime;
if (maxLifetime <= 0) Explode();
}
private void Explode()
{
//Instantiate explosion
if (explosion != null) Instantiate(explosion, transform.position, Quaternion.identity);
//Check for enemies
Collider[] enemies = Physics.OverlapSphere(transform.position, explosionRange, whatIsEnemies);
for (int i = 0; i < enemies.Length; i++)
{
//Get component of enemy and call Take Damage
//Just an example!
///enemies[i].GetComponent().TakeDamage(explosionDamage);
//Add explosion force (if enemy has a rigidbody)
if (enemies[i].GetComponent())
enemies[i].GetComponent().AddExplosionForce(explosionForce, transform.position, explosionRange);
}
//Add a little delay, just to make sure everything works fine
Invoke("Delay", 0.05f);
}
private void Delay()
{
Destroy(gameObject);
}
private void OnCollisionEnter(Collision collision)
{
//Don't count collisions with other bullets
if (collision.collider.CompareTag("Bullet")) return;
//Count up collisions
collisions++;
//Explode if bullet hits an enemy directly and explodeOnTouch is activated
if (collision.collider.CompareTag("Enemy") && explodeOnTouch) Explode();
}
private void Setup()
{
//Create a new Physic material
physics_mat = new PhysicMaterial();
physics_mat.bounciness = bounciness;
physics_mat.frictionCombine = PhysicMaterialCombine.Minimum;
physics_mat.bounceCombine = PhysicMaterialCombine.Maximum;
//Assign material to collider
GetComponent().material = physics_mat;
//Set gravity
rb.useGravity = useGravity;
}
/// Just to visualize the explosion range
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, explosionRange);
}
}
thanks for your time.
↧