I am doing an IPhone shooter however i don’t want to have a shoot button is there any way or thechnique (script) you know to shoot a raycast continuously out of the players gun so that when the ray makes contact with a box around the enemy it starts shooting and the bullets in the magazine go down?
Doing this in Update may cause excessive impact in the performance, but maybe a more spaced raycasting could solve the problem - something like this (weapon script):
var bullets: int = 100; // ammo count var shotSound: AudioClip; // drag the shot sound here var shotInterval: float = 0.25; // interval between shots var shotRange: float = 100; // range of the shot var shootEnabled: boolean = true; // allows disabling the shots function Start(){ var trf = transform; // a little optimization while (true){ // loop forever if (shootEnabled && bullets > 0){ // if there are bullets and shooting enabled... var hit: RaycastHit; // do a raycast if (Physics.Raycast(trf.position, trf.forward, hit, shotRange)){ // if the enemy trigger childed to the enemy is hit... if (hit.transform.gameObject.CompareTag("EnemyTrigger")){ audio.PlayOneShot(shotSound); // play the shot sound... hit.transform.SendMessageUpwards("ApplyDamage", 5); // apply damage... bullets--; // and count the shot } } } yield WaitForSeconds(shotInterval); // always wait shotInterval } }
You must have a function ApplyDamage(damage: float) in the enemy script, and the “box” you’ve mentioned must be a trigger volume childed to the enemy.
using UnityEngine;
using System.Collections;
public class AutoShoot : MonoBehaviour
{
public float fireRate; // How quick to shoot
public float damage; // Damage to be applied
public float shootDistance; // How far to check for a hit
private bool canShoot;
void FixedUpdate ()
{
RaycastHit info;
if(Physics.Raycast(new Ray(transform.position, transform.forward), out info, shootDistance))
{
if(canShoot)
{
// Do damage stuff here
if(fireRate > 0)
{
canShoot = false;
Invoke("ShootDelay", fireRate); // Delay shooting
}
}
}
}
private void ShootDelay()
{
canShoot = true;
}
}
Here you go, i think this should work, i havent tested it though