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);