用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:下(人物动画)

embedded/2024/9/22 19:56:20/

上个博客我们做出了人物的动画机和人物移动跳跃,接下来我们要做出人物展现出来的动画了

我们接下来就要用到动画机了,双击我们的动画机,进入到这样的页面,我这是已经做好的页面,你们是没有这些箭头的

依次像我一样连接起来,然后点击Parameters,点击name旁边的小箭头,选择 int 类型

之后我们随便选择一条线,点击Conditions的+, 选择如图所示的样子,选择state和Equals

然后就有所不同的:

  • 所有指向Idle的我们的值都设置为0;
  • 所有指向Move的,我们都设置为1;
  • 所有指向Jump的,我们都设置成2;
  • 所有指向Fall的,我们都设置成3。

把Has Exit Time勾选取消掉,就是不勾选,然后展开setting,把Transition Duratior的值都改为0


之后就可以进入我们的代码部分了,把我们之前的C#代码打开,改成这个

using Unity.VisualScripting;
using UnityEngine;public class Move : MonoBehaviour
{// 定义私有变量rb,类型为Rigidbody2D,用于存储刚体组件的引用private Rigidbody2D rb;      // 定义私有变量coll,类型为BoxCollider2D,用于存储碰撞体组件的引用private BoxCollider2D coll;// 定义私有变量anim,类型为Animator,用于存储动画控制器组件的引用private Animator anim;// 定义公共变量JumpSpeed,类型为float,用于存储跳跃速度public float JumpSpeed = 5f;  // 定义公共变量MoveSpeed,类型为float,用于存储移动速度public float MoveSpeed = 5f;  // 定义公共变量Level,类型为float,用于存储水平输入值public float Level = 0f;// 定义私有变量JumpableGround,类型为LayerMask,用于存储可以跳跃的地面层[SerializeField] private LayerMask JumpableGround;// 定义一个名为MoveState的枚举,包含idle(静止)、run(跑步)、jump(跳跃)、fall(下落)四个状态private enum MoveState {idle, run, jump, fall}// Start方法在脚本实例化后、第一帧更新前被调用private void Start(){// 获取并赋值当前GameObject上的Rigidbody2D组件到rb变量rb = GetComponent<Rigidbody2D>();// 获取并赋值当前GameObject上的BoxCollider2D组件到coll变量coll = GetComponent<BoxCollider2D>();// 获取并赋值当前GameObject上的Animator组件到anim变量anim = GetComponent<Animator>();}// Update方法每帧调用一次private void Update(){// 获取水平方向的输入值,不进行平滑处理Level = Input.GetAxisRaw("Horizontal");// 设置角色的水平速度为Level乘以MoveSpeed,垂直速度保持不变rb.velocity = new Vector2(Level * MoveSpeed, rb.velocity.y);// 如果按下跳跃按钮并且角色在地面上if (Input.GetButtonDown("Jump") && IsGround()) {// 设置角色的垂直速度为JumpSpeed,水平速度保持不变rb.velocity = new Vector2(rb.velocity.x, JumpSpeed);}// 调用UpdateStates方法来更新动画状态UpdateStates();}// UpdateStates方法用于更新角色的动画状态private void UpdateStates(){ // 定义一个MoveState类型的变量stateMoveState state;// 根据水平输入值翻转角色if (Level > 0f){// 如果输入值大于0,设置状态为run(跑步),并设置角色不翻转state = MoveState.run;this.gameObject.GetComponent<SpriteRenderer>().flipX = false;}else if (Level < 0f){// 如果输入值小于0,设置状态为run(跑步),并设置角色翻转state = MoveState.run;this.gameObject.GetComponent<SpriteRenderer>().flipX = true;}else{// 如果没有水平输入,设置状态为idle(静止)state = MoveState.idle;}// 根据角色的垂直速度设置跳跃或下落状态if (rb.velocity.y > .1f){// 如果垂直速度大于0.1,设置状态为jump(跳跃)state = MoveState.jump;}else if (rb.velocity.y < -.1f){// 如果垂直速度小于-0.1,设置状态为fall(下落)state = MoveState.fall;}// 使用Animator组件设置名为"state"的整数参数,值为state的枚举整数值anim.SetInteger("state", (int)state);}// IsGround方法用于检测角色是否在地面上private bool IsGround(){// 使用Physics2D.BoxCast方法进行射线投射,检测角色下方是否有可以跳跃的地面层return Physics2D.BoxCast(coll.bounds.center, coll.bounds.size, 0f, Vector2.down, .1f, JumpableGround);}
}

这个代码是我在网上面找的,他用到的IsGroup()很精髓,如果我们不这么做,就需要自己设置IsGroup,之后true和false来回转换,还需要加Unity里面的碰撞体方法进行判断。

这里面就能看到我刚才为什么要让你们设置指向谁的必须是几了。

然后我们保存一下,回到我们的Unity,运行一下就可以看到我们人物的移

动动作和跳起动作了。


如果没有成功跳起来的话:

我们依次点击Tilemap——> Layer——>Add Layer..

添加一个Ground

回到Tilemap,选中Ground

点击Player,选择Move文件,点击Jumpable Ground 切换到Ground,如果这些部分不设置的话,可能我们C#代码里面的IsGround就用不了

最后:运行!


http://www.ppmy.cn/embedded/110967.html

相关文章

adb install失败: INSTALL_PARSE_FAILED_NO_CERTIFICATES

这个错误表明在尝试安装 APK 文件时出现了问题&#xff0c;原因是 APK 文件中的 AndroidManifest.xml 没有签名证书。在 Android 系统中&#xff0c;所有的应用都必须经过签名才能安装到设备上。以下是解决此问题的方法&#xff1a; 方法一&#xff1a;使用 Android Studio 或命…

opencv对比度增强方法算法汇总

1、线性变换 线性变化是最好理解的&#xff0c;假设原图为srcimg , 变换后的图像为dstimg&#xff0c;则&#xff1a; dstimg a * srcimg b a为变换系数 2、分段线性变换 3、伽马变换 4、直方图正规化 5、直方图均衡化 6、局部自适应直方图均衡化

408:强化笔记|王道|DS|OS|CO|计网

目录 DS 数据结构算法题一、快速排序二、二路归并排序三、链表(2.3课后习题)四、二叉树五、图应用题 OS 操作系统第二章 进程与线程零、大观一、PV操作 第三章 内存管理一、内存管理大题 CO 计算机组成原理第三章 存储系统一、Cache大题二、TLB大题 第二章 数据的表示和运算第四…

第3篇:【系统分析师】数据库系统

基本概念 三级模式-两级映像 数据库设计 掌握数据库设计的步骤顺序&#xff0c;以及各个阶段的产出物。在逻辑结构设计中做范式处理 数据库模型 E-R模型 关系模型 关系代数&#xff08;sql语言&#xff09; 规范化 函数依赖&#xff0c;键与约束&#xff0c;模式分解 范式 …

图算法 | 图算法的分类有哪些?(下)

图算法的分类有哪些&#xff1f;综合当前学术界和工业界图计算领域目前最新的发展情况&#xff0c;把图算法划分为了以下六大类&#xff1a; ❑中心性(Centrality)算法&#xff1a;如节点出入度、全图出入度、接近中心性、中介中心性、图中心性、调和中心性等。 ❑相似度(Simil…

多字节字符和宽字符

小时候&#xff0c;买东西的单位是一角、二角和五角&#xff0c;现在的单位是一元、五元和十元。人类社会的发展和计算机发展本质没啥两样&#xff0c;形态不同而已。 编码格式的历史 尽管早期只用ASCII码就可以表达所有字符&#xff0c;但计算机日益推广让其他国家不同语言的…

Redis单机、集群、哨兵、主从架构详解

一、Redis 单机模式 1.1 什么是 Redis 单机模式&#xff1f; Redis 单机模式是最基础的部署方式&#xff0c;所有的数据都存储在一个 Redis 实例中。单机模式下&#xff0c;Redis 提供数据存储、数据读写和数据备份等基本功能&#xff0c;适合小规模数据量和对高可用性要求不…

【信创】龙芯3A6000上lscpu与/proc/cpuinfo的区别

原文链接&#xff1a;【信创】龙芯3A6000上lscpu与/proc/cpuinfo的区别 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在Linux操作系统上&#xff0c;龙芯3A6000处理器中使用lscpu命令和查看/proc/cpuinfo文件之间的区别的文章。在Linux系统中&#xff0c;我们…