Unity3d开发google chrome的dinosaur游戏
游戏效果
游戏中:
游戏中止:
一、制作参考
如何制作游戏?【15分钟】教会你制作Unity小恐龙游戏!新手15分钟内马上学会!_ unity教学 _ 制作游戏 _ 游戏开发_哔哩哔哩_bilibili
二、图片资源
https://download.csdn.net/download/benben044/89522911?spm=1001.2014.3001.5501
三、创建场景
1、将资源都拖到Assets目录下
2、调整编辑布局
将Scene、Hierarchy、Game这3个模块分开,方便可以同时观察到三个模块的信息。
同时将Main Camera的color设置为白色,方便看到ground的颜色。
3、放dinosaur到scene
将assets中的run-2放到Scene中,就可以在Game中看到dinosaur的图案,同时将恐龙rename为Dinosaur。
4、添加cloud到scene
同时给cloud进行重命名。
5、给dinosaur和ground添加组件
(1)给dinosaur添加Rigidbody 2d组件,使其具有物理属性,设置Gravity Scale为2,重力大一点下降速度会更快一点。
(2)再给dinosaur添加Box Collider 2d组件,使其具有碰撞属性
(3)接着给ground添加Box Collider 2d组件,使其具有碰撞属性
通过以上操作,dinosaur因为有物理属性所以会自然掉落,但是因为dinosaur和ground都有碰撞属性,所以dinosaur掉到地面后就停止掉落了。
在测试中如果发现Dinosaur掉到地面后脚没有落地,可以编辑Box Collider 2D中的Edit Collider,调整碰撞的范围。
四、编辑C#脚本
1、创建恐龙脚本
public class Dinosaur : MonoBehaviour
{Rigidbody2D rb;bool isJumping;public float jump; // 当为public时即可在Inspector面板看到属性信息// Start is called before the first frame updatevoid Start(){rb = GetComponent<Rigidbody2D>();isJumping = false;}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.Space) && isJumping == false) { rb.velocity = new Vector2(0, jump); isJumping = true;}}private void OnCollisionEnter2D(Collision2D collision){// 只有碰到底才能跳,否则在天空中就飞起来了isJumping = false; }
}
在Dinosaur的Dinosaur组件中设置jump为8。
2、创建恐龙动画
首先,在Assets下创建Animations的目录。
在Window->Animation下创建动画组件,然后点击Scene下的Dinosaur,最后点击Create,在Assets下的Animations下创建DinosaurAnimation.anim文件,如下图所示:
然后将dinosaur_assets下的run-1和run-2拖入animation编辑器,第1个点是run-1,第2个点是run-2,第3个点是run-1,循环的动作。
3、创建Movement脚本
在Assets下创建Movement的脚本,该脚本的功能是:当角色在run时,天上的云、地面都在向左移动。即,角色不动,参照物动,从而造成角色向右移动的假象。
public class Movement : MonoBehaviour
{public float movementSpeed;public float startPosition;public float endPosition;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){transform.position = new Vector2(transform.position.x - movementSpeed * Time.deltaTime, transform.position.y);// 到dinosaur快要越界掉下去时,从开始处重新开始runif (transform.position.x <= endPosition){transform.position = new Vector2(startPosition, transform.position.y);}}
}
给ground,所有的cloud都加载该脚本,并且设置3个变量分别为5,5,-15。
4、加入仙人掌
将仙人掌放到Scene中,并且添加Box Collider 2D的脚本,这样恐龙就不能穿透它了。同时加入Movement的脚本,参数设置也是5,5,-15。
5、创建GameManager
在Scene中Create Empty,名为GameManager。
然后在Assets下创建GameManager的脚本,并把该脚本赋予GameManager的物体上。
脚本内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameManager : MonoBehaviour
{public GameObject cactus; // 仙人掌public GameObject cactusSpawnPostition; //仙人掌出现的位置public float spawnTime; // 仙人掌出现的时间float timer; // 计时器// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){timer += Time.deltaTime;if (timer >= spawnTime){Instantiate(cactus, cactusSpawnPostition.transform);timer = 0;}}
}
意思是:当超过spawnTime时,就让cactus在cactusSpawnPosition出现。
6、创建cactusSpawnPosition
这个就是上个脚本中仙人掌每次自动生成的位置。
修改该对象的tag为红色菱形,这样在scene中更容易被辨认出来。
然后在scene中确定位置,如下图所示:
接着拖动hierachy中的cactus到Assets成为prefab预制体,修改器transform中的的Position全是0。
然后,设置GameManager的参数如下:
7、给仙人掌添加tag
点击Asset中的cactus_single,然后在其Tag旁边的Untagged点击一下,选择Add Tag如下图:
添加Cacuts的tag如下:
在Tag栏位选择刚刚创建的Cactus,如下:
8、删除不用的仙人掌
如果仙人掌已经在movement中endPosition的左边,就可以destory它。
所以,如果越界后,是仙人掌就destroy它,否则类似ground、cloud就循环从头开始。
所以优化Movement脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Movement : MonoBehaviour
{public float movementSpeed;public float startPosition;public float endPosition;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){transform.position = new Vector2(transform.position.x - movementSpeed * Time.deltaTime, transform.position.y);// 到dinosaur快要越界掉下去时,从开始处重新开始runif (transform.position.x <= endPosition){if(gameObject.tag == "Cactus"){Destroy(gameObject);}else{transform.position = new Vector2(startPosition, transform.position.y);}}}
}
9、创建GameOver和Restart
(1)GameOver
在Hierarchy中选择UI -> Legacy -> Text如下:
编写文字:GAME OVER
并且选择好FFT格式的字体。
(2)Restart
在Cavas下再创建Button,位于UI -> Legacy -> Button,重命名为RestartButton。
然后将Button的图标替换为已有的素材,在调整下size。
(3)创建Panel
将上面创建的2个UI组件都装到该Panel下,同时调整Panel->Color->A值为0。
这样,同时控制Panel的Active状态,就可以控制Panel的出现和消失。
只有当触发GameOver时该Panel才会出现,否则该Panel的Active为false。
10、 保存场景
在File->Save As中,在Assets->Scenes下保存场景为lv1,level1的意思。
11、在GameManager中加入GameOver和Restart
- 创建GameOverScene变量,对应GameOver的Panel
- Start()中加入控制速度的Time.scaleTime=1
- 在多个函数中设置GameOver的Panel的Active为false
- 在GameOver()中,设置Time.scaleTime=0,同时出现GameOver的Panel
- 在Restart()中,重新加载lv1的scene,同时GameOver的Panel的Active为false
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class GameManager : MonoBehaviour
{public GameObject cactus; // 仙人掌public GameObject cactusSpawnPostition; //仙人掌出现的位置public float spawnTime; // 仙人掌出现的时间float timer; // 计时器public GameObject GameOverScene;// Start is called before the first frame updatevoid Start(){Time.timeScale = 1.0f;GameOverScene.SetActive(false);}// Update is called once per framevoid Update(){timer += Time.deltaTime;if (timer >= spawnTime){Instantiate(cactus, cactusSpawnPostition.transform);timer = 0;}}public void GameOver(){Time.timeScale = 0; // 将游戏暂停GameOverScene.SetActive(true);}public void Restart(){SceneManager.LoadScene("lv1");GameOverScene.SetActive(false);}
}
编写完代码后,在Inspector中配置GameOverScene的值。
12、在Dinosaur脚本中加入游戏暂停的触发条件
主要是在OnCollisionEnter2D中加入触发条件。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Dinosaur : MonoBehaviour
{Rigidbody2D rb;bool isJumping;public float jump; // 当为public时即可在Inspector面板看到属性信息public GameManager gm;// Start is called before the first frame updatevoid Start(){rb = GetComponent<Rigidbody2D>();isJumping = false;}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.Space) && isJumping == false) { rb.velocity = new Vector2(0, jump); isJumping = true;}}private void OnCollisionEnter2D(Collision2D collision){// 只有碰到底才能跳,否则在天空中就飞起来了isJumping = false; if(collision.gameObject.tag == "Cactus"){// 撞到仙人掌,游戏暂停gm.GameOver();}}
}
编写完代码后,配置GameManager的变量。
至此,该游戏制作完成!
五、总结
1、检测碰撞:OnCollisionEnter2D,这个是和Update平级的函数
2、物体移动时,transform.position = new Vector2(x, y),其中x是transform.position.x - Time.deltaTime * speed.
3、时间是float类型的数据
4、实例化预设体用Instantiate函数,参数1是实例化的对象,参数2是transform信息,可以用某个物体的transform信息作为参数2
5、检测碰撞的物体时,可以给对方物体一个tag,然后通过collision.gameobject.tag == <tag>判断和该物体是否相撞
6、加载场景使用SceneManager.LoadScene("<场景名称>")
7、如果有多个UI需要一起控制,则统一放到Panel中,然后控制该Panel即可
8、控制暂停、重启,可使用时间变量Time.timeScale
9、脚本被挂载的当前物体为transform.gameObject
相关文章:

Unity3d开发google chrome的dinosaur游戏
游戏效果 游戏中: 游戏中止: 一、制作参考 如何制作游戏?【15分钟】教会你制作Unity小恐龙游戏!新手15分钟内马上学会!_ unity教学 _ 制作游戏 _ 游戏开发_哔哩哔哩_bilibili 二、图片资源 https://download.csdn.…...

【数据分享】2013-2022年我国省市县三级的逐日SO2数据(excel\shp格式\免费获取)
空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000——2022年的省市县三级的逐日PM2.5数据和2013-2022年的省市县三级的逐日CO数据(均可查看之前的文章获悉详情)! 本次我们分享的是我国2013——2022年的省…...

【玩转C语言】第五讲--->数组-->一维和多维深度理解
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 引言: 大家好,我是坊钰,为了让大家深入了解C语言,我开创了【玩转C语言系列】,将为大家介绍C语言相关知识…...

Apache Flink 任务提交模式
Flink 任务提交模式 Flink可以基于多种模式部署:基于Standalone 部署模式,基于Yarn部署模式,基于Kubernetes部署模式以上不同集群部署模式下提交Flink任务会涉及申请资源,各角色交互过程,不同模式申请资源涉及到的角色…...

Ubuntu22.04安装OMNeT++
一、官网地址及安装指南 官网地址:OMNeT Discrete Event Simulator 官网安装指南(V6.0.3):https://doc.omnetpp.org/omnetpp/InstallGuide.pdf 官网下载地址:OMNeT Downloads 旧版本下载地址:OMNeT Old…...
Matlab课程设计——手指静脉识别项目
手指静脉识别项目 项目方案设计介绍 本项目实现手指图像的处理和匹配算法,需要处理的数据是本人不同手指的图像,首先经过图像处理,使得指静脉的纹理增强凸显处理,然后将所有的这些图像进行相互间的匹配,检验类内和类…...
centos软件安装
安装方式 一、二进制安装 --解压即用,只针对特殊平台 --jdk tomcat 二、RPM:按照一定规范安装软件,无法安装依赖的文件 --mysql 三、yum:远程安装基于RPM,把依赖的文件安装上去,需要联网 四、源码安装 jdk安…...
力扣 217. 存在重复元素,389. 找不同,705. 设计哈希集合,3. 无重复字符的最长子串,139. 单词拆分
217. 存在重复元素 题目 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 AC代码 class Solution { public:bool containsDuplicate(vector<int>& nums) {// …...
嵌入式软件工作能力
1. 工作能力 技术能力强,并不代表工作能力 2. 流程把控 3. 项目管理 4. “找茬”能力 5. 文档输出能力...

景区导航导览系统:基于AR技术+VR技术的功能效益全面解析
在数字化时代背景下,游客对旅游体验的期望不断提升。游客们更倾向于使用手机作为旅行的贴身助手,不仅因为它能提供实时、精准的导航服务,更在于其融合AR(增强现实)、VR(虚拟现实)等前沿技术&…...

Mybatis-Plus代码生成器配置方法
Mybatis-Plus网址:https://baomidou.com/pages/779a6e/#%E4%BD%BF%E7%94%A8 第一步:引入依赖 <!-- 代码生成器 --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId>…...

三主机部署HP Anyware Manager服务
一、序言 在部署拓扑和方案方面,HP Anyware Manager 非常灵活,可以部署在单个主机中,也可以部署在多个主机中,具体取决于组织的网络环境和运营要求。 二、单主机部署 2.1 描述 此部署配置是当 Anyware Manager 和 MongoDB 以及…...

Grafana :利用Explore方式实现多条件查询
背景 日志统一推送到Grafana上管理。所以,有了在Grafana上进行日志搜索的需求,而进行日志搜索通常需要多条件组合。 解决方案 通过Grafana的Explore的方式实现多条件查询。 直接看操作步骤: 在主页搜索框中输入“Explore” 进入这个界面…...

腾讯技术创作特训营 -- SUPERWINNIE -- AI重塑社交内容
目录 1 什么是AI社交内容 2 案例拆解 3 用LLM做爆文选题 4 用LLM出爆文脚本提示词 1 什么是AI社交内容 任何一个因素被AI取代都是AI社交内容 2 案例拆解 数字人 资讯素材 录屏产品的素材(小红书测试AI产品) 脚本 素材 剪辑 3 用LLM做爆文选题 &…...

AV1技术学习: Compound Prediction
一、双向 Compound Prediction AV1支持两个参考帧的预测通过多种复合模式线性组合。复合预测公式为 其中,权重m(x, y) is scaled by 64 以进行整数计算,R1(x, y)和R2(x, y)表示两个参考块中位于(x, y)的像素。P(x, y)将按比例缩小 1/64 以形成最终的预测…...
watch监听vue2与vue3的写法
watch的属性值 handler:回调函数, 即监听到变化时应该执行的函数,可以是单独的函数或带有 immediate 和 deep 属性的对象watch: {someProperty: function(newVal, oldVal) {// 处理逻辑}}deep: 其值是true或false, 当属性值是对象或数组时,深度观察会监…...

docker搭建普罗米修斯监控gpu
ip8的服务器监控ip110和ip111的服务器 被监控的服务器110和111只需要安装node-export和nvidia-container-toolkit 下载镜像包 docker pull prom/node-exporter docker pull prom/prometheus docker pull grafana/grafana新建目录 mkdir /opt/prometheus cd /opt/prometheus/…...

像 MvvmLight 一样使用 CommunityToolkit.Mvvm 工具包
文章目录 简介一、安装工具包二、实现步骤1.按照MvvmLight 的结构创建对应文件夹和文件2.编辑 ViewModelLocator3.引用全局资源二、使用详情1.属性2.命令3. 消息通知4. 完整程序代码展示运行结果简介 CommunityToolkit.Mvvm 包(又名 MVVM 工具包,以前称为 Microsoft.Toolkit…...
python入门课程Pro(2)--循环
循环 第1课 for循环的基本操作1.循环2.遍历3.for 循环遍历字典(1) 遍历字典的键(2)遍历字典的值(3)遍历字典的键和值 4.练习题(1)班级成绩单(2)最出名的城市(3)修改成绩(…...
今日总结:雪花算法,拉取在线用户
雪花算法: public class SnowflakeIdGenerator {private final long epoch 1626804000000L; // 定义起始时间戳,这里设置为2021-07-21 00:00:00 UTCprivate final long workerIdBits 5L; // 机器ID所占的位数private final long sequenceBits 10L; /…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...