- Home /
boolean problem
I want to let when my plane touches the powerbox, the powerbox disappears, and the ammo will shoot according to the motion of the plane. However, if I type destroy(gameObject), the function will only destroy the gameobject and the ammo will not shoot. When I delete destroy(gameObject), the powerbox will not be destroyed. But the ammo will only shoot on one side and will not shoot according to the motion of the plane. I have tried so long.
void Update()
{
gameObject.transform.position += new Vector3(0, -0.02f, 0);
ammo2time += Time.deltaTime;
if (hitpowerbox == true)
{
if (ammo2time > 0.30f)
{
Vector3 ammo2_pos = Ship.transform.position + new Vector3(2, 0.1f, 0);
Instantiate(ammo2, ammo2_pos, Ship.transform.rotation);
ammo2time = 0;
}
else
{ }
}
}
void OnTriggerEnter2D(Collider2D col)
{
if (col.tag == "plane")
{
hitpowerbox = true;
}
Destroy(gameObject);
}
It seems, as has been mentioned in a previous answer to your question, you're (for starters) destroying the object before it gets a chance to do anything in the next Update.
put the hitpowerbox field on another script on the plane with the update logic ins$$anonymous$$d of the bullet then in ur on trigger enter u can get the plane script using GetComponent and then set hitpowerbox = true on that script.
it cannot work properly
spawnammo script public bool hitpowerbox = false; public GameObject Ship; public GameObject ammo2; public float ammo2time; void Update() { ammo2time += Time.deltaTime; if (hitpowerbox == true) {
Vector3 ammo2_pos = Ship.transform.position + new Vector3(2, 0.1f, 0);
Instantiate(ammo2, ammo2_pos, Ship.transform.rotation);
ammo2time = 0;
}
}
}
bonusammo script void Update() { gameObject.transform.position += new Vector3(0, -0.02f, 0);
}
void OnTriggerEnter2D(Collider2D col)
{
if (col.tag == "plane")
{
GetComponent<spawnammo>();
hitpowerbox = true;
Object.Destroy(gameObject, 0.1f);
}
}
}
it is not work.
And delay the destriy function?
public static void Destroy(Object obj, float t = 0.0F);
So
Destroy (Object, 3);
to delay it 3 seconds
Also, when the plane touches the box, it just only shoots a group of ammo and that's all. However, I want the ammo will keep shooting in front of the plane. Plz help me.
void Update() { gameObject.transform.position += new Vector3(0, -0.02f, 0);
ammo2time += Time.deltaTime;
if (hitpowerbox == true )
{
Vector3 ammo2_pos = Ship.transform.position + new Vector3(2, 0.1f, 0);
Instantiate(ammo2, ammo2_pos, Ship.transform.rotation);
ammo2time = 0;
}
}
void OnTriggerEnter2D(Collider2D col)
{
if (col.tag == "plane")
{
hitpowerbox = true;
Object.Destroy(gameObject,0.1f);
}
}
}
If you just do what I said you'd have your result :)
Answer by Bonfire-Boy · Feb 05, 2020 at 06:41 PM
As others have said, you're destroying the object as soon as it's hit, and before it has a chance to spawn the bullet.
So you want to move the Destroy call to after the ammo is spawned. I would do this in a coroutine, that makes it much easier to implement your delay, and keeps your Update function cleaner (ie it only contains things that happen on every frame).
I'm not 100% sure this gives you what you want as it's not clear what object your script is on or what "Ship" is, but it'd look something like this....
Coroutine hitCoroutine;
void IEnumerator HandleHit()
{
yield return WaitForSeconds(0.3f);
Vector3 ammo2_pos = Ship.transform.position + new Vector3(2, 0.1f, 0);
Instantiate(ammo2, ammo2_pos, Ship.transform.rotation);
Destroy(gameObject);
}
void OnTriggerEnter2D(Collider2D col)
{
if (col.tag == "plane")
{
if (hitCoroutine == null) // this is to ensure that it only happens once
{
hitCoroutine = StartCoroutine(HandleHit());
}
}
}
void Update()
{
gameObject.transform.position += new Vector3(0, -0.02f, 0);
}
Your answer
Follow this Question
Related Questions
how do i delete a stupid question? 1 Answer
Maya export to unity error 0 Answers
Attempt at re-arranging list results in crash 1 Answer
input axis gas pedal is not steup unity 0 Answers
Orbit problem in 5.0 unity 1 Answer