1
This repository has been archived on 2025-03-15. You can view files and clone it, but cannot push or open issues or pull requests.

73 lines
2.7 KiB
C#
Raw Normal View History

2025-03-15 20:02:21 +01:00
// Copyright 2017 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using UnityEngine;
using UnityEngine.Assertions;
using System.Collections;
using System.Collections.Generic;
/// Specialized version of Pool specifically built to work with GameObjects.
///
/// GameObjects in the pool are stored underneath a container object in the scene.
/// This container is scaled to (0,0,0) to hide the pooled objects. This is done instead
/// of disabling the pooled objects to prevent an issue where disabling & enabling objects
/// will generate a large amount of memory allocations.
///
/// Additionally, when an object is returned to the pool it isn't reparented to the container
/// object until the end of the frame. This way, if the same object is borrowed again before
/// the end of the frame (a common occurence), it isn't reparented an extra time.
/// Reparenting an object can cause a significant amount of memory allocations and CPU load.
public class GameObjectPool : ObjectPool<GameObject> {
private GameObject prefab;
private GameObjectPoolController poolController;
public GameObjectPool(GameObject prefab, int capacity)
: this(prefab, capacity, 0) {
}
public GameObjectPool(GameObject prefab, int capacity, int preAllocateAmount) {
Assert.IsNotNull(prefab);
this.prefab = prefab;
GameObject poolContainerObject = new GameObject(prefab.name + " Pool");
poolController = poolContainerObject.AddComponent<GameObjectPoolController>();
poolController.Initialize(capacity);
Initialize(capacity, preAllocateAmount);
}
public override void Dispose() {
if (poolController != null) {
GameObject.Destroy(poolController.gameObject);
}
}
protected override void OnBorrowed(GameObject borrowedObject) {
poolController.OnBorrowed(borrowedObject);
}
protected override void OnPooled(GameObject pooledObject) {
poolController.OnPooled(pooledObject);
}
protected override void OnUnableToReturn(GameObject returnedObject) {
GameObject.Destroy(returnedObject);
}
protected override GameObject AllocateObject() {
GameObject obj = GameObject.Instantiate(prefab);
return obj;
}
}