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

【Unity基础】Input中GetAxis和GetAxisRaw的区别

一句话描述:GetAxis使用了平滑过渡,而GetAxisRaw是直接改变

在Unity中,Input.GetAxisRawInput.GetAxis 都用于获取输入设备的轴向输入(例如键盘、鼠标或手柄的摇杆),但它们的工作方式和返回值有细微的区别。

1. Input.GetAxis

  • 返回值Input.GetAxis 会返回一个平滑的值,该值在 -11 之间,基于输入的渐变变化。

  • 平滑过渡:当你按下键盘按键或移动手柄时,Unity 会让输入值逐渐从 0 变为目标值(-11)。同样地,当你松开按键时,值会逐渐从目标值返回到 0

  • 适合的场景:这种平滑的变化更适合需要平滑运动过渡的情况,比如控制角色移动时逐渐加速或减速,控制摄像机平滑旋转等。

float move = Input.GetAxis("Horizontal");

如果你用这个代码检测水平轴,当按住键盘 A 键(左移)或 D 键(右移)时,返回值不会立即变为 -11,而是逐渐从 0 过渡到目标值。

2. Input.GetAxisRaw

  • 返回值Input.GetAxisRaw 会返回一个离散的值,即它不会进行平滑处理,直接返回 -101

  • 即时响应:按下按键时,会立即返回 -11,松开按键时会直接返回 0。没有平滑过渡,值会立刻变化。

  • 适合的场景:适合需要即时反应的场景,比如不需要平滑过渡的移动或一些精确的检测。

float move = Input.GetAxisRaw("Horizontal");

在这个例子中,当按下 A 键或 D 键时,返回值会立即变为 -11,当松开时,立即返回 0

示例演示

为了演示 Input.GetAxisInput.GetAxisRaw 的区别,我们可以设计一个简单的例子,在 Unity 中创建一个2D小方块,通过左右键(或手柄)控制其移动。Input.GetAxis 会让方块的移动变得平滑过渡,而 Input.GetAxisRaw 则会立即响应按键并且没有过渡效果。

场景描述:

  1. 创建一个方块对象。
  2. 使用 Input.GetAxisInput.GetAxisRaw 来控制方块左右移动。
  3. 通过观察方块的移动方式,清楚地看到平滑移动和即时移动的区别。

具体步骤:

1. 创建场景:
  • 打开Unity,新建一个2D场景。
  • Hierarchy 面板中右键 -> Create -> 2D Object -> Sprite -> Square,创建一个小方块。
  • 将其命名为 Player,并给它添加一个 Rigidbody2D 组件,确保其可以与物理系统交互。
2. 创建控制脚本:

创建一个新的 C# 脚本,命名为 PlayerController,并挂载到 Player 对象上。

在脚本中,我们编写两种不同的控制方法:

  • 一种使用 Input.GetAxis 来控制移动。
  • 另一种使用 Input.GetAxisRaw 来控制移动。
using UnityEngine;public class PlayerController : MonoBehaviour
{public float moveSpeed = 5f;  // 移动速度public bool useRawInput = false;  // 用于切换 GetAxis 和 GetAxisRawprivate Rigidbody2D rb;void Start(){rb = GetComponent<Rigidbody2D>();}void Update(){float move;// 根据 useRawInput 选择是使用 GetAxis 还是 GetAxisRawif (useRawInput){// 使用 GetAxisRaw:即时反应move = Input.GetAxisRaw("Horizontal");}else{// 使用 GetAxis:平滑过渡move = Input.GetAxis("Horizontal");}// 移动玩家rb.velocity = new Vector2(move * moveSpeed, rb.velocity.y);}
}
3. 设置控制方式的切换:
  • Inspector 面板中,可以通过勾选 useRawInput 来切换使用 Input.GetAxis 还是 Input.GetAxisRaw。默认情况下,useRawInputfalse,即使用 Input.GetAxis 实现平滑移动。
  • 如果勾选 useRawInput,就会改为使用 Input.GetAxisRaw,实现即时响应的移动。
4. 运行和观察:
  • 第一步:不勾选 useRawInput,运行场景,按下左右方向键(或 A/D 键),你会看到小方块移动时有一个平滑的加速和减速,当按住键不放时,它会逐渐从静止加速移动。
  • 第二步:勾选 useRawInput,再次运行场景。这时按下方向键时,方块会立即开始以恒定速度移动,没有任何加速和减速的过渡。

示例效果:

  1. 使用 Input.GetAxis(默认设置,平滑过渡)

    • 方块的移动会有一个小延迟,逐渐加速到最大速度,松开按键时也会逐渐减速。
    • 适合像赛车游戏或平台跳跃游戏中的角色移动,让角色的移动更加自然和顺滑。
  2. 使用 Input.GetAxisRaw(即时反应,无平滑)

    • 方块在按下方向键时立即开始移动,松开按键时会立即停止
    • 更适合需要精准控制的游戏,如格斗游戏或街机类型的游戏。

通过这个例子,你可以清晰地看到 Input.GetAxisInput.GetAxisRaw 的差异,并根据不同的需求选择合适的输入方式。

示例一:持续按键时的效果,两种方法达到的坐标点一样,区别在于过程是否平滑。

示例二:单次按键,GetAxisRaw在每次按键时的变化值要明显比GetAxis方法大。

参考:

Unity - Scripting API: Input

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Android】程序开发组件—探究Jetpack
  • 【数据结构】顺序表和链表——链表(包含大量经典链表算法题)
  • 资深研发的心愿:PostgreSQL未来若能加入这些功能,将更臻完善
  • 数据结构详细解释
  • 位运算+前缀和+预处理,CF 1017D - The Wu
  • CCF推荐A类会议和期刊总结(计算机网络领域)- 2022
  • 5、Kafka
  • HTML高级技术解析与实践指南
  • Windows环境下 VS2022 编译 LAME 源码
  • 【Redis】为什么选择 Redis 做缓存?
  • 【ShuQiHere】初识 Node.js:服务器端 JavaScript 的强大之处
  • Spring1~~~
  • ONU测试需要那些协议的学习
  • 第三章 Mybatis 常用工具
  • 【学习笔记】手写 Tomcat -- 预备知识
  • 《剑指offer》分解让复杂问题更简单
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • github指令
  • IndexedDB
  • JavaScript 基本功--面试宝典
  • JavaScript 一些 DOM 的知识点
  • LeetCode18.四数之和 JavaScript
  • magento 货币换算
  • Mithril.js 入门介绍
  • PAT A1120
  • REST架构的思考
  • Shell编程
  • Vue 2.3、2.4 知识点小结
  • 彻底搞懂浏览器Event-loop
  • 聊聊flink的TableFactory
  • 如何编写一个可升级的智能合约
  • # SpringBoot 如何让指定的Bean先加载
  • (04)odoo视图操作
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (分布式缓存)Redis持久化
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (算法)求1到1亿间的质数或素数
  • (转)Google的Objective-C编码规范
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (轉)JSON.stringify 语法实例讲解
  • **python多态
  • .NET Core引入性能分析引导优化
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET使用存储过程实现对数据库的增删改查
  • .net通过类组装数据转换为json并且传递给对方接口
  • .NET文档生成工具ADB使用图文教程
  • .NET业务框架的构建
  • .net中应用SQL缓存(实例使用)
  • /usr/bin/env: node: No such file or directory
  • @Transactional类内部访问失效原因详解
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明