实现类似涂鸦跳跃的游戏(对象池的使用和背景固定)
——个人学习笔记
对象池的使用原理,就是把一些类似的物体一次性生成一堆,然后设置未激活状态,然后使用就激活,不适用就放回对象池,再次设置未激活。能使用范围就是,要频繁地删除生成的对象。
- 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);}} }
- Tile的实现下面可以穿透,上面不可以,可以参考(使用组件Platform Effector 2D)
- 也可以使用Trigger,对比Y,在如果玩家在Tile上方触发就把Player的Rigibody 2D的速度设置向上。
这要看自己实现什么效果,如果自动跳就用第二种;若是要按一个按钮才跳跃就要用第一种
背景设置
这类游戏会采取镜头一直向上移动,然后Tile到相机底部,就会被回收。那么背景正常情况一段时间后就会不见了。
对了,两个相机(一个main,一个bg的,可以直接复制main然后删除了Listener(这样不会报两个相机的错误))可以解决,先把背景layer设为water(可以自己add一个名字,我懒),然后把bg的设置一下遮掩layer,把背景图放在其下面。主相机要设置为深度模式,其实有点2D3D混合了,图示:背景图设置
BG相机设置
主相机设置
各游戏物体摆放位置
有大佬发现错误,请纠正,初学者一枚,有不懂的可以问。
实现类似涂鸦跳跃的游戏(对象池的使用和背景固定)相关推荐
- 【Unity】游戏对象池ObjectPool
游戏引擎:Unity 版本:2019.4.6f1 [2017版本以上均可] 编译平台:Visual Studio 2019 前要 在开发过程中,很多时候会出现针对某一GameObject的频繁 ...
- 用c++写的 涂鸦跳跃 小游戏
源码下载地址请留言 涂鸦跳跃 c++
- 池式结构:对象池(Object Pool)
本文是对 http://gameprogrammingpatterns.com/object-pool.html 的原创翻译.部分地方使用意译,不准确的地方请各位指证. 一.对象池的意义 通过重新使用 ...
- Unity 2.Space Shooter(碰撞器Collider,WebGL,刚体中属性,(定时)实例化、销毁游戏对象,触碰OnTriggerEnter/Exit,爆炸效果,音频,文字,定时调方法)
目录 项目介绍 WebGL发布 游戏对象设置 灯光.相机 背景 移动游戏对象 Debug 制作子弹 射击动作 清理离开边界的游戏对象 制作危险物 添加爆炸,移动小行星,作为预制件 创建游戏控制器 循环 ...
- 9.Unity2D 横版 简单AI 之 敌人跳跃条件优化+自动范围内检测敌人发起攻击(索敌)+对象池优化+主角受伤死亡
总目录https://blog.csdn.net/qq_54263076/category_11900070.html?spm=1001.2014.3001.5482 1.动画animation和动画 ...
- 游戏物体复用:对象池(以Unity3D为例)
需要解决/优化的问题: 在Unity3D中,实例化物体和销毁物体是都非常消耗性能的,小项目可能没问题的,但是一旦有大量的物体在短时间内需要销毁或者创建,那么游戏就会变得巨卡,如果是手游你的手机还会变烫 ...
- 游戏设计模式阅读笔记18——优化模式(对象池模式)
目录 一.意图 二.动机 三.对象池模式 四.实例代码 五.注意 1.对象和池耦合的问题 一.意图 放弃单独地分配和释放对象,从固定的池中重用对象,以提高性能和内存使用率. 二.动机 比如粒子系统的调 ...
- Unity3D游戏开发之类对象池优化秘籍残篇
翻开秘籍第一页: 问: 什么是类对象池? 剑之初: 游戏中,我们常常会遇到频繁得创建和销毁大量相同对象的场景.如果我们不做任何的特殊处理,这种场景会出现两个性能问题--大量的内存碎片以及频繁的分配内存 ...
- 【游戏开发实战】Unity循环复用列表,支持不规则尺寸(对象池 | UGUI | ScrollRect | Demo源码)
文章目录 一.前言 二.使用方法 1.创建Scroll View 2.设置Scroll View参数 2.1.调整宽高 2.2.删除Scrollbar滑块 2.3.设置item模板: Item Tem ...
最新文章
- 青少年编程竞赛交流群第048次活动录播
- mass Framework在后端的核心模块
- MySQL 5.1.24rc + innodb plugin尝鲜
- java 获取打印机缺纸_第三章软件
- Oracle EBS PO 接受入库
- 3D卷积GAN飞起!微软“可缩放”新框架只需2D数据即可生成逼真3D模型
- 前端优化,包括css,jss,img,cookie
- 【转】MOTION CAPTURE动作捕捉系统模块
- java开发常用的linux命令,Java开发中最常用的Linux命令整理
- 微软企业库4.1学习笔记(十六)缓存模块4 服务器场中的缓存使用
- 云服务器 性能测试之web压力测试
- matlab直线的程序,MATLAB|辅助直线绘制程序
- c语言编程求广义逆矩阵,求大神解答求广义逆矩阵的问题 拜谢了!!
- android开发中常用的占位符
- 微软服务器登录不上,微软账号无法登录怎么办
- 一款消消乐游戏的自动解法
- 隐式内联函数和显式内联函数
- 【数学建模】灰色关联(Matlab代码实现)
- 位置型PID增量型PID调节直流电机
- 推断统计python化(参数估计,假设检验与 t检验)