——个人学习笔记

对象池的使用原理,就是把一些类似的物体一次性生成一堆,然后设置未激活状态,然后使用就激活,不适用就放回对象池,再次设置未激活。能使用范围就是,要频繁地删除生成的对象。
  • Gamemanager.cs(使用单例模式,可以看我的单例模式笔记,使用常用的那种泛型就行了,https://blog.csdn.net/weixin_43701019/article/details/90616323) ,下面以Tile对象池做例子,(新手tips:可能一下子放出太多代码会对新手不习惯,建议可以先看Start,看到调用了,在去找方法,然后方法开头的注释,自己画画逻辑。)
public class GameManager : MonoSingleton<GameManager>//单例模式(泛型)
{//Tile池子public Queue<GameObject> tilePool=new Queue<GameObject>();//TilePrefab,(使用的时候更改Sprite就行)public GameObject tilePrefab;//生成对象的父位置public Transform tileParent;//可以手动设置属性public GameSetting Advance;//对象池里的对象数量 int initialSize = 60;//总权值float totalSum =0;//Y的位置float currentY = -5.0f;protected override void Awake(){base.Awake();}   void Start(){//获取权值GetAllWeight();//初始化对象池GenerateTilePoll();//激活对象池里的所有Tile物体for (int i = 0; i < initialSize; i++){GenerateTile();}}/// 获取权值 void GetAllWeight(){float sum = 0;sum += Advance.normalTile.weight;totalSum = sum;}/// tile对象池的生成 ,相当于初始化对象池void GenerateTilePoll(){for (int i = 0; i < initialSize; i++){GameObject go = GameObject.Instantiate(tilePrefab,tileParent);go.SetActive(false);            tilePool.Enqueue(go);}}///生成随机砖块,其实是激活对象池的一个对象。void GenerateTile(){//获取对象GameObject go = GetInactiveObject(ObjectType.Tile);//随机砖块类型float rand = Random.Range(0, totalSum);//获取这个值是哪个类型的砖块int randNumber = SetTileByRandomNumber(rand);//随机位置Vector2 pos = new Vector2(Random.Range(-4.0f, 4.0f), currentY);switch(randNumber){case 0:go.transform.position = pos;currentY += Random.Range(Advance.normalTile.minHeight, Advance.normalTile.maxHeight);go.name = "0";go.SetActive(true);break;default:break;}}//从池子取物体 ,public GameObject GetInactiveObject(ObjectType type){switch(type){case ObjectType.Tile:return tilePool.Dequeue();default:return null;}}//这个就是把所有权值加起来然后看现在随机数是在哪个范围,即是现在随机到了哪个Tileint SetTileByRandomNumber(float number){if (number <= Advance.normalTile.weight)return 0;//类似这样继续//else if(number<=Advance.normalTile.weight+下一个类型.weight)//return 1;return -1;}/// 回收Tile    会调用CreateTile来实现循环   public void AddInActiveObjectToPool(GameObject go,ObjectType type){go.SetActive(false);switch(type){case ObjectType.Tile:tilePool.Enqueue(go);CreateTile();break;default:break;}}//重新利用Tile,实现无限循环,为啥要写多一个方法出来,是因为可能要做其他操作//比如,在Tile上是否要生成道具之类的void CreateTile(){GenerateTile();//TODO      }}
  • 一个对象池的对象类型
//这个是一个对象有什么类型,用来设置这些类型各自属性的。
[Serializable]
public class GameSetting   {//NormalTile类型,还有其他Tile类型在下面继续添加,并且声明一个变量。[Serializable]public class NormalTile{//生成上下间隔最小值public float minHeight;//生成上下间隔最大值public float maxHeight;//权值,生成几率public float weight;}public NormalTile normalTile;
}
  • 所有对象池枚举
//所有对象池类型,即是有什么对象池。
public enum ObjectType
{Tile,
}
  • Tile.cs
public class Tile : MonoBehaviour {//Tiletype的类型,由名字获取,这个要在生成对象的使用根据类型来命名int  tileType;//所有类型的sprite,可以根据类型来更换public Sprite[] sprites;SpriteRenderer sp;//每次激活调用,不要放在Start中,因为对象只在第一次实例出来,后面都是把//其setactive设置false和true来实现回收和使用void OnEnable () {init();}void init(){sp = GetComponent<SpriteRenderer>();tileType = int.Parse(gameObject.name);switch(tileType){case 0:sp.sprite = sprites[0];break;default:break;}}//回收void Update() {//floor就是 相机底部if (GameManager.Instance.floor.position.y > transform.position.y + 1){GameManager.Instance.AddInActiveObjectToPool(gameObject, ObjectType.Tile);}}     }

  1. Tile的实现下面可以穿透,上面不可以,可以参考(使用组件Platform Effector 2D)
  2. 也可以使用Trigger,对比Y,在如果玩家在Tile上方触发就把Player的Rigibody 2D的速度设置向上。

这要看自己实现什么效果,如果自动跳就用第二种;若是要按一个按钮才跳跃就要用第一种


  • 背景设置
    这类游戏会采取镜头一直向上移动,然后Tile到相机底部,就会被回收。那么背景正常情况一段时间后就会不见了。
    对了,两个相机(一个main,一个bg的,可以直接复制main然后删除了Listener(这样不会报两个相机的错误))可以解决,先把背景layer设为water(可以自己add一个名字,我懒),然后把bg的设置一下遮掩layer,把背景图放在其下面。主相机要设置为深度模式,其实有点2D3D混合了,图示:

  • 背景图设置

  • BG相机设置

  • 主相机设置

  • 各游戏物体摆放位置


有大佬发现错误,请纠正,初学者一枚,有不懂的可以问。

实现类似涂鸦跳跃的游戏(对象池的使用和背景固定)相关推荐

  1. 【Unity】游戏对象池ObjectPool

    游戏引擎:Unity 版本:2019.4.6f1 [2017版本以上均可] 编译平台:Visual Studio 2019   前要   在开发过程中,很多时候会出现针对某一GameObject的频繁 ...

  2. 用c++写的 涂鸦跳跃 小游戏

    源码下载地址请留言 涂鸦跳跃 c++

  3. 池式结构:对象池(Object Pool)

    本文是对 http://gameprogrammingpatterns.com/object-pool.html 的原创翻译.部分地方使用意译,不准确的地方请各位指证. 一.对象池的意义 通过重新使用 ...

  4. Unity 2.Space Shooter(碰撞器Collider,WebGL,刚体中属性,(定时)实例化、销毁游戏对象,触碰OnTriggerEnter/Exit,爆炸效果,音频,文字,定时调方法)

    目录 项目介绍 WebGL发布 游戏对象设置 灯光.相机 背景 移动游戏对象 Debug 制作子弹 射击动作 清理离开边界的游戏对象 制作危险物 添加爆炸,移动小行星,作为预制件 创建游戏控制器 循环 ...

  5. 9.Unity2D 横版 简单AI 之 敌人跳跃条件优化+自动范围内检测敌人发起攻击(索敌)+对象池优化+主角受伤死亡

    总目录https://blog.csdn.net/qq_54263076/category_11900070.html?spm=1001.2014.3001.5482 1.动画animation和动画 ...

  6. 游戏物体复用:对象池(以Unity3D为例)

    需要解决/优化的问题: 在Unity3D中,实例化物体和销毁物体是都非常消耗性能的,小项目可能没问题的,但是一旦有大量的物体在短时间内需要销毁或者创建,那么游戏就会变得巨卡,如果是手游你的手机还会变烫 ...

  7. 游戏设计模式阅读笔记18——优化模式(对象池模式)

    目录 一.意图 二.动机 三.对象池模式 四.实例代码 五.注意 1.对象和池耦合的问题 一.意图 放弃单独地分配和释放对象,从固定的池中重用对象,以提高性能和内存使用率. 二.动机 比如粒子系统的调 ...

  8. Unity3D游戏开发之类对象池优化秘籍残篇

    翻开秘籍第一页: 问: 什么是类对象池? 剑之初: 游戏中,我们常常会遇到频繁得创建和销毁大量相同对象的场景.如果我们不做任何的特殊处理,这种场景会出现两个性能问题--大量的内存碎片以及频繁的分配内存 ...

  9. 【游戏开发实战】Unity循环复用列表,支持不规则尺寸(对象池 | UGUI | ScrollRect | Demo源码)

    文章目录 一.前言 二.使用方法 1.创建Scroll View 2.设置Scroll View参数 2.1.调整宽高 2.2.删除Scrollbar滑块 2.3.设置item模板: Item Tem ...

最新文章

  1. 青少年编程竞赛交流群第048次活动录播
  2. mass Framework在后端的核心模块
  3. MySQL 5.1.24rc + innodb plugin尝鲜
  4. java 获取打印机缺纸_第三章软件
  5. Oracle EBS PO 接受入库
  6. 3D卷积GAN飞起!微软“可缩放”新框架只需2D数据即可生成逼真3D模型
  7. 前端优化,包括css,jss,img,cookie
  8. 【转】MOTION CAPTURE动作捕捉系统模块
  9. java开发常用的linux命令,Java开发中最常用的Linux命令整理
  10. 微软企业库4.1学习笔记(十六)缓存模块4 服务器场中的缓存使用
  11. 云服务器 性能测试之web压力测试
  12. matlab直线的程序,MATLAB|辅助直线绘制程序
  13. c语言编程求广义逆矩阵,求大神解答求广义逆矩阵的问题 拜谢了!!
  14. android开发中常用的占位符
  15. 微软服务器登录不上,微软账号无法登录怎么办
  16. 一款消消乐游戏的自动解法
  17. 隐式内联函数和显式内联函数
  18. 【数学建模】灰色关联(Matlab代码实现)
  19. 位置型PID增量型PID调节直流电机
  20. 推断统计python化(参数估计,假设检验与 t检验)

热门文章

  1. 基于电影爬虫及Spark数据分析可视化设计
  2. DDTW 导数动态时间规整算法
  3. jenkins配置自动部署java程序
  4. SEO快排的行业秘密,原来SEO快排套路这么深
  5. B.TMT Document (思维分析)
  6. 2个JS版的MD5加密脚本
  7. 恶搞版西游记,99%的人看完后当场含笑而死
  8. 精通 CSS+DIV 网页样式与布局 54
  9. 【广告投放】名称概念
  10. K8S 集群部署(快速部署一个 K8S 集群)