unity学习笔记-YourFirstGame7

简介

本文主要记载自己学习unity的过程,边看视频边写笔记,原视频为麦可老师(M_Studio)在B站发的Unity教程 Your First Game,笔记内容没那么详细,仅供复习使用,学习请前往观看麦可老师的视频

麦可老师在这节课主要讲了添加跳跃动画

一、创建跳跃动画效果

打开animation窗口,点击右边的小三角号,选择create new clip,将其命名为Jump.anim,放到Assets\Animation\player目录下,然后将跳跃的图片素材拖拽进去,素材位置是Assets/Sunnyland/artwork/Sprites/player/jump/player-jump-1.png,别忘了把大小改为16,这时候点击播放就有了跳起的效果。

二、创建下落动画

同样的方式创建一个新的clip,命名为Fall.anim,将下落的图片素材拖拽进去,素材的位置是Assets/Sunnyland/artwork/Sprites/player/jump/player-jump-2.png

三、关联跳跃与下落的动画效果

打开animator窗口,分析各个动画的关系,右键动画,选择make transition,会出现一个箭头,将箭头连接到需要过渡的动画上,实现动画与动画的过渡

  • 跑动可以跳跃 所以需要run->jump

  • 站立可以跳跃 所以需要idle->jump

  • 跳跃之后落下 所以需要jump->fall

  • 落下之后站立 所以需要fall->idle

添加完应该是这样的

做好了动画的过渡,接下来需要添加过渡条件

将左侧面板切换到parameter,点击加号,添加三个bool类型的参数,一个命名为jumping,一个命名为falling,一个命名为idle

然后为各个动画之间的过渡设置条件 将等待当前动画播放完才可以切换下个动画属性has exit time取消 过渡时间transition duration设置为0

  • 从跑动run过渡到跳跃jump jumping->true
  • 从站立idle过渡到跳跃jump jumping->true
  • 从跳跃jump过渡到下落fall jumping->false,falling->true
  • 从下落fall过渡到站立idle falling->false,idle->true

四、给地面添加layer图层

要实现角色从下落到站立的效果,我们需要知道角色落到了地面上,那么如何去判断角色落在了地面,每一个tilemap都是一个碰撞体,所以需要为地面添加一个图层效果

打开属性面板,点击layer右侧下拉的三角符号,add layer,命名为Ground

然后修改代码,声明一个类型为LayerMask的变量命名为ground

1
2
3
4
/// <summary>
/// 声明地面碰撞体图层
/// </summary>
public LayerMask ground;

然后将ground属性设置为刚才添加的layer

最后再将tilemap的图层设置为ground

运行游戏,按方向键,我们的角色就有了跑步的动画了

完整代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using UnityEngine;

public class PlayerController : MonoBehaviour
{
/// <summary>
/// 声明一个变量用来接收刚体
/// </summary>
public Rigidbody2D rb;
/// <summary>
/// 声明一个变量代表速度
/// </summary>
public float speed;
/// <summary>
/// 声明一个碰撞器
/// </summary>
public Collider2D coll;
/// <summary>
/// 声明一个变量代表跳跃力
/// </summary>
public float jumpForce;
/// <summary>
/// 声明一个变量表示动画效果
/// </summary>
public Animator anim;
/// <summary>
/// 声明地面碰撞体图层
/// </summary>
public LayerMask ground;

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
//void Update()
//{
// MoveMent();
//}
//根据电脑配置进行每帧调用
void FixedUpdate()
{
MoveMent();
SwitchAnim();
}

void MoveMent()
{
//horizontalMove值分别为 左-1 右1 不动 0
float horizontalMove =Input.GetAxis("Horizontal");//Input.GetAxis获取-1~1之间的数
float facedirection= Input.GetAxisRaw("Horizontal");//GetAxisRaw 只能获取到-1,0,1这三个数 用来判断角色脸的朝向
if (horizontalMove!=0)
{
//horizontalMove!=0证明角色在动
rb.velocity = new Vector2(horizontalMove*speed*Time.deltaTime,0);//方向乘以速度 Y轴不动 *Time.deltaTime代表两帧之间的时间差(物理运行的百分比) 兼容多种电脑配置
anim.SetFloat("running", Mathf.Abs(facedirection));
}
if (facedirection!=0)
{
transform.localScale = new Vector3(facedirection, 1, 1);//改变x的值和朝向一致
}
//获取按下跳跃键
if (Input.GetButtonDown("Jump"))
{
rb.velocity= new Vector2(rb.velocity.x,jumpForce * Time.deltaTime);
anim.SetBool("jumping", true);
}
}

/// <summary>
/// 选择动画方法
/// </summary>
void SwitchAnim()
{
anim.SetBool("idle", false);
if (anim.GetBool("jumping"))
{
//如果刚体y轴速度小于0
if (rb.velocity.y<0)
{
anim.SetBool("jumping", false);
anim.SetBool("falling", true);
}
}
//如果碰撞体碰撞到的图层是ground
else if (coll.IsTouchingLayers(ground))
{
anim.SetBool("falling", false);
anim.SetBool("idle", true);
}

}
}

第七节课到这里 原视频地址