Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by L Maxwell · Apr 11, 2015 at 08:52 AM · instantiatedestroyyieldwaitforsecondsienumerator

Instantiate an object as soon as another object is destroyed

So I want the NewShield() method to be called right after the LargeShieldClone object is destroyed.

What usually ends up happening is that NewShield() is called at the same time as WaitAndDestroy().

I've tried everything I can think of. Any ideas? Thanks.

using UnityEngine;

using System.Collections;

public class LargeShieldInstantiate : MonoBehaviour {

 public GameObject Shield;
 GameObject ShieldClone;
 public GameObject LargeShield;
 GameObject LargeShieldClone;
 int secondsBeforeDestruction = 10;

 void OnCollisionEnter2D(Collision2D collider){
     if(collider.gameObject.tag == "LSPowerup"){
         Destroy (this.gameObject);
         LargeShieldClone = Instantiate (LargeShield) as GameObject;
         LargeShieldClone.transform.parent = GameObject.Find ("ShieldRotator").transform;
         WaitAndDestroy ();
     }
 }

 IEnumerator WaitAndDestroy(){
     Destroy (LargeShieldClone, secondsBeforeDestruction);
     yield return new WaitForSeconds (10);
     NewShield ();
 }

 void NewShield(){
     ShieldClone = Instantiate (Shield) as GameObject;
     ShieldClone.transform.parent = GameObject.Find ("ShieldRotator").transform;
 }

}

Comment
Add comment · Show 2
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Tehnique · Apr 11, 2015 at 08:56 AM 0
Share

Are you sure NewShield() is called at the same time as WaitAndDestroy()? Or is NewShield() called at the same time with Destroy (LargeShieldClone)?

avatar image meat5000 ♦ · Apr 11, 2015 at 05:42 PM 0
Share

Perhaps StartCoroutine ins$$anonymous$$d of simply calling the function.

2 Replies

· Add your reply
  • Sort: 
avatar image
0

Answer by Digital-Phantom · Apr 11, 2015 at 09:43 AM

swap round these two lines -

 Destroy (LargeShieldClone, secondsBeforeDestruction);
      yield return new WaitForSeconds (10);
 
 

because the way you have it now you are waiting 10 seconds after its destroyed before calling NewShield()

edit - Also you could even lose the NewShield() and put the commands inside it directly after the lines that destroys your object.

;)

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image L Maxwell · Apr 11, 2015 at 05:35 PM 0
Share

Thanks, Phantom.

I seem to also have an issue with calling the WaitAndDestroy() method. I think c# needs it to be a void ins$$anonymous$$d of an IEnumerator. However I can't use WaitForSeconds() in a void. Do you know any way around this?

avatar image
0

Answer by fafase · Apr 11, 2015 at 05:44 PM

Use OnDestroy on the destroyed object:

 public class MyObject:MonoBehaviour{
     public static event Action OnObjectDestroy = ()=>{};
     void OnDestroy(){
        OnObjectDestroy();
     }
 }

This goes on a script that you attached to your object.

And then:

 public class LargeShieldInstantiate : MonoBehaviour {
 
     void Awake(){
         MyObject.OnObjectDestroy += NewShield;
     }
     void OnDestroy(){
         MyObject.OnObjectDestroy -= NewShield;
     }
 }
Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

5 People are following this question.

avatar image avatar image avatar image avatar image avatar image

Related Questions

Yeild and WaitForSeconds and Instantiate 1 Answer

Destroy then Clone Help please? 2 Answers

Only the first half of my coroutine works 1 Answer

How can I instantiate and move objects smoothly? 1 Answer

Respawn after delay 3 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges