unity静止人物素材制作动作,导入unity行走、跑步动画,并用Animator Controller加脚本进行控制
这里我直接复制的我csdn的内容
初学Unity的关于制作人物动作、导入unity动画、控制人物移动的简单小结
因为网上的关于人物动画制作、导入、控制运动的文章都不太全面,所以自己制作了一个小结来总结一下,这是我当前做出来的效果图,穿墙效果还未改,这里可以通过控制w a d控制走路转型 以及加速键 j 控制跑步。
那么首先是要得到需要导入的动画
而我们从网上下载的人物资源大部分都是静态的,这里我推荐一个网站:
Adobe公司的Xixamo网站:https://www.mixamo.com/#/?page=1&query=Idel(不用FQ)专门用于提供人物模型的动作,用户可以将自己的模型(类型可以是fox、obj、zip)导入网站中,网站会识别模型并有多种动作供用户选择,选择之后点击DOWNLOAD下载即可,下载的类型最好是fbx的即直接可以导进unity如图:(或者自己用C4d、Maya制作也可以)
下面介绍如何导入动画以及一些基本设置
这里我从Ximamo上下载了几个妲己的动作,分别是:Dwarf Idle(发呆)、LeftTurn90(左转90度)、RightTurn 90(右转90度)、Runing-2withcolor(我自己命的名)(跑步)、Walking(行走)
首先把这几个fbx文件拖进Unity的Assets中,如图:这里我右键新建了Move文件夹存放这几个fbx模型
下面我们对模型内容进行一下修改,以便后期使用:
如图:点击模型Dwaf Idel在Inspector中有Model、Rig、Animation、Materials四个选项其中Model和Materials默认即可
而Rig 中需要对Animayion type(动画类型)进行修改改为Humanoid(人形机,因为这里我们要导入人物模型),Avatar Defintion(化身定义选:Create From This Model))如下图
在Animation中勾选LoopTime以及LoopPose并点击最下面的Apply使得更改保存,这两个选项跟之后的动画循环有关,也就是说在接受命令后跑步动画、发呆动画可以连续进行而不会只运行一次,而左转(LeftTurn90)、右转(RightTurn90)的这个地方则无需更改,因为转身动作不太需要循环😄,不然就转圈圈了,更改设置如下图,同时最下方的框里可以对动画动作进行预览:
将上面四个fbx动画模型设置完成之后可以将模型拖进Scene 中,如果我们把其中的Dwarf Idle直接拖进场景中这时我们可以看到妲己是没有皮肤的这首是时只需增加贴图即可,可以从有的素材网站上下载得到(不用关心Dwarf Idle下面的LookingAroundwithcolor,那是我上一个建立的模型)。
下面是贴完图之后的效果:从Materials中找到一个贴图直接拖到妲己身上即可,这里的Materials中的内容需要自己导入
下面介绍Animator Controller,将动画效果加入
拖入之后我们点击Hierarchy中的Dwarf Idle,在Inspector中我们可以看到unity自动生成了属于Dwarf Idle的Animator,这时我们在Assets或者Move文件夹中新建一个Animator Controllar,如下图:
这里我将其重命名为“DaJi”,并拖入Dwarf Idle的Animator的Controller中,单击“DaJi”,并在Inspector下点击“DaJi”右上角的open,可以看到Animator的BaseLayer中有几个方块,如下图:
然后,在Move的几个模型下面将他们的动画(这里的名字都为mixamo.com)拖入Animator的BaseLayer中,并在界面右上角改名,分别为:Idle、left、right、walk、run。同时在Parameters中添加Bool变量分别为Bool1、Bool2、Bool3、Bool4(这里我们不勾选)用于接下来的条件判断,如下图:
,
接着,在Animator下对Idle、left、right、walk、run进行连接,右键方块MakeTransition进行如下连接。在这里我简单介绍一下这种判断的机制:每个动画连接之间的线都可以增加Conditions(条件){点击动画之间的线时,unity界面右侧Inspector中会出现关于线的Setting},箭头代表方向,如果给从Idle到walk的线增加Conditions(条件)是:Bool1为true,则当Bool1为true时运行前进动画。于是在下图的连接方式中,我对动画之间的线分别增加了如下的条件:
Idle->walk Conitions:Bool1 = true;
//表示当Bool1=true时运行Idle - >walk
Idle->left Conitions:Bool2 = true;
//表示当Bool2=true时运行Idle - >left
Idle->right Conitions:Bool3 = true;
//表示当Bool3=true时运行Idle - >right
left->walk Conitions:Bool2 = true;
//表示当Bool2=true时运行left - >walk
right->walk Conitions:Bool3 = true;
//表示当Bool3=true时运行right- >walk
walk->run Conitions:Bool4 = true;
//表示当Bool4=true时运行walk->run
run->walk Conitions:Bool4 = false;
//表示当Bool4=false时运行run ->wolk
walk->Idle Conitions:Bool1 = false Conitions:Bool2 = false Conitions:Bool3 = false;
//表示当Bool1 = false Bool2 = false Bool3 = false同时满足时运行walk ->Idle
而且我们要将所有连线Inspector中Setting上方的Has Exit Time取消勾选,因为不能让动画退出,否则将不能控制人物。
这一步结果如下图:
最后,我们怎么通过键盘输入,并控制Bool1、Bool2、Bool3、Bool4的值呢?于是再次点击Hierarchy中的Dwarf Idle,在Inspector中AddComponent->New script创建关于Dwaf Idle的脚本Character.cs下面是脚本的内容:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Character : MonoBehaviour
{
private Animator Anim;
// Start is called before the first frame update
void Awake()
{
Anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.W)) //向前
{
Anim.SetBool("Bool1", true);
}
if (Input.GetKeyUp(KeyCode.W))
{
Anim.SetBool("Bool1", false);
}
if (Input.GetKeyDown(KeyCode.A))
{
Anim.SetBool("Bool2", true);
}
if (Input.GetKeyUp(KeyCode.A))//向左走
{
Anim.SetBool("Bool2", false);
}
if (Input.GetKeyDown(KeyCode.D))
{
Anim.SetBool("Bool3", true);
}
if (Input.GetKeyUp(KeyCode.D))//向右走
{
Anim.SetBool("Bool3", false);
}
if (Input.GetKeyDown(KeyCode.J))//跑步
{
Anim.SetBool("Bool4", true);
}
if (Input.GetKeyUp(KeyCode.J))
{
Anim.SetBool("Bool4", false);
}
}
}
Ctrl+s保存之后运行即可看到结果:
若想要添加跟随人物的相机,只需要调整相机视角对准角色然后在Camera中添加一跟随角色的脚本就OK了,即将Camera脚本中Player选取为所要跟随的角色就行,如下图将Player选取为角色Looking Aroundwithcolor或Dwaf Idle:
这里不再演示,只给出脚本代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Camera : MonoBehaviour
{
public Transform player; //角色位置信息
public float smoothing = 5f;
Vector3 offset;
void Start()
{
offset = transform.position - player.position;
}
void FixedUpdate()
{
Vector3 playerCamPos = player.position + offset;
transform.position = Vector3.Lerp(transform.position, playerCamPos, smoothing * Time.deltaTime);
}
}
这里给了以上模型的分享
链接:https://pan.baidu.com/s/1LHEedXrm4N0DJJILGhE71g
密码:dlgs
若有更好的看法请留言,还有就是人物穿过场景比如在王者峡谷中碰到不规则物体不穿过,我还没有实现,老是穿墙,希望有大佬能提示一下。