1.随机生成Tile(一)

在GameManager中添加随机生成砖块和从资源池取出物体的代码

    public enum ObjectType
{Tile,Item,Coin,Enemy,Bullet
}//tile池子public Queue<GameObject> tilePool = new Queue<GameObject>();public Queue<GameObject> itemPool = new Queue<GameObject>();public Queue<GameObject> coinPool = new Queue<GameObject>();public Queue<GameObject> enemyPool = new Queue<GameObject>();public Queue<GameObject> bulletPool = new Queue<GameObject>();/// <summary>/// 随机生成砖块/// </summary>void GenerateTile(){GameObject go = GetInactiveObject(ObjectType.Tile);}/// <summary>/// 从池子取物体/// </summary>/// <param name="type"></param>/// <returns></returns>public GameObject GetInactiveObject(ObjectType type){switch (type){case ObjectType.Tile:return tilePool.Dequeue();case ObjectType.Item:return itemPool.Dequeue();case ObjectType.Coin:return coinPool.Dequeue();case ObjectType.Enemy:return enemyPool.Dequeue();case ObjectType.Bullet:return bulletPool.Dequeue();default:return null;}}

在GameSetting中给每个砖块添加权重(生成的概率)

2.随机生成Tile(二)

给所有tile赋值,然后在GameManager中计算它们的权值并且随机生成

    //获取权值所有void GetAllWeight(){float sum = 0;sum += advance.normalTile.weight;sum += advance.brokenTile.weight;sum += advance.oneTimeOnly.weight;sum += advance.springTile.weight;sum += advance.movingVertically.weight;sum += advance.movingHorizontally.weight;totalsum = sum;}/// <summary>/// 随机生成砖块/// </summary>void GenerateTile(){GameObject go = GetInactiveObject(ObjectType.Tile);float rand = Random.Range(0, totalsum);}private void Start(){//sum赋值GetAllWeight();//初始化对象池GenerateTilePool();//生成物体for (int i = 0; i < initialSize; i++){GenerateTile();}}

3.随机生成Tile(三)

GameManager中添加通过权值来设置tile类型的代码

    int SetTileByRandomNumber(float number){if (number <= advance.normalTile.weight)return 0;else if (number <= (advance.normalTile.weight + advance.brokenTile.weight))return 1;else if (number <= (advance.normalTile.weight + advance.brokenTile.weight + advance.oneTimeOnly.weight))return 2;else if (number <= (advance.normalTile.weight + advance.brokenTile.weight + advance.oneTimeOnly.weight + advance.springTile.weight))return 3;else if (number <= (advance.normalTile.weight + advance.brokenTile.weight + advance.oneTimeOnly.weight + advance.springTile.weight + advance.movingHorizontally.weight))return 4;else if (number <= (advance.normalTile.weight + advance.brokenTile.weight + advance.oneTimeOnly.weight + advance.springTile.weight + advance.movingHorizontally.weight + advance.movingVertically.weight))return 5;return -1;}

4.随机生成Tile(四)

完善随机生成砖块

 /// <summary>/// 随机生成砖块/// </summary>void GenerateTile(){GameObject go = GetInactiveObject(ObjectType.Tile);float rand = Random.Range(0, totalsum);int randNumber = SetTileByRandomNumber(rand);Vector2 pos = new Vector2(Random.Range(-4.5f, 4.5f), 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;case 1:go.transform.position = pos;currentY += Random.Range(advance.brokenTile.minHeight, advance.brokenTile.maxHeight);go.name = "1";go.SetActive(true);break;case 2:go.transform.position = pos;currentY += Random.Range(advance.oneTimeOnly.minHeight, advance.oneTimeOnly.maxHeight);go.name = "2";go.SetActive(true);break;case 3:go.transform.position = pos;currentY += Random.Range(advance.springTile.minHeight, advance.springTile.maxHeight);go.name = "3";go.SetActive(true);break;case 4:go.transform.position = pos;currentY += Random.Range(advance.movingHorizontally.minHeight, advance.movingHorizontally.maxHeight);go.name = "4";go.SetActive(true);break;case 5:go.transform.position = pos;currentY += Random.Range(advance.movingVertically.minHeight, advance.movingVertically.maxHeight);go.name = "5";go.SetActive(true);break;default:break;}}

运行程序如下

5.回收Tile

在主相机下建立一个回收池

在GameManager中添加下面的方法

public GameObject floor;
public void AddInActiveObjectToPool(GameObject go,ObjectType type){go.SetActive(false);switch (type){case ObjectType.Tile:tilePool.Enqueue(go);//TODO:生成tilebreak;case ObjectType.Item:itemPool.Enqueue(go);break;case ObjectType.Coin:coinPool.Enqueue(go);break;case ObjectType.Enemy:enemyPool.Enqueue(go);break;case ObjectType.Bullet:bulletPool.Enqueue(go);break;default:break;}}

在Tile中进行调用

    private void Update(){if (GameManager.Instance.floor.transform.position.y > transform.position.y + 1){GetComponent<Rigidbody2D>().gravityScale = 0f;GameManager.Instance.AddInActiveObjectToPool(gameObject, ObjectType.Tile);}}

运行程序结果如下,下面的tile都被回收

6.砖块水平竖直移动

在Tile脚本中添加代码,让tile可以自己移动

    //方块的移动速度和距离float speed;float distance;Vector3 startPos;int direction;  //0:left & up 1:right & down void Init(){sp = GetComponent<SpriteRenderer>();tileType = int.Parse(gameObject.name);switch (tileType){case 0:sp.sprite = sprites[0];break;case 1:sp.sprite = sprites[1];break;case 2:sp.sprite = sprites[2];break;case 3:sp.sprite = sprites[3];break;case 4:sp.sprite = sprites[4];speed = GameManager.Instance.advance.movingHorizontally.speed;distance = GameManager.Instance.advance.movingHorizontally.distance;startPos = transform.position;break;case 5:sp.sprite = sprites[5];speed = GameManager.Instance.advance.movingVertically.speed;distance = GameManager.Instance.advance.movingVertically.distance;startPos = transform.position;break;default:break;}}private void Update(){switch (tileType){case 4:if (direction == 0){transform.Translate(new Vector2(-speed * Time.deltaTime, 0));if (startPos.x - transform.position.x > distance){direction = 1;}}else{transform.Translate(new Vector2(speed * Time.deltaTime, 0));if (startPos.x - transform.position.x < -distance){direction = 0;}}break;case 5:if (direction == 0){transform.Translate(new Vector2(0,-speed * Time.deltaTime));if (startPos.y - transform.position.y > distance){direction = 1;}}else{transform.Translate(new Vector2(0,speed * Time.deltaTime));if (startPos.y - transform.position.y < -distance){direction = 0;}}break;default:break;}
}

运行结果如下

7.设置游戏状态

在GameManager中添加三种状态并添加游戏结束的代码

public enum GameState
{PAUSED,RUNNING,GAMEOVER
}//游戏状态public GameState gameState = GameState.PAUSED;//结束游戏public void EndGame(){if(gameState != GameState.GAMEOVER){gameState = GameState.GAMEOVER;//TODO:save data UI}}

在Player脚本中进行调用

    private void OnTriggerEnter2D(Collider2D collision){if (collision.tag == "Platform"){Jump(1);}if(collision.tag == "Floor"){GameManager.Instance.EndGame();}}

运行程序结果如下

8.无限生成Tile

在GameManager中添加重新生成tile的方法

    /// <summary>/// 当一个tile销毁时,调用此方法/// </summary>void CreateTile(){if(gameState != GameState.GAMEOVER){GenerateTile();//添加道具//难度曲线//分数}}

并在砖块销毁的时候进行调用

运行程序结果如下

9.Item的开发(一)

在场景中创建道具并添加PowerUp的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PowerUp : MonoBehaviour
{public int itemType;SpriteRenderer sp;//图片public Sprite[] sprites;//技能时间public float[] powerTime;private void OnEnable(){Init();}void Init(){sp = GetComponent<SpriteRenderer>();itemType = int.Parse(gameObject.name);sp.sprite = sprites[itemType];}
}

10.Item的开发(二)

完善PowerUp脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PowerUp : MonoBehaviour
{public int itemType;SpriteRenderer sp;//图片public Sprite[] sprites;//技能时间public float[] powerTime;//技能释放物体public GameObject[] used;GameObject player;private void OnEnable(){Init();}void Init(){sp = GetComponent<SpriteRenderer>();itemType = int.Parse(gameObject.name);sp.sprite = sprites[itemType];}public void OnTriggerEnter2D(Collider2D collision){if (collision.tag == "Player"){player = collision.gameObject;//隐藏sp.enabled = false;//速度为0player.GetComponent<Rigidbody2D>().velocity = Vector2.zero;//让重力不影响我们的运动player.GetComponent<Rigidbody2D>().isKinematic = true;//无敌GetComponent<CircleCollider2D>().enabled = false;//显示图片used[itemType].SetActive(true);//flyStartCoroutine("StopFly");}}IEnumerator StopFly(){}
}

11.Item的开发(三)

完善PowerUp脚本,让Player添加道具飞行

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PowerUp : MonoBehaviour
{public int itemType;public SpriteRenderer sp;//图片public Sprite[] sprites;//技能时间public float[] powerTime;//技能释放物体public GameObject[] used;GameObject player;bool fly;private void OnEnable(){Init();}void Init(){sp.enabled = true;itemType = int.Parse(gameObject.name);sp.sprite = sprites[itemType];fly = false;}public void OnTriggerEnter2D(Collider2D collision){if (collision.tag == "Player"){player = collision.gameObject;//隐藏sp.enabled = false;//速度为0player.GetComponent<Rigidbody2D>().velocity = Vector2.zero;//让重力不影响我们的运动player.GetComponent<Rigidbody2D>().isKinematic = true;//无敌GetComponent<CircleCollider2D>().enabled = false;//显示图片used[itemType].SetActive(true);//flyfly = true;StartCoroutine("StopFly");}}IEnumerator StopFly(){yield return new WaitForSeconds(powerTime[itemType]);player.GetComponent<Rigidbody2D>().isKinematic = false;GetComponent<CircleCollider2D>().enabled = true;used[itemType].SetActive(false);fly = false;}private void Update(){if (fly){player.transform.Translate(new Vector2(0, 12 * Time.deltaTime));}else if (GameManager.Instance.floor.transform.position.y > transform.position.y + 1){GameManager.Instance.AddInActiveObjectToPool(gameObject, ObjectType.Item);}}
}

运行程序结果如下

Unity案例课程 - 涂鸦跳跳 Day 2相关推荐

  1. Unity案例课程 - 涂鸦跳跳 Day 1

    1.游戏分析 2.资源导入 3.背景调整 4.图片自适应 在platform上添加Adjust脚本,让它自适应相机 using System.Collections; using System.Col ...

  2. 【游戏案例学习】涂鸦跳跳笔记

    涂鸦跳跳 player.cs Bullet.cs PowerUp.cs 玩家吃了特殊物品可以加速飞 Tile.cs 实例化小砖块 Enemy.cs敌人 Coin.cs金币 单例 GameManager ...

  3. 创业实践案例课程答案

    创业实践案例课程答案 目录 创业实践案例课程答案 第一部分 创京东的十条启示--随堂测验(一) 第一部分 创京东的十条启示--随堂测验(二) 第二部分 京东的两大战役与四大战略--随堂测验(三) 第三 ...

  4. Unity中实现涂鸦和橡皮擦功能

    一.目的 1.想知道:Unity中实现涂鸦和橡皮擦功能 二.参考 1.Unity 实现橡皮擦效果 https://www.cnblogs.com/lzzhentou/p/11634696.html 总 ...

  5. 前端切图案例课程一则-姜威-专题视频课程

    前端切图案例课程一则-201人已学习 课程介绍         本课程以一套响应式网站设计图,进行切图为案例,还原老司机整个切图过程.本课程属于初级的前端工程师系列课程中案例课程的第一套课程,本课程需 ...

  6. python 银行数据分析_银行业务概述_Python数据分析行业案例课程--信用评分方法_数据挖掘与分析视频-51CTO学院...

    注意: 1. 本行业案例课程为Python 3 数据分析系列课程的行业案例部分,学员请务必先观看课程介绍免费视频,确认已学习本课程所需Python分析技能. 2. 本课程的核心目的是协助学员学习具体业 ...

  7. [H5案例课程]连连看H5小游戏的制作-岑远科-专题视频课程

    [H5案例课程]连连看H5小游戏的制作-2054人已学习 课程介绍         主要针对Mugeda有一定基础的同学,购买前请先学习初级课程,初级课程地址: http://edu.csdn.net ...

  8. 创业实践案例课程报告

    ** 题目要求如下: ** 答案: 学完了这门创业实践案例课程,感觉自己收获了很多.通过几位老师的介绍和讲解,我了解了如今两大巨头京东和华为的发展历程,并深入地洞悉了它们的成功之道.两个公司都十分注重 ...

  9. python金融数据分析案例_Python数据分析行业案例课程--欺诈检测

    注意: 1. 本行业案例课程为Python 3 数据分析系列课程的行业案例部分,学员请务必先观看课程介绍免费视频,确认已学习本课程所需Python分析技能. 2. 本课程的核心目的是协助学员学习具体业 ...

最新文章

  1. 简单的python抢红包脚本-Python自动抢红包,超详细教程,再也不会错过微信红包了!...
  2. 假如我是面试官,我会这样虐你
  3. 【NLP】NLP哪个细分方向最具社会价值?
  4. 若S作主串,P作模式串,试分别写出利用BF算法和KMP算法的匹配过程。
  5. Incompatible JavaHL library loaded. Subversion 1.8.x required.
  6. NLP《Tranformer和Self-Attention》
  7. 深度学习最常用的10个激活函数!
  8. 【Antlr】Antlr 资料 学习 网站
  9. 车辆贷款违约预测 Top1(2021科大讯飞)
  10. Python OS使用
  11. mysql 执行计划 视频_实战讲解MySQL执行计划,面试官当场要了我
  12. Paper reading:高分辨率图像分割:From Contexts to Locality: Ultra-high Resolution Image Segmentation ICCV2021
  13. 【信号与系统】复习总结笔记
  14. 文献解读|迁徙蝗虫生理和转录水平的衰老特征
  15. K8s入门-K8s节点notReady状态解决
  16. Unity3d小球碰到墙壁之后反弹
  17. Duang一夏,安码企业流程化管控软件优惠季来了! 活动介绍
  18. 图像处理之LSB Matching Revisited论文复现
  19. 第九章:项目资源管理 - (9.4 建设团队)
  20. 数学文化/数据结构知识题

热门文章

  1. 啥? 代码可以改变世界? 道翰天琼认知智能API接口平台为您揭秘。
  2. C语言编程>第一周 ⑦ 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示
  3. 科学课和计算机整合,信息技术与科学课整合《风的形成》教学设计
  4. STM32版CCD线性摄像头寻线寻迹小车
  5. php语言中$意思,PHP语言中的lt;gt;符号是什么意思?
  6. 网站优化(提高网站访问量)
  7. 做c4d计算机配置,震惊!现在玩转C4D的电脑配置只要4000多就可以了!
  8. 想做跨境电商,这几种收款方式必须知道!!
  9. android 点阵字体生成,点阵字体 ASCII码 汉字库 自我学习 简单总结
  10. zookeeper随堂笔记