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:勾选表示当前动画状态必须播放完其完整时长,才会依据下方条件判断是否进行状态转换。
现在,打开游戏,控制角色左右移动就是有动画转换的。