Unity2D_角色移动跳跃
水平移动
Rigidbody2D
使用Unity自带的刚体组件,通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动
-
声明Rigidbody2D属性,以及角色移动速度
public float playerSpeed = 5f; private Rigidbody2D rigidbody2D;
-
在Start方法中将rigidbody2D绑定上物体的对应组件
void Start() {rigidbody2D = GetComponent<Rigidbody2D>(); }
-
读取键盘,并修改rigidbody2D的velocity,以实现移动
private void move() {//读取键盘的水平方向输入//这里hotizontal的取值为[-1,1],根据按键时长变化float horizontal = Input.GetAxis("Horizontal");//修改rigidbody2D的速度,这里只修改水平方向速度,竖直方向保持原状rigidbody2D.velocity = new Vector2(horizontal*playerSpeed, rigidbody2D.velocity.y); }
GetAxisRaw()
的返回值就只有1和-1,不是线性变化可以通过上述方法修改角色朝向,修改
transform.localScale
即可实现角色翻转float forward = Input.GetAxisRaw("Horizontal"); if (forward != 0) {transform.localScale = new Vector3(transform.localScale.x * forward, transform.localScale.y, transform.localScale.z); }
-
将我们自定义的方法在Update()中调用即可
void Update() {move(); }
Transform
直接利用sprite的transform中的position属性,直接在该属性的基础上加上一个new Vector3即可
//获取键盘水平输入
float horizontal = Input.GetAxisRaw("Horizontal");
//在本身位置基础上向量位移
transform.position = transform.position + new Vector3(horizontal * playerSpeed * Time.deltaTime, 0, 0);
其中
Time.deltaTime
是帧之间间隔的时间(由于这里是直接改变物体位置,Update()是每帧执行一次,乘上后代表每秒移动的距离transform有2个position相关的属性:
- position:世界坐标系下物体的坐标
- localPosition:父坐标系下物体的坐标
跳跃
跳跃实现
这里同样使用Rigidbody2D来实现角色的跳跃
在给物体施加有重力的情况下,给物体施加一个向上的初速度,同时要考虑到角色的跳跃判定,即接触到地面时才能进行跳跃
-
定义物体跳跃的初速度
public float jumpSpeed = 5f
-
给物体设定跳跃次数
//初始设定的跳跃次数 public int jumpTimes; //Player还能跳跃的次数 private int canJump;void Start() {//初始Player在空中,可将跳跃次数赋为0canJump = 0; }
-
判断物体是否还在地面上
//Player落地,跳跃次数重置 private void OnCollisionEnter2D(Collision2D collision) {if(collision.gameObject.layer == 3){canJump = jumpTimes;} }//Player离开地面,跳跃次数相应减一(跳离地面不算) private void OnCollisionExit2D(Collision2D collision) {if (collision.gameObject.layer == 3 && rigidbody2D.velocity.y<=0){canJump--;} }
layer==3是根据在unity的Layer中设置的3为Ground并将地面都设为Ground
-
检测到跳跃键,给物体施加向上的初速度
private void jump() {//判断是否按下空格bool isJump = Input.GetKeyDown(KeyCode.Space);//能跳且还有跳跃次数if(isJump && canJump>0){//给个跳跃初速度rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, jumpSpeed);//跳跃次数-1canJump--;} }
-
在Update()中调用jump()函数即可
void Update() {jump(); }
注意,实际游戏场景中有的墙会有摩擦导致物体挂在墙上
新建一个
Physics Material 2D
将摩擦调为0即可
手感优化
2D横版跳跃闯关游戏中最经典的就是马里奥了,通过某UP分析了马里奥的跳跃方式后发现:
- 马里奥的跳跃会根据按键时间的长短来控制跳跃的高度
- 马里奥上升与下降的帧数对比,大约是18:10
因此,可以根据这些分析得出以下优化思路:
- 跳跃实现时给的是初速度,跳跃高度无非就是由加速度决定,而在无附加情况下加速度只由重力决定。因此,可以根据是否按住按键为角色附加向上的加速度(抵消部分重力加速度带来的减速),以此增加角色的跳跃高度。
- 下落时比上升时要快,同样可以给下落时增加一个加速度,使物体能够快速下落。
- 如果觉得物体滞空时间太长,可以考虑增加物体的初速度,并增大全局重力(Project Settings -> Physics 2D -> Gravity),使跳跃高度不变的情况下滞空时间减少
示例:
//跳跃初速度
public float jumpSpeed = 8f;
//初始设定的跳跃次数
public int jumpTimes;
//Player还能跳跃的次数
private int canJump;
//上升时抵消几倍的重力加速度
public float upAddAce = 0.5f;
//下降时附加几倍重力加速度
public float fallAddAce = 1.0f;private void jump()
{//判断是否按下空格bool isJump = Input.GetKeyDown(KeyCode.Space);//能跳且还有跳跃次数if(isJump && canJump>0){//给个跳跃初速度rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, jumpSpeed);//跳跃次数-1canJump--;}//判断是否按住空格bool holdJump = Input.GetKey(KeyCode.Space);//按住空格且物体在上升状态则附加一个向上的加速度if (holdJump && rigidbody2D.velocity.y > 0){rigidbody2D.velocity += Vector2.down * Physics2D.gravity.y * upAddAce * Time.deltaTime;}//物体在下落时,附加向下加速度if(rigidbody2D.velocity.y < 0){rigidbody2D.velocity += Vector2.up * Physics2D.gravity.y * fallAddAce * Time.deltaTime;}
}
相关文章:
Unity2D_角色移动跳跃
水平移动 Rigidbody2D 使用Unity自带的刚体组件,通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动 声明Rigidbody2D属性,以及角色移动速度 public float playerSpeed 5f; private Rigidbody2D rigidbody2D;在Start方法中将rigidbody2D…...
23-GPTs Actions详细解析:如何查找、对接API,及如何编写Schema
目录 1. 挖掘一个API接口,并将其对接到GPTs中1.1 如何寻找API1.2 把API对接到Schema中1.3 Schema中的参数结构本节详细介绍GPTs Actions 中的Schema。如何写、它里面的结构是什么、里面参数的含义。 后续使用GPTs过程中,如何找到自己想要的API,以及如何把找到的API对接到GPT…...
微信小程序canvas画布实现椭圆元素自由缩放、移动功能
目录 实现效果 编辑 一、获取画布信息并绘制背景 二、绘制椭圆...
使用Excel计算--任务完成总工作日时长
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 引言 计算任务完成时间周期,和计算金钱一样,是一个比较细致严谨的工作。 通常,我们可能以为,完成周期形如: 任务完成周期 任务结束时间 - 任务开始时间 但是…...

JavaWeb后端登录校验功能(JWT令牌技术,Cookie技术,Session,拦截技术,过滤器)
目录 一.登录校验功能(解决直接通过路径访问) 1.实现思路 二.会话技术 编辑 1.Cookie技术 2.Session 3.令牌技术 1.简介 2.如何生成和解析 3.令牌的使用 三.Filter过滤器 1.什么是过滤器 2.实现步骤: 3.过滤器执行流程 4.拦截路径 5.过…...
7-上传下载
上传下载 首先创建一张上传文件的表,例如: drop table if exists sys_file_info; create table sys_file_info (file_id int(11) not null auto_increment comment 文件id,file_name varchar(50) default …...

数字图像处理(实践篇)三十六 OpenCV-Python 使用ORB和BFmatcher对两个输入图像的关键点进行匹配实践
目录 一 涉及的函数 二 实践 ORB(Oriented FAST and Rotated BRIEF)是一种特征点检测和描述算法,它结合了FAST关键点检测和BRIEF描述子。ORB算法具有以下优势: ①实时性:能够在实时应用中进行快速的特征点检测和描述。 ②...

算法每日一题: 边权重均等查询 | 公共子祖先
大家好,我是星恒,今天给大家带来的是一道图里面有关公共子祖先的题目,理解起来简单,大家 题目:leetcode 2846 现有一棵由 n 个节点组成的无向树,节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n …...
使用JavaScript和XLSX.js将数据导出为Excel文件
目录 一、安装XLSX.js二、将数据转换为Excel文件 导出数据是Web应用程序中常见的功能之一。在许多情况下,我们需要将数据导出为Excel文件,以便用户可以在本地计算机上查看和编辑数据。在本篇博客中,我们将介绍如何使用JavaScript和XLSX.js将数…...

如何使用YOLOv8训练自己的模型
本文介绍如何用YOLO8训练自己的模型,我们开门见山,直接步入正题。 前言:用yolo8在自己的数据集上训练模型首先需要配置好YOLO8的环境,如果不会配置YOLO8环境可以参考本人主页的另一篇文章 提醒:使用GPU训练会大幅度加…...
机器学习-逻辑回归【手撕】
逻辑回归 在模式识别问题中,所输出的结果是分类,比如是否是猫,这时候无法通过简单的线性回归来实现问题。同时,与线性回归不同的是,逻辑回归是一种名为回归的线性分类器,并常用于二分类,其本质…...

内网安全:NTLM-Relay
目录 NTLM认证过程以及攻击面 NTLM Relay攻击 NTLM攻击总结 实验环境说明 域横向移动:NTLM中继攻击 攻击条件 实战一:NTLM中继攻击-CS转发上线MSF 原理示意图 一. CS代理转发 二. MSF架设路由 三. 适用smb_relay模块进行中继攻击 域横向移动…...

Tensorflow2.0笔记 - tensor的padding和tile
本笔记记录tensor的填充和tile操作,对应tf.pad和tf.tile import tensorflow as tf import numpy as nptf.__version__#pad做填充 # tf.pad( tensor,paddings, modeCONSTANT,nameNone) #1维tensor填充 tensor tf.random.uniform([5], maxval10, dtypetf.int32) pri…...
多媒体测试资源
目录 简介自己整理的文件测试资源列表 简介 音视频测试时,需要许多源文件,这里整理了一些.会持续更新.当然可以使用ffmpeg转换获得需要的文件. 如果知道的这方面资源的,在评论区留言. 自己整理的文件 有视频,图片,音频. 链接:https://pan.baidu.com/s/1vatLmWk…...

Wordpress seo优化该怎么做?
Wordpress作为开源管理系统,目前已然是世界上最流行的cms之一,这不仅仅因为他开源,对用户友好,让任何人都能轻而易举的制作网站,更是因为这套程序对于搜索引擎非常友好,是做谷歌seo的不二之选 Wordpress作为…...

Ultraleap 3Di示例Interactable Objects组件分析
该示例代码位置如下: 分析如下: Hover Enabled:悬停功能,手放在这个模型上,会触发我们手放在这个模型上的悬停功能。此时当手靠近模型的时候,手的模型的颜色会发生改变,反之,则不会…...

Vue自定义成功弹窗H5实现类似于小程序的效果
效果图: <div class"father"><div class"success-box" v-if"isSuccess"><img src"../../assets/insure/success-logo.png" alt""><span>{{ successTitle }}</span></div> &…...
Linux之父:我们正在从C语言转向Rust
最近,Linus在“Torvalds 演讲:人工智能对编程的影响”:“我们正在从C语言转向Rust”。 网友讨论: Linus 选择 Rust 是因为,这是一个中长期解决方案,解决了 IT 世界中缺乏 C/C 人员的实际问题,所…...

C++ qt标题栏组件绘制
本博文源于笔者在学习C qt制作的标题栏组件,主要包含了,最小化,最大化,关闭。读者在看到这篇博文的时候,可以直接查看如何使用的,会使用了,然后进行复制粘贴源码部分即可。 问题来源 想要制作…...

Mysql运维篇(三) MySQL备份与恢复
一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除! 一、物理备份与逻辑备份 1、物理备份:备份数据文件,转储数据库物理文件到某…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...

【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...