当前位置: 首页 > news >正文

瀑布流资源网站模板/百度资源搜索引擎

瀑布流资源网站模板,百度资源搜索引擎,精品课程网站设计报告,大连甘井子区区号最终效果 【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏 前言 今天用unity制作一个简单的爬坡2d赛车小游戏 素材 https://www.spriters-resource.com/mobile/hillclimbracing/ 拼装车素材 车身添加碰撞体,摩檫力0 轮胎添加碰撞体和刚体&#xff0…

最终效果

【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏

前言

今天用unity制作一个简单的爬坡2d赛车小游戏

素材

https://www.spriters-resource.com/mobile/hillclimbracing/

拼装车素材

在这里插入图片描述

车身添加碰撞体,摩檫力0

在这里插入图片描述
在这里插入图片描述

轮胎添加碰撞体和刚体,摩檫力设置为2

在这里插入图片描述

在这里插入图片描述

整个车加刚体,修改质量为2

在这里插入图片描述

车新增两个Wheel Joint 2组件,分别绑定前后两个车轮刚体

在这里插入图片描述

将锚点移动到车车轮中心
在这里插入图片描述

修改参数
在这里插入图片描述

运行效果,高频会让你的悬架保持紧密
在这里插入图片描述

让车开起来

新增DriveCar 代码

public class DriveCar : MonoBehaviour
{[SerializeField] private Rigidbody2D _frontTireRB; // 前轮刚体[SerializeField] private Rigidbody2D _backTireRB; // 后轮刚体[SerializeField] private float _speed = 150f; // 车辆速度private float _moveInput; // 移动输入值// 每帧更新private void Update(){_moveInput = Input.GetAxisRaw("Horizontal"); // 获取水平输入}// 固定帧更新private void FixedUpdate(){// 给前轮和后轮施加扭矩,控制车辆运动_frontTireRB.AddTorque(-_moveInput * _speed * Time.fixedDeltaTime);_backTireRB.AddTorque(-_moveInput * _speed * Time.fixedDeltaTime);}
}

配置
在这里插入图片描述
效果

在这里插入图片描述

我们还希望当汽车在空中时能够控制它的旋转

修改DriveCar

[SerializeField] private Rigidbody2D _carRB; // 车刚体
[SerializeField] private float _rotationSpeed = 500f; // 旋转速度// 固定帧更新
private void FixedUpdate()
{//..._carRB.AddTorque(-_moveInput * _rotationSpeed * Time.fixedDeltaTime);
}

配置
在这里插入图片描述

效果
在这里插入图片描述

让我们把司机的头弄得摇摇晃晃的

在身体上添加一个2d碰撞体
在这里插入图片描述

给头添加碰撞体
添加Hinge Joint 2D 链接组件,链接车,锚点设置在脖子处
并开启限制Use Limits(使用限制 ),限制头在一定范围内摆动
在这里插入图片描述

效果
在这里插入图片描述

添加

添加Sprite Shape Profile图片形状轮廓
在这里插入图片描述

在这里插入图片描述
其实效果就是地面旋转超过一定角度后,草地就消失了
在这里插入图片描述

应用Sprite Shape Profile图片形状轮廓配置

场景添加ClosedShape组件
在这里插入图片描述
配置
在这里插入图片描述
可以看到草默认没有露出来,我们需要编辑样条,使左上角点和右上角点立即线性
在这里插入图片描述
在这里插入图片描述

绘制地形

我们可以手动绘制地形,但是工作量太大
在这里插入图片描述

我们可以选择用代码控制生成,新增EnvironmentGenerator

using UnityEngine;
using UnityEngine.U2D;[ExecuteInEditMode]
public class EnvironmentGenerator : MonoBehaviour
{[SerializeField] private SpriteShapeController _spriteShapeController; // Sprite Shape 控制器[SerializeField, Range(3f, 100f)] private int _levelLength = 50; // 环境长度[SerializeField, Range(1f, 50f)] private float _xMultiplier = 2f; // X 倍增量[SerializeField, Range(1f, 50f)] private float _yMultiplier = 2f; // Y 倍增量[SerializeField, Range(0f, 1f)] private float _curveSmoothness = 0.5f; // 曲线平滑度[SerializeField] private float _noiseStep = 0.5f; // 噪声步长[SerializeField] private float _bottom = 10f; // 底部高度private Vector3 _lastPos; // 上一个位置public void OnValidate(){_spriteShapeController.spline.Clear(); // 清空曲线for (int i = 0; i < _levelLength; i++){_lastPos = transform.position + new Vector3(i * _xMultiplier, Mathf.PerlinNoise(0, i * _noiseStep) * _yMultiplier, 0f); // 计算当前位置_spriteShapeController.spline.InsertPointAt(i, _lastPos); // 在曲线中插入点if (i != 0 && i != _levelLength - 1){_spriteShapeController.spline.SetTangentMode(i, ShapeTangentMode.Continuous); // 设置切线模式为连续_spriteShapeController.spline.SetLeftTangent(i, Vector3.left * _xMultiplier * _curveSmoothness); // 设置左切线_spriteShapeController.spline.SetRightTangent(i, Vector3.right * _xMultiplier * _curveSmoothness); // 设置右切线}}_spriteShapeController.spline.InsertPointAt(_levelLength, new Vector3(_lastPos.x, transform.position.y - _bottom, 0f)); // 在最后添加底部左侧点_spriteShapeController.spline.InsertPointAt(_levelLength + 1, new Vector3(transform.position.x, transform.position.y - _bottom, 0f)); // 在最后添加底部右侧点}
}

配置,调整参数配置,绘制地形
在这里插入图片描述

地面添加碰撞体

新增Edge Collider 2D碰撞体
在这里插入图片描述

可以看到默认是一条线,点击Sprite Shape Controller组件的更新碰撞体取消勾选再打开,就刷新了
在这里插入图片描述
这样碰撞就与地面匹配了
在这里插入图片描述

但是我们不希望碰撞体在草地之上,可以点击细微调整碰撞体
在这里插入图片描述

效果
在这里插入图片描述

添加虚拟相机摄像头跟随

在这里插入图片描述
效果
在这里插入图片描述

添加燃料条

绘制UI
在这里插入图片描述
在这里插入图片描述

新增FuelController

using UnityEngine;
using UnityEngine.UI;public class FuelController : MonoBehaviour
{public static FuelController instance;[SerializeField] private Image _fuelImage; // 显示燃料的图像[SerializeField, Range(0.1f, 5f)] private float _fuelDrainSpeed = 1f; // 燃料消耗速度范围[SerializeField] private float _maxFuelAmount = 100f; // 最大燃料量private float _currentFuelAmount; // 当前燃料量private void Awake(){if (instance == null)instance = this; // 单例模式,确保只有一个实例}private void Start(){_currentFuelAmount = _maxFuelAmount; // 初始时燃料量等于最大燃料量UpdateUI(); // 更新UI显示}private void Update(){_currentFuelAmount -= Time.deltaTime * _fuelDrainSpeed; // 每帧消耗燃料UpdateUI(); // 更新UI显示}private void UpdateUI(){_fuelImage.fillAmount = (_currentFuelAmount / _maxFuelAmount); // 更新燃料图像的填充量}
}

配置
在这里插入图片描述

效果
在这里插入图片描述

按颜料剩余量显示不同的颜色变化

修改FuelController

[SerializeField] private Gradient _fueleGradient;//颜色参数private void UpdateUI()
{_fuelImage.fillAmount = (_currentFuelAmount / _maxFuelAmount); // 更新燃料图像的填充量_fuelImage.color = _fueleGradient.Evaluate(_fuelImage.fillAmount);//修改颜色变化
}

配置
在这里插入图片描述
效果
在这里插入图片描述

燃料耗尽结束游戏和重新开始游戏

简单绘制游戏结束UI
在这里插入图片描述

新增GameManager

using UnityEngine;
using UnityEngine.SceneManagement;public class GameManager : MonoBehaviour
{public static GameManager instance;[SerializeField] private GameObject _gameOverCanvas; // 游戏结束时显示的画布private void Awake(){if (instance == null)instance = this; // 单例模式,确保只有一个实例Time.timeScale = 1f; // 时间缩放设为正常时间}public void GameOver(){_gameOverCanvas.SetActive(true); // 显示游戏结束画布Time.timeScale = 0f; // 暂停游戏时间}public void RestartGame(){SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); // 重新加载当前场景}
}

配置
在这里插入图片描述

配置重新开始游戏按钮事件
在这里插入图片描述
修改FuelController,调用游戏结束事件

private void Update()
{//...//燃料耗尽结束游戏if(_currentFuelAmount <= 0f){GameManager.instance.GameOver();}
}

效果
在这里插入图片描述

玩家头部撞地结束游戏

添加在头上脚本,记得配置地面标签

public class DriverDeathFromHead : MonoBehaviour
{private void OnCollisionEnter2D(Collision2D other) {if(other.gameObject.CompareTag("Ground")){GameManager.instance.GameOver();}}
}

配置
在这里插入图片描述
效果
在这里插入图片描述

加油

修改FuelController

//加油
public void FillFuel(){_currentFuelAmount = _maxFuelAmount;UpdateUI();
}

新增CollectFuel ,油脚本

public class CollectFuel : MonoBehaviour
{private void OnTriggerEnter2D(Collision2D other) {if(other.gameObject.CompareTag("Player")){FuelController.instance.FillFuel();Destroy(gameObject);}}
}

配置
在这里插入图片描述

效果
在这里插入图片描述

显示行驶距离

新增DisplayDistanceText

public class DisplayDistanceText : MonoBehaviour
{[SerializeField] private Text _distanceText; // 显示距离的TextMeshProUGUI组件[SerializeField] private Transform _playerTrans; // 玩家的Transform组件private Vector2 _startPosition; // 起始位置private void Start(){_startPosition = _playerTrans.position; // 记录玩家的初始位置}private void Update(){Vector2 distance = (Vector2)_playerTrans.position - _startPosition; // 计算玩家相对于起始位置的距离distance.y = 0f; // 只关心水平方向的距离if (distance.x < 0){distance.x = 0; // 距离不会为负数,最小为0}_distanceText.text = distance.x.ToString("F0") + "m"; // 更新显示距离的文本,保留0位小数并添加单位“m”}
}

配置
在这里插入图片描述

效果
在这里插入图片描述

轮胎凹陷问题

比如这样
在这里插入图片描述
你可以选择修改阻尼比和增大频率的值,使其更加稳定,比如这里改成0.3和5
在这里插入图片描述

把轮胎往下移
在这里插入图片描述

别忘记重新定位锚点到中心
在这里插入图片描述

最终效果

参考

https://www.youtube.com/watch?v=E8lR59Yb2A0

源码

很遗憾源码我并不想免费分享,我也建议大家能自己手动去敲代码,逐步实现和理解每一块功能。项目实现所涉及的主要功能思路和代码我也已经毫无保留的分享在文章中了,当然,如果你真的需要的话,源码我也放出来了,收个辛苦费,就当作你对我不断创作的支持。力量随微,心暖人。您的每一次支持都是我创作的最大动力!!!

https://gf.bilibili.com/item/detail/1106249120

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

相关文章:

【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏

最终效果 【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏 前言 今天用unity制作一个简单的爬坡2d赛车小游戏 素材 https://www.spriters-resource.com/mobile/hillclimbracing/ 拼装车素材 车身添加碰撞体&#xff0c;摩檫力0 轮胎添加碰撞体和刚体&#xff0…...

Spring Boot 注解 @PostConstruct 介绍

Spring Boot 注解 PostConstruct 介绍 文章目录 Spring Boot 注解 PostConstruct 介绍一、基本介绍二、PostConstruct 的执行时机Spring Bean 的生命周期PostConstruct 的确切执行时机执行顺序示例重要注意事项 三、使用场景及代码示例1. 初始化资源&#xff1a;比如打开数据库…...

深度学习环境配置报错解决日记

2024年7越24日 1、detectron2需要编译 首先需要在自己创建的虚拟环境中下载一下detectron2 conda create -n pytorch python3.9 conda activate pythorch git clone https://github.com/facebookresearch/detectron2.git 接下来就是编译环节&#xff1a; 在win系统中&…...

百度,有道,谷歌翻译API

API翻译 百度&#xff0c;有道&#xff0c;谷歌API翻译&#xff08;只针对中英相互翻译&#xff09;,其他语言翻译需要对应from&#xff0c;to的code 百度翻译 package fills.tools.translate; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis…...

java-双亲委派机制

Java虚拟机&#xff08;JVM&#xff09;中的类加载器&#xff08;Class Loader&#xff09;负责将类&#xff08;.class文件&#xff09;加载到JVM中&#xff0c;以便Java程序能够使用这些类。在JVM中&#xff0c;类加载器被组织成一种层次结构关系&#xff0c;这种层次结构关系…...

【C++】set的使用

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 &#x1f308;前言&#x1f308;关于set&#x1f525;容量函数emptysize &#x1f525;Modifiersinserteraseclear &#x1f525;Operationsfindcountlower_bound和upper_…...

React 18【实用教程】(2024最新版)

搭建开发环境 含配置&#xff0c;react-developer-tools 和 Redux DevTools 下载安装 https://blog.csdn.net/weixin_41192489/article/details/138523829 JSX 语法 https://blog.csdn.net/weixin_41192489/article/details/138649165 组件 父子组件传值、兄弟组件传值、越层组…...

Perl语言入门学习指南

Perl语言&#xff08;Practical Extraction and Report Language&#xff09;是一种强大的脚本语言&#xff0c;以其灵活性和强大的文本处理能力而闻名。Perl广泛应用于系统管理、Web开发、网络编程和数据处理等领域。本文将带您入门Perl语言&#xff0c;介绍其基本语法、常用功…...

《Java8函数式编程》学习笔记汇总

前言 见证了java8的多层排序&#xff0c;为此想系统学习下java8的用法。 目录 简介Lambda表达式流高级集合类和收集器数据并行化测试、调试和重构设计和架构的原则使用Lambda表达式编写并发程序下一步改怎么办 后记...

C语言之封装,继承,多态

本文参考&#xff1a; c语言面向对象之封装c面向对象之继承Linux源码分析之多态 一、封装 封装的本质就是将数据和方法集中到一个对象中&#xff0c;c或者java使用的是class来实现。c语言中可以使用struct来实现同样的功能。比如下面的程序&#xff1a; struct student {int…...

GO内存分配详解

文章目录 GO内存分配详解一. 物理内存(Physical Memory)和虚拟内存(Virtual Memory)二. 内存分配器三. TCMalloc线程内存(thread memory)页堆(page heap)四. Go内存分配器mspanmcachemcentralmheap五. 对象分配流程六. Go虚拟内存ArenaGO内存分配详解 这篇文章中我将抽丝剥茧,…...

每日Attention学习12——Exterior Contextual-Relation Module

模块出处 [ISBI 22] [link] [code] Duplex Contextual Relation Network for Polyp Segmentation 模块名称 Exterior Contextual-Relation Module (ECRM) 模块作用 内存型特征增强模块 模块结构 模块思想 原文表述&#xff1a;在临床环境中&#xff0c;不同样本之间存在息肉…...

为什么现在电销公司这么难?

现在电销公司普遍底薪就4000&#xff0c;员工要干的工作&#xff1a; 1、自己办卡、现在大部分人对隐私方面比较在意&#xff0c;一般电销公司还都需要自己身份证实名办卡&#xff0c;打几天又封号&#xff0c;有的人甚至被移动拉黑 2、天天打电话&#xff0c;遇见的什么人都…...

每天一个数据分析题(四百四十二)- 标签与指标

数据分析师在工作中常常会涉及两个概念&#xff1a;标签、指标&#xff0c;下面关于标签与指标的描述正确的是&#xff08;&#xff09;&#xff1f; A. 指标通常可以量化&#xff0c;但是标签一般是不可量化的 B. 标签是用来定义、评价和描述特定事物的一种标准或方式 C. 指…...

[论文笔记] pai-megatron-patch Qwen2-72B/7B/1.5B 长文本探路

[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2-CSDN博客 Pai-Megatron-Patch (mcore代码) 长文本限制: 开SP之后,72B能开到16K,7B能开到32K。 但是72B开16K,或者7B开32K时,如果训练时训练样本中有长文本的话,则还是会OOM。 code: 相对于原repo加了一些代…...

【SpringCloud】微服务远程调用OpenFeign

工作原理流程图 上代码 common中添加依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency><groupId>org.spri…...

MySQL零散拾遗(四)

聚合函数 聚合函数作用于一组数据&#xff0c;并对一组数据返回一个值。 常见的聚合函数&#xff1a;SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用&#xff1a;计算指定字段在查询结果中出现的个数&#xff08;不包含NULL值&#…...

大语言模型-检索测评指标

1. MRR &#xff08;Mean Reciprocal Rank&#xff09;平均倒数排名&#xff1a; 衡量检索结果排序质量的指标。 计算方式&#xff1a; 对于每个查询&#xff0c;计算被正确检索的文档的最高排名的倒数的平均值&#xff0c;再对所有查询的平均值取均值。 意义&#xff1a; 衡量…...

Zookeeper集群中节点之间数据是如何同步的

1.首先集群启动时&#xff0c;会先进行领导者选举&#xff0c;确定哪个节点是Leader&#xff0c;哪些节点是Follower和Observer 2.然后Leader会和其他节点进行数据同步&#xff0c;采用发送快照和发送Diff日志的方式 3.集群在工作过程中&#xff0c;所有的写请求都会交给Lead…...

HTTPServer改进思路2(mudou库核心思想融入)

mudou网络库思想理解 Reactor与多线程 服务器构建过程中&#xff0c;不仅仅使用一个Reactor&#xff0c;而是使用多个Reactor&#xff0c;每个Reactor执行自己专属的任务&#xff0c;从而提高响应效率。 首先Reactor是一种事件驱动处理模式&#xff0c;其主要通过IO多路复用…...

Kubernetes Secret 详解

Kubernetes Secret 是一种用于存储和管理敏感信息的对象,如密码、OAuth 令牌和 SSH 密钥等。使用 Secret 可以避免将机密数据直接放在 Pod 规约或容器镜像中,从而增加了应用程序的安全性。 Secret 的类型 Kubernetes 支持多种类型的 Secret,包括: ​​Opaque​​:默认的…...

docker笔记4-部署

docker笔记4-部署 一、部署nginx二、部署Tomcat三、部署ESKibana3.1 部署ES3.2 部署kibana 一、部署nginx docker search nginx #搜索nginx的最新版本docker pull nginx #这里可以指定nginx版本&#xff0c;如果不指定&#xff0c;那么就拉取最新版本latestdocker run -d --na…...

有监督学习基础

基本概念 给定输入有为&#xff08;x,y&#xff09;&#xff0c;其中x表示学习特征&#xff0c;y表示输出&#xff0c;m表示输入总数&#xff0c;有监督学习旨在根据输入建立能够预测可能输出的模型&#xff0c;大致可以分为回归和分类两种&#xff0c;代表可能输出是无限的或…...

揭开 AI 绘画提示词的神秘密码!

前言 ** 揭秘AI 绘画 ** 提示词的神秘密码 亲爱的朋友们&#xff0c;今天我们要一起探索 AI 绘画世界中那神秘的“密码”——提示词。 在 AI 绘画的奇妙领域里&#xff0c;提示词就像是一把神奇的钥匙&#xff0c;能够开启无尽的创意之门。它是我们与 AI 进行心灵对话的桥…...

macOS 10.15中屏蔽Microsoft Edge浏览器的更新提示

文章目录 1.效果对比2.安装描述文件3.停用描述文件4.高级操作&#xff08;可选&#xff09;参考文献 最近在macOS10.15系统&#xff0c;打开Microsoft Edge浏览器&#xff0c;每次打开都有个烦人的提示“ 要获取将来的 microsoft edge 更新&#xff0c;需要 macos 10.15 或更高…...

Qt 实战(3)数据类型 | 3.2、QVariant

文章目录 一、QVariant1、存储数据1.1、存储Qt内置数据1.2、存储自定义数据 2、获取数据3、判断数据类型4、清空数据5、总结 前言&#xff1a; QVariant是Qt框架中一个非常强大且灵活的类&#xff0c;它提供了一种通用的方式来存储和转换几乎任何类型的数据。无论是基本数据类型…...

Docker中安装的postgresql14在启用vector扩展的时候,找不到该扩展的控制文件。

ERROR: could not open extension control file “/usr/share/postgresql/14/extension/vector.control”: No such file or directory 进入容器 docker exec -it CONTAINER ID /bin/bash 1.更新 apt-get apt-get update 2.安装插件 #不同版本对应修改数字即可 apt-get i…...

JS防抖和节流

一、防抖和节流的适用场景 防抖&#xff08;Debounce&#xff09;&#xff1a; 适合在输入框输入时的实时搜索、窗口大小调整时的resize事件等。节流&#xff08;Throttle&#xff09;&#xff1a; 适合如页面滚动时的scroll事件、按钮点击时的请求发送等需要控制频率的场景。 …...

OpenWrt 为软件包和docker空间扩容

参考资料 【openwrt折腾日记】解决openwrt固件刷入后磁盘空间默认小的问题&#xff0c;关联openwrt磁盘扩容空间扩容【openwrt分区扩容】轻松解决空间可用不足的尴尬丨老李一瓶奶油的YouTube 划分空间 参考一瓶奶油的YouTube 系统 -> 磁盘管理 -> 磁盘 -> 修改 格…...

重要的工作任务,怎么在电脑桌面设置倒计时?

在日常工作中&#xff0c;我们总是面临着众多工作任务&#xff0c;如何高效地管理和完成这些任务成为了每个职场人的必备技能。为任务设置倒计时&#xff0c;不仅能让我们清晰地看到任务的先后顺序&#xff0c;还能帮助我们更好地把握时间&#xff0c;提高工作效率。想象一下&a…...