Unity2D - 人物的创建 (含代码&动画导入执行)

36秒前 75阅读

1. 人物的导入与相关设定

Unity2D - 人物的创建 (含代码&动画导入执行)

1.1 基础设定

Unity2D - 人物的创建 (含代码&动画导入执行)

当我们获得游戏素材之后,记得检查上述红圈所标注的设定,这将影响成像的效果。

文章所示素材为像素人物,所上述将Pixels Per Unit设定为25,Filter Mode设定为Point。设定之后需要点击Apply进行应用。

1.2 物理效果

为了实现人物的效果,我们需要用到Unity中自带物理引擎模块,例如碰撞体与刚体;

顾名思义,碰撞体(Collider 2D)是想要让人物与其他物体间进行接触碰撞(物体也需要设定为碰撞体),刚体(Rigidbody 2D)则是让人物获得物理属性,例如重力。

如下图所示,将两个组件进行设定:

Unity2D - 人物的创建 (含代码&动画导入执行)

1.3 渲染器

渲染器顾名思义就是将我们角色或物体的形状,颜色等进行修改。为了方便后续动画的设定,我们将Player类设定一个子类Animator,将渲染器以及动画控制器都设定在其中。

Unity2D - 人物的创建 (含代码&动画导入执行)

Unity2D - 人物的创建 (含代码&动画导入执行)

2. 人物动作的执行

对于一系列人物的设定就需要使用到我们的脚本,Unity使用C#语言。

笔者对于C#语言也有一系列博客,感兴趣的读者可以进入我的主页专栏C#语言入门阅读。

2.1 前进

 2.1.1 代码实现前进

Unity2D - 人物的创建 (含代码&动画导入执行)

通过GetaxisRaw方法在水平方向上获取整型值-1,1

调用我们的对象刚体,设定其在x,y轴上的速度就可以实现对象的移动。

Unity2D - 人物的创建 (含代码&动画导入执行)

但从测试结果看,我们的对象在移动过程中是不断旋转的,这是因为物体所配置的物理组件的影响,我们需要在刚体(Rigidbody)中对参数进一步进行设定:

Unity2D - 人物的创建 (含代码&动画导入执行)

2.1.2 动画导入与设定

在设定中,我们需要选中window中Animation选项将我们的窗口进行选中

游戏中的物体需要配置一个animator组件。可以理解为在物体上附加动画效果,动画的调用需要使用动画控制器,让附加在物体中的动画分条件进行调用。

Unity2D - 人物的创建 (含代码&动画导入执行)

Unity2D - 人物的创建 (含代码&动画导入执行)

将我们的图片效果导入我们即可得到我们的动画,相应的我们需要对所使用的动画进行参数设定以及条件设定:

Unity2D - 人物的创建 (含代码&动画导入执行)

相应的参数以及条件设定完毕后,我们的物体需要使用代码获取我们的动画对象以及相应的参数,能够进一步控制在什么条件下调用动画。

public class Player_Controller : MonoBehaviour
{
    [Header("Object Inform")]
    public Rigidbody2D rb;
    public Animator anim;
    [Header("Moving Infrom")]
    [SerializeField] private float xInput;
    [SerializeField] private float MoveSpeed;
    private bool isMoving;
    [Header("Flip Inform")]
    [SerializeField] private int FacingDir = 1; //设定朝向,朝右则为1,左为-1
    private bool FacingRight = true; //判断是否朝右

    void Start()
    {
        rb = GetComponent();
        anim = GetComponentInChildren(); //获取子对象身上的动画器
    }
    void Update()
    {
        FlipController();
        xInput = Input.GetAxisRaw("Horizontal");
        rb.velocity = new Vector2(xInput * MoveSpeed, rb.velocity.y);
        Animator_controllers();
    }
    private void Animator_controllers()
    {
        anim.SetBool("isMoving", isMoving); //获取动画器上的isMoving变量
        isMoving = rb.velocity.x != 0; //当速度不为零的时候为True
    }

2.2 翻转

翻转我们将设定两个方法,一个方法是使得物体进行翻转,另一个是控制物体在什么时候翻转

    [Header("Flip Inform")]
    [SerializeField] private int FacingDir = 1; //设定朝向,朝右则为1,左为-1
    private bool FacingRight = true; //判断是否朝右
    private void Flip()
    {
        FacingDir = FacingDir * -1; //反转之后参数设定
        FacingRight = !FacingRight;
        transform.Rotate(0,180, 0); //沿着y轴旋转180度
    }
    private void FlipController()
    {
        if (rb.velocity.x > 0 && !FacingRight) //如果物体速度向右且不朝向右,则翻转
        { Flip(); }
        else if (rb.velocity.x  

随后在update函数中调用翻转控制器即可。

2.3 跳跃

2.3.1 跳跃的设定

我们需要对跳跃进行设定,只有在满足某些条件的情况下才可以进行跳跃

这个时候最好的方式是设定地面碰撞器,只有角色在地面时才可以进行跳跃; 我们可以想象物体的重心向地面延伸一条射线,射线到里面的距离就是地面监测的距离,如果物体离地面的距离长于射线距离,则判定为不在地面,为了方便编写相应程序,我们将射线可视化出来。

private float groundCheckDistance;
private void OnDrawGizmos()
{
    Gizmos.DrawLine(transform.position,new Vector3(transform.position.x,transform.position.y - groundCheckDistance));
}

变量groundCheckDistance就是我们物体重心离目标范围的检测距离。

private bool isGrounded;
[SerializeField] private LayerMask WhatisGround; //定义目标图层
void Update()
{
    isGrounded = Physics2D.Raycast(transform.position,Vector2.down,groundCheckDistance,WhatisGround);
//参数输入可以理解为目标位置,检测方向,检测距离,目标图层
}

通过上述条件置入我们的Jump方法中即可。

2.4 冲刺

根据上述动画的创建,动画参数以及条件进行设定,我们将对于什么时候冲刺根据代码进行设定,以及设定相应的冲刺时间器。

Unity2D - 人物的创建 (含代码&动画导入执行)

代码中设定冲刺时间以及冲刺初始化参数,冲刺这个过程不仅要调用相应的冲刺动画,也要对物体本身的速度进行重新设定,所以在Movement方法中我们需要进一步设定。

最终在动画器的调用环节,将isDash参数与(Dashtime)参数是否大于0进行挂钩进行条件设定。

public class Player_Controller : MonoBehaviour
{
    [Header("Object Inform")]
    public Rigidbody2D rb;
    public Animator anim;
    [Header("Moving Infrom")]
    [SerializeField] private float xInput;
    [SerializeField] private float MoveSpeed;
    private bool isMoving;
    [Header("Dash Inform")]
    private bool isDash;
    private float DashDuration = .3f; //设定冲刺时间
    private float DashTime; // 初始化冲刺时间
    [Header("Flip Inform")]
    [SerializeField] private int FacingDir = 1; //设定朝向,朝右则为1,左为-1
    private bool FacingRight = true; //判断是否朝右

    void Start()
    {
        rb = GetComponent();
        anim = GetComponentInChildren(); //获取子对象身上的动画器
    }
    void Update()
    {
        DashTime = DashTime - Time.deltaTime; // 随着时间进行流逝
        if (Input.GetKeyDown(KeyCode.LeftShift)) //如果按下左shift建初始化冲刺
        { DashTime = DashDuration; }
        FlipController();
        xInput = Input.GetAxisRaw("Horizontal");
        Movement();
        Animator_controllers();
    }
    private void Movement()
    {
        if (DashTime > 0)
        {
            rb.velocity = new Vector2(FacingDir * 8, rb.velocity.y);
        }
        else
        {
            rb.velocity = new Vector2(xInput * MoveSpeed, rb.velocity.y);
        }
    }
    private void Animator_controllers()
    {
        anim.SetBool("isDash",DashTime > 0); //大于0时,isDash为true
        anim.SetBool("isMoving", isMoving); //获取动画器上的isMoving变量
        isMoving = rb.velocity.x != 0; //当速度不为零的时候为True
        
    }
    private void Flip()
    {
        FacingDir = FacingDir * -1; //反转之后参数设定
        FacingRight = !FacingRight;
        transform.Rotate(0,180, 0); //沿着y轴旋转180度
    }
    private void FlipController()
    {
        if (rb.velocity.x > 0 && !FacingRight) //如果物体速度向右且不朝向右,则翻转
        { Flip(); }
        else if (rb.velocity.x  
 
 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]