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

Unity2D_角色移动跳跃

水平移动

Rigidbody2D

使用Unity自带的刚体组件,通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动

  1. 声明Rigidbody2D属性,以及角色移动速度

    public float playerSpeed = 5f;
    private Rigidbody2D rigidbody2D;
    
  2. 在Start方法中将rigidbody2D绑定上物体的对应组件

    void Start()
    {rigidbody2D = GetComponent<Rigidbody2D>();
    }
    
  3. 读取键盘,并修改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);
    }
    
  4. 将我们自定义的方法在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相关的属性:

  1. position:世界坐标系下物体的坐标
  2. localPosition:父坐标系下物体的坐标

跳跃

跳跃实现

这里同样使用Rigidbody2D来实现角色的跳跃

在给物体施加有重力的情况下,给物体施加一个向上的初速度,同时要考虑到角色的跳跃判定,即接触到地面时才能进行跳跃

  1. 定义物体跳跃的初速度

    public float jumpSpeed = 5f
    
  2. 给物体设定跳跃次数

    //初始设定的跳跃次数
    public int jumpTimes;
    //Player还能跳跃的次数
    private int canJump;void Start()
    {//初始Player在空中,可将跳跃次数赋为0canJump = 0;
    }
    
  3. 判断物体是否还在地面上

    //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

  4. 检测到跳跃键,给物体施加向上的初速度

    private void jump()
    {//判断是否按下空格bool isJump = Input.GetKeyDown(KeyCode.Space);//能跳且还有跳跃次数if(isJump && canJump>0){//给个跳跃初速度rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, jumpSpeed);//跳跃次数-1canJump--;}
    }
    
  5. 在Update()中调用jump()函数即可

    void Update()
    {jump();
    }
    

注意,实际游戏场景中有的墙会有摩擦导致物体挂在墙上

新建一个Physics Material 2D将摩擦调为0即可

手感优化

2D横版跳跃闯关游戏中最经典的就是马里奥了,通过某UP分析了马里奥的跳跃方式后发现:

  1. 马里奥的跳跃会根据按键时间的长短来控制跳跃的高度
  2. 马里奥上升与下降的帧数对比,大约是18:10

因此,可以根据这些分析得出以下优化思路:

  1. 跳跃实现时给的是初速度,跳跃高度无非就是由加速度决定,而在无附加情况下加速度只由重力决定。因此,可以根据是否按住按键为角色附加向上的加速度(抵消部分重力加速度带来的减速),以此增加角色的跳跃高度。
  2. 下落时比上升时要快,同样可以给下落时增加一个加速度,使物体能够快速下落。
  3. 如果觉得物体滞空时间太长,可以考虑增加物体的初速度,并增大全局重力(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自带的刚体组件&#xff0c;通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动 声明Rigidbody2D属性&#xff0c;以及角色移动速度 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) 引言 计算任务完成时间周期&#xff0c;和计算金钱一样&#xff0c;是一个比较细致严谨的工作。 通常&#xff0c;我们可能以为&#xff0c;完成周期形如&#xff1a; 任务完成周期 任务结束时间 - 任务开始时间 但是…...

JavaWeb后端登录校验功能(JWT令牌技术,Cookie技术,Session,拦截技术,过滤器)

目录 一.登录校验功能&#xff08;解决直接通过路径访问&#xff09; 1.实现思路 二.会话技术 ​编辑 1.Cookie技术 2.Session 3.令牌技术 1.简介 2.如何生成和解析 3.令牌的使用 三.Filter过滤器 1.什么是过滤器 2.实现步骤&#xff1a; 3.过滤器执行流程 4.拦截路径 5.过…...

7-上传下载

上传下载 首先创建一张上传文件的表&#xff0c;例如&#xff1a; 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算法具有以下优势: ①实时性:能够在实时应用中进行快速的特征点检测和描述。 ②...

算法每日一题: 边权重均等查询 | 公共子祖先

大家好&#xff0c;我是星恒&#xff0c;今天给大家带来的是一道图里面有关公共子祖先的题目&#xff0c;理解起来简单&#xff0c;大家 题目&#xff1a;leetcode 2846 现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n …...

使用JavaScript和XLSX.js将数据导出为Excel文件

目录 一、安装XLSX.js二、将数据转换为Excel文件 导出数据是Web应用程序中常见的功能之一。在许多情况下&#xff0c;我们需要将数据导出为Excel文件&#xff0c;以便用户可以在本地计算机上查看和编辑数据。在本篇博客中&#xff0c;我们将介绍如何使用JavaScript和XLSX.js将数…...

如何使用YOLOv8训练自己的模型

本文介绍如何用YOLO8训练自己的模型&#xff0c;我们开门见山&#xff0c;直接步入正题。 前言&#xff1a;用yolo8在自己的数据集上训练模型首先需要配置好YOLO8的环境&#xff0c;如果不会配置YOLO8环境可以参考本人主页的另一篇文章 提醒&#xff1a;使用GPU训练会大幅度加…...

机器学习-逻辑回归【手撕】

逻辑回归 在模式识别问题中&#xff0c;所输出的结果是分类&#xff0c;比如是否是猫&#xff0c;这时候无法通过简单的线性回归来实现问题。同时&#xff0c;与线性回归不同的是&#xff0c;逻辑回归是一种名为回归的线性分类器&#xff0c;并常用于二分类&#xff0c;其本质…...

内网安全:NTLM-Relay

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

Tensorflow2.0笔记 - tensor的padding和tile

本笔记记录tensor的填充和tile操作&#xff0c;对应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转换获得需要的文件. 如果知道的这方面资源的,在评论区留言. 自己整理的文件 有视频,图片,音频. 链接&#xff1a;https://pan.baidu.com/s/1vatLmWk…...

Wordpress seo优化该怎么做?

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

Ultraleap 3Di示例Interactable Objects组件分析

该示例代码位置如下&#xff1a; 分析如下&#xff1a; Hover Enabled&#xff1a;悬停功能&#xff0c;手放在这个模型上&#xff0c;会触发我们手放在这个模型上的悬停功能。此时当手靠近模型的时候&#xff0c;手的模型的颜色会发生改变&#xff0c;反之&#xff0c;则不会…...

Vue自定义成功弹窗H5实现类似于小程序的效果

效果图&#xff1a; <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

最近&#xff0c;Linus在“Torvalds 演讲&#xff1a;人工智能对编程的影响”&#xff1a;“我们正在从C语言转向Rust”。 网友讨论&#xff1a; Linus 选择 Rust 是因为&#xff0c;这是一个中长期解决方案&#xff0c;解决了 IT 世界中缺乏 C/C 人员的实际问题&#xff0c;所…...

C++ qt标题栏组件绘制

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

Mysql运维篇(三) MySQL备份与恢复

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 一、物理备份与逻辑备份 1、物理备份&#xff1a;备份数据文件&#xff0c;转储数据库物理文件到某…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 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 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

FFmpeg:Windows系统小白安装及其使用

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

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

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

【QT控件】显示类控件

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