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

Unity做2D小游戏4------让角色动起来

Unity有一些自带的快捷键

在 Unity 中,点击“Edit” -> “Project Settings” -> “Input Manager”

例如:我们下面会用到的,“Horizontal” 与键盘上的左右方向键(← 和 →)以及 “A” 和 “D” 键关联,还有Jump关联键盘上的空格键。

编写人物左右移动的脚本代码:

使用 Input.GetAxisRaw 方法获取玩家在水平方向上的输入,返回值为 -1(向左)、0(静止)或 1(向右),将其存储在变量 dirX 中。

rb.velocity = new Vector2(dirX * 7f, rb.velocity.y);:通过修改 Rigidbody2D 组件的速度属性来控制游戏对象在水平方向上的移动。Vector2 是二维向量,dirX * 7f 计算出水平方向的速度,垂直方向的速度保持不变。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Playermovement : MonoBehaviour
{
    private Rigidbody2D rb;
    // Start is called before the first frame update 第一次运行
    void Start()
    {
        rb=GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame  反复运行
    void Update()
    {
        //水平方向速度
        float dirX = Input.GetAxisRaw("Horizontal");
        rb.velocity = new Vector2(dirX * 7f,rb.velocity.y);

        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, 7f);
        }
    }
}

创建角色的动画

在下面的地址右键“create” - “Animation”,就会成功创建一个动画资源。

然后将这个动画资源拖到左侧Hierarchy的Player文件中,会出现一个三个小方框的Animator,名字为Player,后续在这里管理各个动画之间的关系。

选择一个动画,这里选择的是静止动画Idle,按住Shift,将图片全部选中,然后拖动到Animation的右侧,也就是时间轴下方区域。

可以设置Samples值,值越小,间距越大,动画越慢。

点击这个Animation,把Loop Time打开,这样动画就会循环播放了。

静止状态的人物动画就做好了。

接下来做奔跑的角色动画,首先也是创建一个Animation,同样把这个动画资源拖动到左侧的Player文件中,再打开这个Animation。

可以看到如下图,这里的下拉菜单可以选择新建的Animation,选择它,再次把奔跑的图片全部拖动到上面。

奔跑状态的人物动画就做好了,但是这个时候,打开游戏发现,奔跑时人物并不做给出指定的动作动画。

这个时候就需要Animator来管理动画之间的联系,打开Animator,右键”PlayerStatic“ - ”Make Transition“,给奔跑和静止状态建立桥梁。如下图所示。

点击"Parameters" - "+" - "Bool",添加一个布尔类型的值。

点击两个桥梁右边的箭头,然后点击右侧Conditions的加号,出现我们刚刚添加的布尔类型。

如果是true,就会从静止状态变为运动状态。

左边的箭头就相应的设置false

再次设置脚本内容,完成奔跑和静止状态的转换。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Playermovement : MonoBehaviour
{
    private Rigidbody2D rb;
    private SpriteRenderer sprite;
    private Animator anim;
    private float dirX = 0f;

    [SerializeField] private float moveSpeed = 7f;
    [SerializeField] private float jumpForce = 7f;
    //使用[SerializeField]属性可以在 Unity 编辑器中对这两个值进行可视化设置
    // Start is called before the first frame update 第一次运行
    private void Start()
    {
        rb=GetComponent<Rigidbody2D>();
        sprite = GetComponent<SpriteRenderer>();
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame  反复运行
    private void Update()
    {
        //水平方向速度
        dirX = Input.GetAxisRaw("Horizontal");
        rb.velocity = new Vector2(dirX * 7f,rb.velocity.y);

        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpForce);
        }
        UpdateAnimationState();
    }
    private void UpdateAnimationState()
    {
        if (dirX > 0f)
        {
            anim.SetBool("running", true);
            sprite.flipX = false;
        }
        else if (dirX < 0f)
        {
            anim.SetBool("running", true);
            sprite.flipX = true;//反方向走,人物会翻转
        }
        else
        {
            anim.SetBool("running", false);
        }
    }
}

如果进入游戏,发现人物的奔跑和静止转换不够流畅,可以在Animation中把Has Exit Time取消勾选。

Has Exit Time:勾选表示当前动画状态必须播放完其完整时长,才会依据下方条件判断是否进行状态转换。

现在,打开游戏,控制角色左右移动就是有动画转换的。


http://www.kler.cn/a/542918.html

相关文章:

  • git本地建的分支,删除后内容还能找回
  • 基于YOLOv8+PyQt5的目标检测系统(环境配置+数据集+Python源码+PyQt5界面)——持续更新中
  • 将DeepSeek接入Excel实现交互式对话
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》070-商业项目:电商后台管理系统实战(商品管理模块的开发)
  • MATLAB中extract 函数用法
  • 电脑重启后vscode快捷方式失效,找不到code.exe
  • RDKit 给3D信息缺失的sdf生成三维结构
  • 黑马Redis详细笔记(实战篇---短信登录)
  • 电脑出现蓝屏英文怎么办?查看修复过程
  • 【物联网】电子电路基础知识
  • RocketMQ、RabbitMQ、Kafka 的底层实现、功能异同、应用场景及技术选型分析
  • 华为openEuler部署docker
  • CCFCSP第34次认证第一题——矩阵重塑(其一)
  • DeepSeek应用——与word的配套使用
  • 活动预告 | 解锁 Excel 新境界 —— AI 技术赋能下的数据分析超级引擎!
  • 【C++高并发服务器WebServer】-17:阻塞/非阻塞和同步/异步、五种IO模型、Web服务器
  • 【Windows/C++/yolo开发部署04】使用CLI 和 python进行推理
  • 理解UML中的四种关系:依赖、关联、泛化和实现
  • 美团智能外呼机器人意图训练全流程
  • docker发布自己的镜像
  • VSCode Cline 插件快速接入 DeepSeek API,提升本地深度学习效率
  • 讲解一下SpringBoot的RPC连接
  • Redis常见数据结构
  • 利用Python和SQLite进行数据处理与优化——从数据库操作到高级数据压缩
  • 除了try...catch,还有其他处理异步错误的方法吗?
  • clickhouse replicatedmergetree 恢复