unity人物模型与动画控制技术

目录

写在前面:

unity人物模型与动画控制技术

1. 下载人物模型

2. 将人物模型导入项目中

 3. 下载动画文件

4. 动画状态机

(1)Fast Run与idle的相互转换

(2)punching状态的转换

 (3)jumping状态的转换

5. 将动画绑定到模型上

6. 使用代码控制

写在前面:

        该博客作为3D游戏编程的课程设计。在完成了一个学期课程的学习过后,我自认为够详细的写出unity使用教程,方便初学者学习,激发更多人对于制作游戏的热情,例如这篇博客详细介绍了如何在unity中实现对人物模型的动画控制,因此认为自己本课程应得优秀。

        以下是该博客的详细内容

unity人物模型与动画控制技术

1. 下载人物模型

       进入网站https://www.mixamo.com。初次登录该网站时,需要注册账号才能下载模型。

        登录后,点击角色Characters界面,选择想要下载的模型,最后点击DownLoad下载即可。

        在下载设置界面,选择Format选择FBX For Unity,而Pose选择T-pose或者Original Pose都可以,这里选的是Original Pose。

        下载后得到一个.fbx文件:

2. 将人物模型导入项目中

        在unity项目中创建一个平面作为地面

        然后再Asset目录下创建一个Models目录,用来存放模型,再将下载的模型拖入到该目录中即可。点击模型右侧的三角将其展开,可以看到角色模型由多个部分组成。

        由于下载的模型是人物模型,为了让该模型与人物动作匹配,需要将模型的动画类型Animation Type修改为Humanoid即人形的。最后点击Apply应用即可。

        

        修改完成后,再次展开该模型,可以看出相比原来的模型,多了一个小人物的图标:

        依次点击小人物图标,再点击Configure Avatar,就可以查看该模型的详细信息。

                

        该模型的详细信息如下,可以看出其符合人体标准的五大骨骼:

 3. 下载动画文件

        从零开始制作动画较为困难,且制作动画可由更专业的人来完成;作为一个程序员、一个unity的学习者,可以使用现有的动画来应用到模型中。

        还是刚才的网站https://www.mixamo.com,点击Animations,选择想要下载的动作,最后点击DownLoad下载即可。当然,也可以在搜索框直接搜索常见的动作,例如run、idle、jump等。

        在下载设置界面可以选择文件的格式、是否包含皮肤、帧率以及关键帧缩减。如下图所示进行设置,然后下载即可。

        值得注意的是,下载的文件是一个包含了模型和动画的.fbx文件,因此还需要将动画从该文件中提取出来。

        将下载下来的.fbx模型文件导入到项目中,然后执行和人物模型相同的操作,将这些动画的Animation Type改成huumanoid类型的,确保这些动画也是标准的人形结构的。

        修改完类型之后,如果这些动画模型也多了一个小人形状,则说明修改成功。同时,名为Punching的三角形形状即为动画文件,如下图所示。

        接下来,将这些动画文件提取出来。具体操作为:选中动画文件,然后使用Ctrl + D即可将其提取出来,提取出来的文件在相同目录下。接着对所有下载的动作执行相同的操作:

        为了方便管理,可以将这些动作文件放入一个专门存放动作的目录中:

4. 动画状态机

        要想执行多个不同的动作,并且想要在特定的状态执行特定的动作,则需要使用到动作状态机。这里默认已经学习过动画状态机的相关内容,不熟悉的可以查阅unity官方文档:动画状态机 - Unity 手册icon-default.png?t=N7T8https://docs.unity.cn/cn/2018.4/Manual/AnimationStateMachines.html        在存放动画的目录下(或者任意适合的目录),创建一个动画控制器

        创建的结果如下,可以给动作控制器命名以方便管理与使用:

        双击该动画控制器,进入动画编辑页面,其中包含了三个默认的状态,即任意状态Any State、初始状态Entry、结束状态End。

        接着,可以将下载的动作拖动到动画编辑器中,该动作就会对应于其中的一个状态了:

        将所有需要的动画都拖入编辑器中:

        至于动画的转换逻辑,可以根据自己的需要进行设置。在这里规定:跑步动作和空闲状态可以相互转换;任何状态下都可以执行拳击动作和跳跃动作,并且在执行完拳击动作和跳跃动作后,恢复到空闲状态。接着,可以根据上述规定,依次对各个动作进行设置:

(1)Fast Run与idle的相互转换

        选中动画状态,右键该状态并选择Make Transition,此时鼠标与状态之间出现一个箭头,再用鼠标点击目标状态即可。

        然后对Fast Run执行相同的操作,二者之间形成双向的箭头,如下图所示:

        接着为状态的转换添加条件:依次点击Parameter、右上角的加号、并选择bool类型的变量作为转换的条件。

        然后选中从idle指向Run的转换线,为其添加转换条件。点击右下角的加号添加条件,当bool变量idleToRun等于True时,从idle状态转换为Run状态。为了确保角色刚开始处于空闲状态,需要将变量idleToRun初始设置false。

        对于从Run指向idle的转换线,执行相同的操作,当变量idleToRun等于false时,从Run状态转换为idle状态。

        值得注意的是,需要将idle动作设置为循环播放。选中idle动作,依次点击Loop Time和Loop Pose即可。同样的,对于跑步动作,如果想要持续跑动,也需要将Fast Run动作设置为循环播放,执行上述相同的操作即可。

(2)punching状态的转换

        任何状态都可以转换为punching状态,同时在执行完一次punching动作后,自动转换到idle状态。依次在三者之间添加Make Transition状态转换线。

        对于从任意状态转换到punching状态,首先向上面一样添加一个条件变量,这里可以使用trigger类型的变量。然后选中状态转换的线,点击右下角添加转换条件,当达到触发条件后,即punch被触发后,自动从任意状态转换为punching状态。

        而对于从punching状态到idle状态,由于是自动触发的,因此不需要设置条件。

 (3)jumping状态的转换

        任何状态都可以转换为jumping状态,同时在执行完一次jumping动作后,自动转换到idle状态。依次在三者之间添加Make Transition状态转换线。然后添加trigger类型变量jump,并将该变量添加到状态转换线上即可。

        从junping状态到idle状态的转换也是自动触发的,不需要添加条件。

        至此,所有的动作添加完毕,完整的动画转换图下图所示:

5. 将动画绑定到模型上

        将人物模型放置在场景中,然后选中模型,将刚才的动画控制器拖动到Animator组件中的Controller中即可。

        此时点击运行游戏,就能看到角色处于初始的空闲状态了。

        为了增强视觉效果,也可以将平面换上颜色并且增大平面的大小。

6. 使用代码控制

        可以添加脚本 来控制角色执行相应的动作。

        这里给出一段简单的控制代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterCtrl : MonoBehaviour
{
    public float movementSpeed = 5f;    //移动速度
    public float rotationSpeed = 10f;   //旋转速度

    private Animator animator;

    private void Start()
    {
        animator = GetComponent<Animator>();  // 获取动画组件
    }

    private void Update()
    {
        if(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))  // 按下WASD键奔跑
        {
            animator.SetBool("idleToRun", true);
        }
        else{   // 其他时刻处于idle状态
            animator.SetBool("idleToRun", false);
        }

        // 获取输入
        float horizontalMovement = Input.GetAxis("Horizontal");
        float verticalMovement = Input.GetAxis("Vertical");

        // 移动角色
        Vector3 movement = new Vector3(horizontalMovement, 0f, verticalMovement) * movementSpeed * Time.deltaTime;
        transform.Translate(movement, Space.Self);

        // 旋转角色
        if (movement != Vector3.zero)
        {
            Quaternion toRotation = Quaternion.LookRotation(movement);
            transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
        }

        if (Input.GetKeyDown(KeyCode.Space))   // 按空格键跳跃
        {
            animator.SetTrigger("jump");
        }

        if(Input.GetKeyDown(KeyCode.F))   // 按F键攻击
        {
            animator.SetTrigger("punch");
        }
    }
}

        这段代码可以保证,当角色移动的时候,角色会执行Fast Run的动画效果;其他时刻都会默认处于空闲状态的动画效果;当按下空格,角色会触发跳跃的动作,即jumping对应的动画效果;当按下F键,角色会执行punching的动画效果。

        将这个脚本拖入到角色对象中,点击运行即可。

7. 实现效果

        可以实现角色的奔跑、静止、跳跃、拳击的动画效果。

  • 49
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值