這里我直接復制的我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
若有更好的看法請留言,還有就是人物穿過場景比如在王者峽谷中碰到不規則物體不穿過,我還沒有實現,老是穿牆,希望有大佬能提示一下。