Unity2D基础之人物动画、移动、跳跃

一、人物动画

从Window->Assets Store可以打开资源商店页面,可以选购一个免费的2D资源。本文就以这个骑士资源为角色.
Hero Knight

购买完成之后就导入Unity项目了。
通常购买的资源会有一个Demo项目运行,可以看看大概效果。动画、脚本等都有现成写好的。本文以学习为目的,所以会从头走一遍。

1.制作动画

找到Sprites文件夹,里面的HeroKnight文件,点击箭头可以看到这是已经帮我们做好了切割的。
我们先将第一张拖入Hierarchy,取名为Player

我们浏览一下下面的图片,可以发现:
0-6是站立,7-17是奔跑,18-36是攻击…
接着我们先选中0-6的图片,拖入到Player中

这时候就会出现一个保存的弹窗

我们选择好保存的路径和名称即可。

然后分别将其他的动作也以相同的方式创建动画,

可以看到左上角里动画已经都创建好了。

2.搭建场景

动画的切换会在角色控制的时候进行,这里我们先简单搭一个场景。

在Hierarchy里右键->2D Object-> Tilemap->Rectangular,就可以创建一个Tilemap

创建好后点击,左边的视图里就会出现很多小格子。
接着我们找到Environment文件夹下面的图片,简单的在格子里搭一个地板。将文件拖入即可。

这时候点击运行,会发现人物会直接穿过地板掉下去。这是因为还没有碰撞检测。

3.设置碰撞检测

我们点击Player,在Inspector视图里选择Add Compoent,然后依次添加下面三个组件:

  1. RigidBody 2D 然后将Freeze Rotation z打勾

  2. Capsule Collider 2D 点击Edit Collider 将胶囊体缩小到和人物一样

  3. BoxCollider 2D 点击Edit Collider 将检测范围缩小到和角色的脚一样,勾选is Trigger

接下来点击Tilemap,添加Tilemap Collider 2D组件。

现在再运行游戏,角色就会站在地板上了。

二、人物控制与动画切换

角色的移动通过脚本来实现。在这部分我们也会涉及到动画的切换。
同样点击Player -> Add Component -> new script 即可创建脚本。
脚本里有Start()和Update()方法,可以理解为Start()是在初始化的时候执行,Update()是在每一帧刷新的时候执行。

1.移动

1.1 控制移动

要控制角色移动,首先我们要获取角色的RigidBody.添加一个成员变量
同时为了移动速度可控,我们将速度也抽成一个变量。

public float runSpeed ;
private Rigidbody2D myRigidBody2D;

然后在Start()里进行初始化

void Start(){    myRigidBody2D = GetComponent<Rigidbody2D>();
}

控制移动的方法应该在Update()里,为了代码的可读性和可维护性,我们定义一个函数Run()
然后在这个方法里获取按键事件,然后给角色赋值一个速度.具体代码如下:

private void Run(){    var moveDir = Input.GetAxis("Horizontal");    var playerVel = new Vector2(moveDir * runSpeed, myRigidBody2D.velocity.y);    myRigidBody2D.velocity = playerVel;}

最后记得将Run()函数添加到Update()里

void Update() {Run();
}

接着回到Unity,点击Player,我们可以在右边看到刚才定义的Run Speed变量,可以在这里进行赋值。

此时运行游戏,按下左右方向键就可以移动了。但此时有两个问题:

  • 角色一直朝着一个方向
  • 角色的动画一直是站立

接下来就解决这两个问题

1.2 改变角色面朝方向

要改变角色的朝向,首先我们要知道角色是往哪边移动的。
这一点可以通过角色x轴速度的正负来判断,如果为正则是往右,为负则是往左。
这样我们就可以编写一个Flip()函数了

private void Flip(){   if (myRigidBody2D.velocity.x > 0.1f)    {        transform.localRotation = Quaternion.Euler(0, 0, 0);    }    if (myRigidBody2D.velocity.x < -0.1f)   {        transform.localRotation = Quaternion.Euler(0, 180, 0);    }
}

可以将Flip()放到Run()里调用。

1.3 切换动画

到重点了,如何切换动画。
我们回到Unity,来到动画这里。切换动画是由参数来控制的,所以我们先创建一个控制移动的参数。

接着右键点击stand动画,选择Make Transition拉出一个箭头到run动画,接着选中这跟箭头,在Inspector页面取消过渡时间,设置条件isRuning为True的

这样就表示isRuning这个变量为True的时候,就会从stand切换到run。
同样我们也要从run拉一条线回到stand,条件为isRuning为False的时候。

这样我们完成了动画切换的设置。

而给isRuning变量赋值,就是脚本里做的事了。我们需要判断角色当前是否有x轴方向的速度,如果有就将isRuning设置成True, 没有就设置为False。修改一下Run()函数

private void Run(){    var moveDir = Input.GetAxis("Horizontal");    var playerVel = new Vector2(moveDir * runSpeed, myRigidBody2D.velocity.y);    myRigidBody2D.velocity = playerVel;    var playerHasXSpeed = Math.Abs(myRigidBody2D.velocity.x) > Mathf.Epsilon;    if (playerHasXSpeed)    {        myAnimator.SetBool("isRunning", true);       Flip();    }   else    {       myAnimator.SetBool("isRunning", false);    }}

至此,我们的角色就拥有了移动的动画效果。

2.跳跃和降落

完成了移动之后,跳跃和降落就是一样的原理了。大家可以先按移动的逻辑尝试着自己实现跳跃和降落,能实现才说明掌握了。文末我会放出代码。

2.1 解决无限跳跃问题

按照上面的思路实现跳跃,可能会发现角色能够无限跳跃,这通常是不合理的。

要解决这个问题思路就是判断角色当前是否在地面上,如果在就可以跳跃,如果不在就禁止跳跃。

那最终问题就落在了如何判断角色是否在地面上了。还记得我们最开始加的Box Collider 2D组件吗,这时候就派上用场了。

首先做一个准备工作,选中Ground,在右边Layer的地方点击Add Layer,找一个User Layer的地方写上Ground

然后到脚本里,先在Start方法里获取BoxCollider2D组件,然后通过IsTouchingLayers方法来判断是否触碰了Layer。我们可以添加一个全局变量来保存这个值,并在Update()里去更新调用。

private void CheckIsOnGround(){    mIsOnGround = playerFeet.IsTouchingLayers(LayerMask.GetMask("Ground"));}

在Jump里呢就可以通过读取mIsOnGround这个值,来控制是否可以跳跃。

我们还能在这基础上加上二段跳。思路很简单,这里就不赘述了,最后放上本文涉及的代码。

public class PlayerControler : MonoBehaviour
{public float runSpeed ;public float jumpSpeed;public bool canDoubleJump;private Rigidbody2D myRigidBody2D;private Animator myAnimator;private BoxCollider2D playerFeet;private bool mIsOnGround = true;private int jumpTimes = 0;// Start is called before the first frame updatevoid Start(){myRigidBody2D = GetComponent<Rigidbody2D>();myAnimator = GetComponent<Animator>();playerFeet = GetComponent<BoxCollider2D>();}// Update is called once per framevoid Update(){CheckIsOnGround();Run();Jump();Fall();}private void CheckIsOnGround(){mIsOnGround = playerFeet.IsTouchingLayers(LayerMask.GetMask("Ground"));}private void Run(){var moveDir = Input.GetAxis("Horizontal");var playerVel = new Vector2(moveDir * runSpeed, myRigidBody2D.velocity.y);myRigidBody2D.velocity = playerVel;var playerHasXSpeed = Math.Abs(myRigidBody2D.velocity.x) > Mathf.Epsilon;if (playerHasXSpeed){myAnimator.SetBool("isRunning", true);Flip();}else{myAnimator.SetBool("isRunning", false);}}private void Flip(){if (myRigidBody2D.velocity.x > 0.1f){transform.localRotation = Quaternion.Euler(0, 0, 0);}if (myRigidBody2D.velocity.x < -0.1f){transform.localRotation = Quaternion.Euler(0, 180, 0);}}private void Jump(){if (Input.GetButtonDown("Jump")){if (mIsOnGround || (canDoubleJump && jumpTimes < 1)){var playerVel = new Vector2(myRigidBody2D.velocity.x, jumpSpeed);myRigidBody2D.velocity = playerVel;myAnimator.SetBool("isJumping", true);jumpTimes++;}}}private void Fall(){if (myRigidBody2D.velocity.y < -0.1f){myAnimator.SetBool("isJumping", false);myAnimator.SetBool("isFalling", true);}if (mIsOnGround){myAnimator.SetBool("isFalling", false);jumpTimes = 0;}}
}

Unity2D基础之人物动画、移动、跳跃相关推荐

  1. UE4(虚幻4)基础:人物/动画导入与角色蓝图

    如果是官方的虚幻商城下载的就无所谓了,直接添加到工程即可 如果是第三方的网站下载的,例如   mixamo  <-戳 一.角色导入: 创建项目,选择第三人称模板,蓝图,不包含新手包 将下载好的角 ...

  2. 17.Unity2D 横版 骨骼动画 之 动画中局部骨骼旋转+多层动画共同控制+局部骨骼索敌攻击

    主目录 承接上节课 16.Unity2D 横版 骨骼动画 之 单张PSB图+PS像素画软件_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客上一节课我们学习了单张的切片图,是最简单的一种骨骼动画,但 ...

  3. 时光煮雨 Unity3D实现2D人物动画① UGUINative2D序列帧动画

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③-UGUI DoT ...

  4. unity人物旋转移动代码_游戏诞生之日02 - 美术篇 快速制作人物动画

    在上一篇<游戏诞生之日01 - 美术篇 快速搭建和渲染游戏的第一个场景>里,我们得到了一个静态渲染的游戏场景. 接下来我们需要加入人物动画,为游戏注入活力. 第五块拼图 - 动画素材从哪里 ...

  5. unity2D学习笔记-角色动画

    unity2D学习笔记-角色动画 角色移动 动画效果(重点!!!!!) 创建:Animator与Animation 状态转换 跳跃 从fall到idle Hierarchy中创建一个Sprite作为载 ...

  6. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第一篇:人物动画序列帧

    文章目录 一.前言 二.创建工程 三.导入序列帧图片素材 四.设置图片格式 五.切割序列帧 六.制作序列帧动画 七.运行效果 一.前言 嗨,大家好,我是新发,今天是大年初一,大家牛年快乐,牛气冲天. ...

  7. IOS开发基础之核心动画 基础动画、关键帧、组动画案例

    IOS开发基础之核心动画 基础动画.关键帧.组动画案例 案例源码在我的主页里.实现效果图 // // ViewController.m // 30-核心动画 // // Created by 鲁军 o ...

  8. html人物动画效果图,9款用HTML5/CSS3制作的动物、人物动画

    原标题:9款用HTML5/CSS3制作的动物.人物动画 今天我们要来分享一些设计非常独特的人物和动物动画效果,它们都是通过HTML5和CSS3制作而成,有一些动画是利用纯CSS3实现的,一起来看看. ...

  9. html 动物特效,分享9款用HTML5/CSS3制作的动物人物动画,

    分享9款用HTML5/CSS3制作的动物人物动画, 1.纯CSS3绘制可爱的蚱蜢 还有眨眼动画 今天我们要分享一个利用纯CSS3绘制的蚱蜢动画,非常可爱. 在线演示 源码下载 2.HTML5 Canv ...

最新文章

  1. sql server 2008连接oracle操作步骤详细记录,SQLServer连接Oracle详细步骤
  2. 有关博弈人机混合智能的再思考
  3. K均值算法matlab代码实现
  4. AI in RTC 创新挑战赛 | 超分辨率挑战开始了!
  5. linux 防火墙 限速,linux iptables限速及限制每IP连接数
  6. Guava RateLimiter限流原理解析
  7. l28n和开发版_Atmel之SAM4S Xplained开发板评测(二)
  8. c++ 线程软件看门狗_装配生产线MES系统软件
  9. 苹果“炸场”发布会:搭载刘海屏的MacBook Pro来了,还有AirPods 3...
  10. 微信喊你来找工作:上千家企业将提供超10万个就业岗位
  11. SAI绘制宇宙的翅膀
  12. html5红外遥控,自制红外遥控开关详细步骤(两款自制红外遥控开关方法) - 全文...
  13. [Python图像处理] 合成微缩效果
  14. Caffe中BN层与CONV层的融合(merge_bn)
  15. LTE-A载波聚合技术(14)---PHICH
  16. 美通企业日报 | 爱茉莉太平洋与阿里巴巴达成战略合作;新富人群房地产投资比重提升...
  17. 新型发明创造大赛计算机类,2019年自主招生的七大途径你知道吗,这些内容你需要了解!...
  18. 联想机型报 enter your input here
  19. PS磨皮滤镜降噪套装:Imagenomic Professional Plugin Suite
  20. 发布 Libra Bug 悬赏项目

热门文章

  1. linux qt 达梦,linux环境中QT程序连接达梦数据库DM7简介
  2. U-Boot 移植初探
  3. spring中使用ftp连接池(ftpClientPool)
  4. DSP 程序烧录到flash启动程序死机解决方法(通用)(ADC无法初始化)(在RAM中可行)
  5. java语言三大分类javaSE、javaME、javaEE的区别
  6. 单纯形法之人工变量法求解步骤:一个简单例子
  7. BERT-based Lexical Substitution论文阅读
  8. 苹果cms采集明星后不显示的解决方法
  9. Assignment思路
  10. spark踩坑之sc这个东东的特殊性