您现在的位置是:首页 >技术交流 >Unity做2D小游戏4------让角色动起来网站首页技术交流

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

自律霸王龙 2025-06-11 00:01:03
简介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:勾选表示当前动画状态必须播放完其完整时长,才会依据下方条件判断是否进行状态转换。

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。