- Home /
How to prevent object (bullet) from instantiating twice ? (It instantiates once for tapping the screen, and once more when beginning to hold touch on screen) ?
I'm trying to make my game have the option of holding down the screen for auto-firing of bullets, and if the player wants to tap the screen , the bullets should also instantiate as fast as they can tap. I have the auto-fire script set like this:
bool fire;
GunControl other;
GameObject gun;
float fireRate;
float lastShot;
void Start () {
gun = GameObject.Find("Gun"); //Finds Gun Gameobject
other = (GunControl)gun.GetComponent(typeof(GunControl)); //Get GunControl Script From Gun
fireRate = 0.25f;
lastShot = 0.0f;
}
void Update () {
if (fire == true)
{
FireRate(); //call FireRate function below
}
}
void FireRate()
{
if (Time.time > fireRate + lastShot) //if Time passed is more than fireRate set above + Seconds since last shot , fire again..
{
other.Fire();
lastShot = Time.time;
}
}
public void OnPress(bool isPressed)
{
if (enabled)
{
if (isPressed)
{
fire = true;
}
else
{
fire = false;
}
}
}
public void OnClick( )
{
// ??????????????
}
}
My question is how to prevent that first shot from calling both the fireRate function and also the OnClick at the same time... Because once I tap it shoots two bullets, but if i continue to hold on that tap it'll just do the auto-fire.
I think I got it , here's code if anyone has a similar problem:
Added FireSingle Function
bool fire;
GunControl other;
GameObject gun;
float fireRate;
float lastShot;
bool firetap;
void Start () {
gun = GameObject.Find("Gun"); //Finds Gun Gameobject
other = (GunControl)gun.GetComponent(typeof(GunControl)); //Get GunControl Script From Gun
fireRate = 0.25f;
lastShot = 0.0f;
}
void Update () {
if (fire == true)
{
FireRate(); //call FireRate function below
}
}
void FireRate()
{
if (Time.time > fireRate + lastShot && firetap == false) //if Time passed is more than fireRate set above + Seconds since last shot , fire again..
{
other.Fire();
lastShot = Time.time;
}
else
{
FireSingle();
}
}
public void OnPress(bool isPressed)
{
if (enabled)
{
if (isPressed)
{
fire = true;
}
else
{
fire = false;
}
}
}
public void OnClick( )
{
firetap = true;
}
void FireSingle()
{
if (firetap == true)
{
other.Fire();
firetap = false;
lastShot = Time.time;
}
}
}
Answer by SoulRider · Oct 14, 2017 at 12:49 PM
Generally you want to know when a button has been released for firing purposes, so you would trigger your initial bullet when the button is released. This enables you to do your auto fire, and the block the OnRelease from firing a bullet if you don't want that to happen.
Psuedocode:
Update(){
if not button.waspressedlastframe and button.ispressedthisframe
lastShot = 0f;
if button.waspressedlastframe and button.ispressedthisframe
if lastshot + firedelay < time
fire;
lastshot = time;
if button.waspressedlastframe and not pressedthisframe
if lastshot = 0f
fire;
}
Your answer
Follow this Question
Related Questions
Having code fire once in update function? 2 Answers
Calling a variable 2 Answers
calling function once? 3 Answers
Use Instantiated clone in the next function in same class 1 Answer