ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-04 20:32:40  阅读:175  来源: 互联网

标签:obj 游戏 BulletFactory 对象 物体 System Collections using public


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

标签:obj,游戏,BulletFactory,对象,物体,System,Collections,using,public
来源: https://blog.csdn.net/qq_41000235/article/details/117572300

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有