简单游戏物体对象池的实现

ObjectPool

ObjectPool使用Stack来存取游戏对象,当栈为空时,向BulletFactory请求生成新的对象。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// IPool
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IPool<T> 
{
    /// <summary>
    /// 回收对象
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    void Recyle(T obj);
    /// <summary>
    /// 分配对象
    /// </summary>
    /// <returns></returns>
    T Allocate() ;
}
public abstract class MyPool<T> : IPool<T>
{
    protected IFactory factory=null;
    protected readonly Stack<T> cacheStack = new Stack<T>();
    public virtual T Allocate()
    {
        return default(T);
    }
    public abstract void Recyle(T obj);
}
/// <summary>
/// 游戏物体对象池
/// </summary>
/// <typeparam name="T"></typeparam>
public class ObjectPool<T> : MyPool<T> where T : Object
{
    object objs=new object();
    public ObjectPool(IFactory factory) {
        this.factory = factory;
    }
    public override T Allocate()
    {
        lock (objs)
        {
            return cacheStack.Count == 0 ? factory.Create<T>() : cacheStack.Pop(); 
        }
    }
    public override void Recyle(T obj)
    {
        lock (objs) {
            cacheStack.Push(obj);
        }
    }
}

IFactory

定义生成重复物体的接口

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 生成器接口
/// </summary>
public interface IFactory
{
    T Create<T>() where T : Object;
    void Reset();
}

BulletFactory

子弹的生成和分配

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 子弹生成器
/// </summary>
public class BulletFactory : MonoSingleton<BulletFactory>, IFactory  
{
    public IPool<GameObject> objectPool = null;
    GameObject obj=null;
    public T Create<T>() where T : Object
    {
        if(obj==null)obj= Resources.Load("Role/Bullet") as GameObject;
        Object bullet=  GameObject.Instantiate(obj, new Vector3(0, 0, 0), Quaternion.identity) as Object;
        return (T)(bullet);
    }
    /// <summary>
    /// 生成bulletcount个子弹
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="targetPos"></param>
    /// <param name="bulletCount"></param>
    /// <returns></returns>
    public void CreateBullet( Vector3 targetPos, int bulletCount)
    {
        if (bulletCount <= 0) { return; }
        if (objectPool == null) objectPool = new ObjectPool<GameObject>(this);
        //从对象池中取bulletCount个子弹
        for (int i = 0; i < bulletCount; i++)
        {
            GameObject bullet = objectPool.Allocate();
            bullet.transform.position = targetPos;//设置起始点
        }
    }
    public void Reset()
    {
        
    }
}

调用BulletFactory 生成若干个子弹

 BulletFactory.Instance.CreateBullet(transform.position, bulletCount);

子弹的回收

BulletFactory.Instance.objectPool.Recyle(gameObject);
上一篇:Python-Collections模块之NameTuple


下一篇:Hashtable,ConcurrentHashMap与Collections.synchronizedMap关键源码