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 DrumColby · Nov 22, 2021 at 04:49 PM · pooling

Objects disappear when enabled

I'm using a generic object pool script. It works great for shooting bullets, but doesn't work correctly when spawning enemies at timed intervals. I'm using both with the animator and using the event system to return the objects to the pool queue.

Both work fine when OnBecameInvisible() is called. It's only when I shoot the enemy and OnTriggerEnter() is called that the pooling doesn't work and they disappear.

Any help would be appreciated!

 public abstract class GenericObjectPool<T> : MonoBehaviour where T : Component
 {
     [SerializeField] private T prefab;
     [SerializeField] private int objectCount;
 
     public static GenericObjectPool<T> Instance { get; private set; }
     private Queue<T> objects = new Queue<T>();
 
     private void Awake()
     {
         Instance = this;
         AddObjects(objectCount);
     }
 
     public T Get()
     {
         return objects.Dequeue();
     }
 
     public void ReturnToPool(T objectToReturn)
     {
         objectToReturn.gameObject.SetActive(false);
         objects.Enqueue(objectToReturn);
     }
 
     private void AddObjects(int count)
     {
         for (int i = 0; i < count; i++)
         {
             var newObject = GameObject.Instantiate(prefab);
             newObject.gameObject.SetActive(false);
             objects.Enqueue(newObject);
         }
     }
 }

public class Enemy01Pooled : MonoBehaviour { [SerializeField] int startHealth; private int health; public int pointValue; bool isDead; Animator animator; [SerializeField] AudioSource deathAudio;

 private void OnEnable()
 {
     animator = GetComponent<Animator>();
     animator.SetBool("isDead", false);
     health = startHealth;
     isDead = false;
 }

 private void OnTriggerEnter2D(Collider2D collision)
 {
     health--;

     if (health <= 0)
     {
         isDead = true;
     }
 }

 private void Update()
 {
     if (isDead)
     {
         deathAudio.Play();
         Score.Instance.AddPoints(pointValue);
         animator.SetBool("isDead", true);
         isDead = false;
     }
 }

 private void OnBecameInvisible()
 {
     Die();
 }

 public virtual void Die()
 {
     Enemy01Pool.Instance.ReturnToPool(this);
 }

 public virtual void KillAll()
 {
     Score.Instance.AddPoints(pointValue);
     Enemy01Pool.Instance.ReturnToPool(this);
 }

}

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 DrumColby · Nov 21, 2021 at 12:59 PM 0
Share

Here is the code for the spawner.`public class EnemySpawner : MonoBehaviour { [SerializeField] float spawnDelay; [SerializeField] float spawnTimer; [SerializeField] int totalEnemies; [SerializeField] float groupIntervalTimer; [SerializeField] float groupTime; [SerializeField] int numberOfSquadronsSpawned = 0; [SerializeField] float[] spawnGroupTimes; [SerializeField] bool readyToSpawn;

 void Start()
 {
     groupTime = spawnGroupTimes[0];
 }

 void Update()
 {
     groupIntervalTimer += Time.deltaTime;

     if (!readyToSpawn && groupIntervalTimer >= groupTime)
     {
         numberOfSquadronsSpawned++;
         GroupTimer();
     }

     else if (readyToSpawn && spawnTimer <= 0 && totalEnemies > 0)
     {
         Spawn();
         spawnTimer = spawnDelay;
         totalEnemies--;
     }

     else if (readyToSpawn && totalEnemies > 0)
     {
         spawnTimer -= Time.deltaTime;
     }

     else if (readyToSpawn && totalEnemies <= 0)
     {
         readyToSpawn = false;
         if (numberOfSquadronsSpawned >= spawnGroupTimes.Length)
         {
             gameObject.SetActive(false);
         }
     }
 }

 public virtual void Spawn()
 {
     var spawn = Enemy01Pool.Instance.Get();
     if (spawn == null) return;
     spawn.transform.position = transform.position;
     spawn.transform.rotation = transform.rotation;
     spawn.gameObject.SetActive(true);
 }

 void GroupTimer() //set readyToSpawn to true when we reach next spawnGroupTime
 {
     totalEnemies = 6;
     readyToSpawn = true;
     if (numberOfSquadronsSpawned < spawnGroupTimes.Length)
     {
         groupTime = spawnGroupTimes[numberOfSquadronsSpawned];
     }
 }

}`

avatar image DrumColby · Nov 21, 2021 at 07:02 PM 0
Share

It looks like the objects are getting disabled as they are re-spawned. Only after they are killed, it works fine when they go off screen and OnBecameInvisible() is called. I thought it was something with the animator, but i cant figure out what. I was calling the Die() method through the animation events tool.

0 Replies

· Add your reply
  • Sort: 

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

129 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Why do my first few collectable/powerup collisions cause lag but not later ones? 1 Answer

Game "hiccups" when pooled game objects are used for the first time. 0 Answers

How to despawn from another script (PoolManager) 0 Answers

Why am I spawning a ton of prefabs in one area? 2 Answers

How Increase And Decrease And Reset Spawn Rate Over 0 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