欢迎光临
我们一直在努力

Unity 2D游戏开发 Ruby‘s Adventure 3:角色控制器与键盘输入

角色控制器和键盘输入

在上一教程中,你编写了首个简单脚本实现 Ruby 在屏幕上移动。本教程将为游戏添加键盘输入控制逻辑,让角色能通过方向键自由移动,并解决帧率对移动速度的影响问题。

通过键盘输入控制移动

此前的脚本让 Ruby 每帧固定修改 X 坐标实现移动,现在调整核心逻辑:仅在玩家按下方向键时,角色才向对应方向移动,实现该功能的核心是使用 Unity 输入系统,该系统包含预设的输入设置和可直接调用的输入查询代码。

查看默认输入设置

Unity 内置了标准化的输入设置,用于定义游戏支持的输入类型,查看步骤如下:

  • 打开 Unity 编辑器的 Edit > Project Settings 选项;

  • 在弹出的设置窗口中,选择 Input Manager 页面即可查看。

  • 1

    Input 页面的 Axes 列表定义了所有玩家输入轴,轴的返回值范围为 -1 ~ 1,不同输入设备的轴值逻辑为:

    • 游戏手柄摇杆:左/下为-1、居中为0、右/上为1;

    • 键盘按键:每个轴由「负值键」和「正值键」组成,负值键按下时轴值为-1,正值键按下时轴值为1。

    以水平移动轴(Horizontal)为例,Unity 预设配置为:

    • 负值键:left(键盘左箭头键);

    • 正值键:right(键盘右箭头键)。

    修改代码以使用输入轴

    调整 RubyController 脚本,让角色响应水平轴的键盘输入,具体操作和代码如下:

  • 在 Unity 项目面板中,双击 RubyController 脚本打开代码编辑器;

  • 对脚本中的 Update 函数进行修改,完整代码如下:

  • public class RubyController : MonoBehaviour
    {
    // 首次帧更新前调用,初始化逻辑写在此处
    void Start()
    {
    }

    // 每帧调用一次,处理帧更新逻辑
    void Update()
    {
    // 获取水平轴的实时输入值
    float horizontal = Input.GetAxis("Horizontal");
    // 打印轴值到控制台,用于调试验证
    Debug.Log(horizontal);

    // 获取角色当前的世界位置
    Vector2 position = transform.position;
    // 根据水平轴输入值修改X坐标,控制左右移动
    position.x += 0.1f * horizontal;
    // 将修改后的位置赋值给角色,实现实际移动
    transform.position = position;
    }
    }

    保存脚本修改,Unity 会自动编译脚本。

    脚本核心逻辑解析

    1. 声明浮点变量接收轴值

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

    • 定义浮点型变量 horizontal,用于存储带小数点的轴值数据;

    • 调用 Unity 内置函数 Input.GetAxis("Horizontal"),直接获取水平轴的实时输入值,无需自行编写输入检测逻辑。

    2. 函数与参数的使用规则
    • GetAxis 是 Unity 封装好的内置函数,开发者可直接调用,无需实现函数内部逻辑;

    • 括号内的 "Horizontal" 为函数参数,用于指定要查询的输入轴名称,参数为字符串时必须用双引号包裹,避免与代码关键字混淆。

    3. 点运算符的作用

    Input.GetAxis 中的 . 为点运算符,其核心作用是归类功能相关的函数/变量,将输入相关的所有逻辑都封装在 Input 类下,让代码结构更整洁,便于查找和调用。

    4. 控制台打印的调试作用

    Debug.Log(horizontal);

    • Debug.Log 是 Unity 最常用的调试函数,可将参数内容实时输出到控制台窗口;

    • 此处用于验证水平轴的输入值是否符合预期,是开发中排查输入逻辑问题的常用手段。

    5. 基于轴值的移动逻辑

    position.x += 0.1f * horizontal;

    通过轴值的正负和零,精准控制角色的移动状态,逻辑如下:

    • 按左箭头键:horizontal=-1 → 角色X坐标减少0.1,实现左移;

    • 按右箭头键:horizontal=1 → 角色X坐标增加0.1,实现右移;

    • 不按任何方向键:horizontal=0 → 角色X坐标不变,保持静止。

    测试修改效果

    完成脚本修改后,可在 Unity 中测试水平移动效果,步骤如下:

  • 返回 Unity 编辑器,点击顶部的 Play 按钮进入运行模式;

  • 按下键盘的左/右箭头键,Ruby 应向对应方向移动,松开按键后角色静止;

  • 打开 Unity 的 Console 窗口,可看到窗口中实时打印出水平轴的输入值。

  • 2

    注意事项:

  • Console 窗口顶部有 Collapse 按钮,启用后会合并相同值的日志行,减少冗余输出;禁用则每帧打印一行,因 Update 函数会每帧执行;

  • 控制台中的轴值并非严格的 -1/0/1,Unity 会对轴值做平滑处理,让角色移动更顺滑,该效果可在 Input Manager 中手动禁用,具体可参考 Input Manager 文档。

  • 练习:添加垂直移动

    掌握水平移动的实现逻辑后,可自行实现垂直移动功能,完成从单方向到双方向的移动控制升级。

    练习准备工作

    先删除脚本中用于调试的日志代码,验证轴值后该代码无实际功能,删除后让代码更简洁:

    Debug.Log(horizontal);

    开发提示:Debug.Log 可在脚本的任意位置使用,用于输出变量值、排查代码逻辑问题,是游戏开发中必备的调试手段。

    实现垂直移动的核心提示

    自行编写垂直移动逻辑时,可参考以下3个核心提示,降低实现难度:

  • 键盘上下方向键对应 Unity 内置的 Vertical 输入轴,与水平轴的调用逻辑一致;

  • 角色的垂直位置由 Vector2 中的 y 值控制,与水平位置的 x 值用法一致;

  • 编写代码过程中记得及时保存,避免因意外情况丢失代码。

  • 垂直移动参考实现代码

    public class RubyController : MonoBehaviour
    {
    void Start()
    {
    }

    void Update()
    {
    // 分别获取水平、垂直轴的实时输入值
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");

    // 获取角色当前位置,同时修改x、y坐标实现双方向移动
    Vector2 position = transform.position;
    position.x += 0.1f * horizontal;
    position.y += 0.1f * vertical;
    // 将修改后的位置赋值给角色,实现实际移动
    transform.position = position;
    }
    }

    练习总结

    垂直移动的实现逻辑与水平移动完全一致,核心只需两步:

  • 声明浮点型变量 vertical,存储 Input.GetAxis("Vertical") 的返回值,获取垂直轴输入;

  • 根据 vertical 的值修改角色的 y 坐标,实现上下移动;

  • 同时按下斜向方向键(如右上、左下)时,两个轴的数值均不为0,角色会沿对角线移动,实现自由的二维移动。

  • 时间与帧率:让移动速度与帧率无关

    实现自由移动后,需解决一个核心问题:不同设备的帧率差异会导致角色移动速度不一致,本小节将讲解该问题的原因和解决方案。

    问题根源:帧率直接影响移动速度

    Unity 编辑器默认每秒至少渲染 60 帧,若通过代码强制降低帧率(如改为 10 帧/秒),会明显发现角色移动变慢,核心原因如下:

    • 60 帧/秒:每帧移动 0.1 单位 → 角色每秒移动 0.1×60=6 单位;

    • 10 帧/秒:每帧移动 0.1 单位 → 角色每秒移动 0.1×10=1 单位。

    不同玩家的设备性能不同,运行游戏的帧率也会不同(如低配机30帧、高配机120帧),若不解决该问题,会导致游戏体验不一致。

    解决方案:基于时间的移动速度计算

    要让角色在不同帧率下保持相同的移动速度,需将每帧移动距离改为每秒移动距离,核心是在移动代码中乘以 Time.deltaTime。

    Time.deltaTime 是 Unity 的内置变量,代表渲染一帧所消耗的时间,其值会随帧率动态变化,帧率越高,每帧耗时越短,反之则越长。

    脚本修改代码

    public class RubyController : MonoBehaviour
    {
    void Start()
    {
    // 以下两行仅用于测试帧率影响,后续开发可删除
    // QualitySettings.vSyncCount = 0;
    // Application.targetFrameRate = 10;
    }

    void Update()
    {
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");

    Vector2 position = transform.position;
    // 乘以 Time.deltaTime,将移动速度基准改为“单位/秒”
    position.x += 0.1f * horizontal * Time.deltaTime;
    position.y += 0.1f * vertical * Time.deltaTime;
    transform.position = position;
    }
    }

    关键逻辑解析
  • 注释的使用:代码行前的 // 为单行注释标记,编译器会忽略注释内容,可用于:

    • 为代码添加说明,方便自己或其他开发者理解;

    • 临时禁用代码,无需直接删除,后续需要时移除 // 即可恢复。

  • Time.deltaTime 的动态特性:

    • 10 帧/秒 → deltaTime=0.1 秒/帧;

    • 60 帧/秒 → deltaTime≈0.017 秒/帧;

    • 移动距离计算公式:实际移动距离 = 每秒移动速度 × Time.deltaTime,最终实现移动速度与帧率解耦。

  • 调整角色的实际移动速度

    将移动代码乘以 Time.deltaTime 后,0.1 单位/秒的移动速度会显得过慢,角色几乎无法移动,需将基础速度值调大。

    游戏开发中,角色奔跑的合理速度为 3~4 单位/秒,修改后的核心移动代码如下:

    position.x += 3.0f * horizontal * Time.deltaTime;
    position.y += 3.0f * vertical * Time.deltaTime;

    最终完整脚本

    将测试代码删除、速度值调整后,RubyController 脚本的最终完整代码如下,可直接用于游戏开发:

    public class RubyController : MonoBehaviour
    {
    void Start()
    {
    }

    void Update()
    {
    // 获取水平、垂直轴输入值
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");

    // 计算并更新角色位置
    Vector2 position = transform.position;
    position.x += 3.0f * horizontal * Time.deltaTime;
    position.y += 3.0f * vertical * Time.deltaTime;
    transform.position = position;
    }
    }

    总结

    本教程围绕 Ruby 的移动控制展开,核心掌握以下3个关键知识点,也是 Unity 2D 游戏角色控制的基础:

  • 利用 Unity 内置的输入轴(Horizontal/Vertical),通过 Input.GetAxis 快速处理键盘方向键输入,无需手动检测按键;

  • 通过修改 Vector2 的 x、y 坐标,结合输入轴值,实现角色的二维自由移动;

  • 利用 Time.deltaTime 让移动速度与帧率解耦,保证角色在不同设备、不同帧率下的移动速度一致,提升游戏的兼容性和体验。

  • 下一教程将暂时脱离代码编写,学习游戏场景的美化技巧,包括背景优化、瓦片地图使用、场景装饰等内容,让游戏的视觉效果更丰富。

    赞(0)
    未经允许不得转载:171主机测评 » Unity 2D游戏开发 Ruby‘s Adventure 3:角色控制器与键盘输入
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址