【unity实战】Unity实现2D人物双击疾跑

最终效果

在这里插入图片描述

前言

我们要实现的功能是双击疾跑,当玩家快速地按下同一个移动键两次时能进入跑步状态

我假设快速按下的定义为0.2秒内,按下同一按键两次

简单的分析一下需求,实现它的关键在于获得按键按下的时间,我们需要知道第一次按下按键的时间,然后判断规定时间内有没有按下按键

有两种实现方法
第一种
启动一个计时器,判断在计时器结束之前有没有再次按下这个键
在这里插入图片描述
第二种
是分别记录下两次按键的时间,然后用第二次按下的时间减去第一次按下的时间,判断是否小于0.2
在这里插入图片描述
这里我采用第二种方法,为了获取按下的时间,我们需要使用到Unity给我们提供的Time类,里面的Time.time会提供游戏启动到现在运行了多少秒,这个需求还需要我们检测到按键是否被按下,我打算使用Input Manager来实现

public static float GetAxis (string axisName);
public static float GetAxisRaw(string axisName);

GetAxisRaw会在检测到按键后,马上返回1或-1,松开按键后马上变成0
而GetAxis会在检测到按键的时候,从0过渡到1或-1,松开按键后再过渡到0

为了方便,我使用GetAxisRaw来获得输入的时间,当按键按下时意味着GetAxisRaw的返回值为1的绝对值,我们在符合条件的时候使用Time.time来获得当前的时间即可

但显然,我们不希望玩家按下a后马上按下d,还能让人物进入到疾跑状态,所以两个按键的输入时间要分开存储,还有一个需要注意的地方是,当玩家开始走路或疾跑时,a键或d键是按住不放的,所以当玩家在移动的时候,我们要使个bool变量为真,当这个变量为真时,就不再刷新输入的时间

我们设想一下,玩家进入游戏以后,马上按下了一次移动键,如果他电脑开游戏开的特别的快,他第一次按下移动键的时间,离打开游戏不到0.2秒,如果我们存储按键时间的变量,没有初始化,那么会默认赋值为0,当他第一次按下移动时,就会进入到疾跑状态,这很明显是我们不想要看到的bug

所以最后一个要点是给存储按键时间的变量进行初始化,但初始化的只要赋值为多少也是一个值得考虑的问题,如果赋值为一个极大的正数,就算赋值为1万,万一玩家一开始在挂机刚好在10,000.01秒,按一下移动按键,还是会错误地进入到疾跑状态,所以可以给他赋值为,负的最大等待输入时间,如果实在不放心,可以赋值为2倍,这样第一次输入就不会出现bug

经过了这么多的分析,相信你此时此刻已经完全明白了,接下来我们进入到代码实战环节

开始

配置动画,walk为true进入走路动画,run为true进入跑步动画
在这里插入图片描述

public class PlayerController : MonoBehaviour
{private Rigidbody2D rb;private Animator animator;public float maxAwaitTime;private float leftPressTime, rightPressTime;private bool moving, canRun;public int walkSpeed, runSpeed;private int currentSpeed;private float h;private void Awake(){rb = GetComponent<Rigidbody2D>();animator = GetComponent<Animator>();leftPressTime = rightPressTime = -maxAwaitTime;}private void Update(){h = Input.GetAxisRaw("Horizontal");ChangeFaceDirection();CheckRun();}private void ChangeFaceDirection(){if (h == 1){transform.localScale = new Vector3(1, 1, 1);}else if (h == -1){transform.localScale = new Vector3(-1, 1, 1);}}private void CheckRun(){if (h == 1 && !moving){if (Time.time - rightPressTime <= maxAwaitTime){canRun = true;}rightPressTime = Time.time;}if (h == -1 && !moving){if (Time.time - leftPressTime <= maxAwaitTime){canRun = true;}leftPressTime = Time.time;}//取 h 的绝对值if (Mathf.Abs(h) == 1){moving = true;if (canRun){currentSpeed = runSpeed;animator.SetBool("run", true);}else{currentSpeed = walkSpeed;animator.SetBool("walk", true);}}else{animator.SetBool("run", false);animator.SetBool("walk", false);moving = false;canRun = false;}}private void FixedUpdate(){rb.velocity = new Vector2(h * currentSpeed * Time.deltaTime, rb.velocity.y);}
}

效果
在这里插入图片描述

参考

【视频】https://www.bilibili.com/video/BV1YN4113771/

完结

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

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

一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

generate by chatgpt:应用上线前的checkList(部分是我自己的回答)

prompt 1 想象你是一名高级测试工程师&#xff0c;在应用上线前你需要提供一份checklist,请写出来: 作为一名高级测试工程师&#xff0c;以下是我在应用上线前的检查清单&#xff1a; 功能性测试&#xff1a; 检查所有要素和功能是否正常工作。确保满足了所有用户故事/需求。…

STM32G030F6P6 芯片实验 (二)

STM32G030F6P6 芯片实验 (二) Hello World - GPIO LED 尝试了下, 从 0 开始建 MDK HAL M0plus Project, 成功点亮 LED了。 但是 ST-LINK跑着跑着, 码飞了! 不知飞哪去了。 只好拿 MX 建了个 MDK Base。 呼叫 SysTick HAL_Delay(), 切换 LED。 基本上都是一样的用法, 只是换…

MapReduce WordCount程序实践(IDEA版)

环境 Linux&#xff1a;Hadoop2.x Windows&#xff1a;jdk1.8、Maven3、IDEA2021 步骤 编程分析 编程分析包括&#xff1a; 1.数据过程分析&#xff1a;数据从输入到输出的过程分析。 2.数据类型分析&#xff1a;Map的输入输出类型&#xff0c;Reduce的输入输出类型&#x…

关于curl在线上环境报400的问题

问题&#xff1a;测试环境调用三方接口正常&#xff0c;线上环境接口报错400。 排查&#xff1a;两个方向&#xff1a;1代码问题&#xff0c;2线上ip没在三方控制后台加白名单。 首先postman模拟请求三方接口正常&#xff0c;于是在postman生成curl指令。 curl --location --r…

蓝桥杯每日一题2023.11.2

题目描述 等差素数列 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题我们需要求出最小的公差并且长度为10&#xff0c; 1.确保序列开始为素数 2.确定枚举的个数 注意&#xff1a;序列中数只是d的变化&#xff0c;可以通过此计算将开始数字后9个数字都计算出来&#xff0c;d是…

【Qt之QtXlsx模块】安装及使用

1. 安装Perl&#xff0c;编译QtXlsx源码用 可以通过命令行进行查看是否已安装Perl。 下载及安装传送门&#xff1a;链接: https://blog.csdn.net/MrHHHHHH/article/details/134233707?spm1001.2014.3001.5502 1.1 未安装 命令&#xff1a;perl --version 显示以上是未安装…

C#中LINQtoSQL只能在.NetFramework下使用,不能在.net 下使用

目录 一、在net7.0下无法实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 二、在.NetFramework4.8下成功实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 三、结论 四、理由 本文是个人观点&#xff0c;因为我百般努力在.net7.0下无法实现LINQtoSQL的…

海康Visionmaster-全局脚本:方案加载完成信号发给通 信设备的方法

需要在方案加载完成后&#xff0c;发送加载完成信号到全局变量&#xff0c;发送给通信设备。 全局脚本的使用可以通过打开示例&#xff0c;完成常用的基本功能开发。 打开全局通信代码后&#xff0c;在脚本中添加代码

springboot前后端时间类型传输

springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …

vue2知识补充

1.页面传参及传参之后刷新页面数据丢失 query参数有多层对象时&#xff0c;刷新丢失可以使用JSON.stringify解决 params参数丢失&#xff1a;还没试过怎么解决 methods: {// query和params区别// query类似 get&#xff0c;跳转之后页面 url后面会拼接参数,类似?id1&#xf…

http和https分别是什么?

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;HTTP Secure&#xff09;是互联网上应用最为广泛的两类协议&#xff0c;都是用于在网络中进行数据交换。 1.HTTP&#xff1a; HTTP是一种无状态的协议&#xff0c;即服务器并不保持与客户端的连接…

Proteus仿真--1602LCD显示电话拨号键盘按键实验(仿真文件+程序)

本文主要介绍基于51单片机的LCD1602显示电话拨号键盘按键实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中右下方12个按键模拟仿真手机键盘&#xff0c;使用方法同手机键一样&#xff0c;拨打手机号码则在液晶显示屏上显示对应的号码 仿真运行…

DDoS类型攻击对企业造成的危害

超级科技实验室的一项研究发现&#xff0c;每十家企业中&#xff0c;有四家(39%)企业没有做好准备应对DDoS攻击&#xff0c;保护自身安全。且不了解应对这类攻击最有效的保护手段是什么。 由于缺乏相关安全知识和保护&#xff0c;使得企业面临巨大的风险。 当黑客发动DDoS攻击…

译文:我们如何使 Elasticsearch 7.11 中的 date_histogram 聚合比以往更快

这篇文章是ES7.11版本的文章&#xff0c;主要学习的是思路&#xff0c;记录在这里留作以后参考用。 原文地址&#xff1a;https://www.elastic.co/cn/blog/how-we-made-date-histogram-aggregations-faster-than-ever-in-elasticsearch-7-11 正文开始&#xff1a; Elasticsea…

【数组】有序数组的平方

## 977.有序数组的平方 力扣题目链接 (opens new window) 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10]输出&#xff1a;[0,…

初阶JavaEE(15)(Cookie 和 Session、理解会话机制 (Session)、实现用户登录网页、上传文件网页、常用的代码片段)

接上次博客&#xff1a;初阶JavaEE&#xff08;14&#xff09;表白墙程序-CSDN博客 Cookie 和 Session 你还记得我们之前提到的Cookie吗&#xff1f; Cookie是HTTP请求header中的一个属性&#xff0c;是一种用于在浏览器和服务器之间持久存储数据的机制&#xff0c;允许网站…

g.Grafana之Gauge的图形说明

直接上操作截图 1. 创建一个新的Dashboard 2.为Dashboard创建变量 【General】下的Name与Label的名称自定义 【Query options】 下的Group可以填写Zabbix内的所有组/.*/ , 然后通过Regex正则过滤需要的组名 3.设置Dashboard的图形 我使用文字来描述下这个图 1.我们在dash…

Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测

目录 一、环境准备二、下载 ONNX 模型文件2.1 Azure 机器学习工作室2.2 Azure 机器学习 Python SDK2.3 生成模型进行批量评分多类图像分类 三、加载标签和 ONNX 模型文件四、获取 ONNX 模型的预期输入和输出详细信息ONNX 模型的预期输入和输出格式多类图像分类 多类图像分类输入…

Intel oneAPI笔记(2)--jupyter官方文档(oneAPI_Intro)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/01_oneAPI_Intro文档的学习记录&#xff0c;包含对SYCL、DPC extends SYCL、oneAPI Programming models等介绍和SYCL代码的初步演示等内容 oneAPI编程模型综述 oneAPI编程模型提供了一个全面而统一的开发人员工具组合&#xff0…

【ROS】Nav2源码之nav2_behavior_tree详解

【ROS】郭老二博文之:ROS目录 1、简介 nav2_bt_navigator实现ROS2节点以行为树的方式来处理。 nav2_behavior_tree模块提供如下功能: 一个c++模板类,可以轻松地将ROS2 动作(actions)和服务(services)集成到行为树(Behavior Trees)中。特定于导航的行为树节点。通用的Behav…