- 📢博客主頁:https://blog.csdn.net/zhangay1998
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 God Y.原創,首發于 CSDN🙉
- 📢未來很長,值得我們全力奔赴更美好美好的生活?
目錄
- 📢前言
- 🎄Unity影片基礎知識
- 🎁Animation影片組件
- ??Animation組件屬性:
- 🧡Animation實戰演練:簡單模仿坦克開炮影片制作
- 💛腳本代碼控制影片API
- 🔔Animator影片組件
- 💚影片作業流程
- 💙屬性介紹
- Animator組件屬性:
- Controller 的屬性:
- Animator Controller視圖:
- Animation States影片狀態:
- Animation Transitions(影片過渡)
- Animation Parameters(影片引數)
- Animation Layers(影片層)
- Blend Tree(融合樹)
- 💜Animator類介紹
- 💞影片操作步驟
- 💕Animator實戰演練:實作人物行走,攻擊影片切換
- 👥總結
📢前言
- 本篇文章將對Unity中的影片系統做一個基礎的介紹
- 包括Animation和Animator的基礎屬性知識和實戰演練來學習Unity中的影片系統
- 影片在游戲中的地位尤為重要,模型跟影片一般是成套的,可以有專門的建模師對游戲模型進行設計,然后加上一系列的影片進行模型動作設計~
就拿王者榮耀舉例來說,在英雄單獨介紹的界面,每次點開一個英雄都會有一個英雄出場影片,大家都知道傳說皮膚和榮耀典藏的出場影片都特別炫酷,那這就是一個典型的影片了,
還有在游戲中英雄的待機影片,移動影片,普攻,釋放技能等等,都是通過呼叫播放不同的影片來實作的
設計師們通過對每個人物骨骼的特點設計出不一樣風格的影片效果,能讓人眼前一亮,讓每個英雄的動作都有自己的標志性,這就是一個極好的作品啦!
一般來說每個模型都有一系列獨有的影片系列,具有相同骨骼型別的模型還能共用一套影片!
在游戲中,有些英雄的攻擊模式比較相似,設計師們就可以偷懶讓他們共用一個系列的影片啦~
那我們這次就來一起學習一下Unity中的影片系統吧!

🎄Unity影片基礎知識
- 在介紹Unity的影片之前,先來科普一下基礎知識
- 大家都知道在Unity中有很多的游戲物件,所謂游戲物件就是場景中存在的一些個物體
- 而模型呢在Unity中算是一個特殊的游戲物體
-
專門做模型的軟體也有挺多,較出名的類似3DMAX,Maya等等
-
模型的格式有很多種,比如 *.max、*.fbx、*.obj等等格式
-
在Unity中常用的模型格式就是后綴為 .fbx 的檔案了
-
Unity中的影片系統有兩個,一個是Animation,另一個是Animator
-
Legacy影片系統使用的是Animation組件,直接對影片片段進行操作
-
而Mecanim影片系統使用的是Animator組件,是對各影片片段之間的切換進行控制,
-
相對于老版Animation,新版的Animator加入了影片狀態機和骨骼Avatar,
常用類介紹:
- Animator:影片控制器,控制Mecanim影片系統的介面,用來管理多個影片;
- Animation:用于播放影片,老版中單獨的一個Animation也可以完成影片的播放和切換,不過狀態切換之類的需要程式猿代碼控制,在新版中,狀態管理部分交給了Animator;
- AnimationClip:影片剪輯片段,儲存基于關鍵幀的影片,是用于Animation來播放影片;
- AnimationState:影片狀態,用來改變單一影片的播放速度、權重、時間、層級、播放Mode,以及混合模式;
- AnimationEvent:影片事件,用于某種條件下觸發自定義函式;
- StateMachineBehaviour: 影片狀態機管理器拓展類,腳本繼承了該類之后,系結到Animator上某State上面,當狀態發生變化,可以多載回應函式,類似 觸發器的回應函式;
下圖就是我匯入的一個后綴為 .fbx 的模型,可以看到該模型子級目錄中還有挺多東西,那就是他的結構組成啦~還有網格渲染和一個骨骼

- 然后順帶介紹一下模型的Rig視窗屬性,其他幾個視窗的屬性說實話,我現在還沒自己改過,
- 因為沒有用過,個人感覺對程式開發專案來說沒有那么重要,所以在這里就不誤人子弟了…

有的模型還帶有影片,類似下面這種

點擊右邊的播放按鈕可以查看影片效果~

🎁Animation影片組件
-
上面提到了Animation是Legacy影片系統使用的
-
由于Animation算是老版的影片系統,所以這里我們就簡單介紹一下,然后做一個簡單實體,更多的介紹留給新人——Animator
-
在unity的老版本中我們只有Animation組件,在4.6版本以后則增添了Animator組件
-
Animation:用于播放影片,老版中單獨的一個Animation也可以完成影片的播放和切換,不過狀態切換之類的需要程式猿代碼控制,在新版中,狀態管理部分交給了Animator;
??Animation組件屬性:


🧡Animation實戰演練:簡單模仿坦克開炮影片制作
- 我們這里用一個簡單的實體來說一下Animation的簡單用法
- 還是這個坦克模型,我要給他做一個簡單的開炮影片

- 這里我們選中這個坦克模型,按照以下圖示三步操作
- 選中游戲物件,打開Animation編輯視窗

- 然后進入這個畫面,點Create創建影片,然后選擇一個存放的地址,在Assets目錄下單獨新建一個管理影片檔案夾就行~


- 因為我這里想要的效果是讓坦克的炮筒(GameObject)前后移動,做成一個簡單的開炮影片
- 所以我這里選擇坦克的炮筒控制它的坐標位置前后變化來作為一個開炮影片!
- 那這一步的目的就是控制GameObject的Position位置,按一下圖示做就行

- 上述步驟完成后然后就是以下圖片所示模樣:

-
雙擊圖示紅色框部分可以新建一個關鍵幀,中間三個就是我新建的關鍵幀,這個關鍵幀可以左右拖動,代表關鍵幀執行的時間節點
-
有小伙伴可能想問這個關鍵幀有什么用呢,請接著往下看,就知道它的作用了!

-
然后我們把這五個關鍵幀的Position.z分別設定成:0,1,0,-1,0
-
將圖中那條白色豎線左右拖到關鍵幀上設定Position.z的屬性即可,輸完數值別忘了點回車,確認數值已經輸上!

- 然后有的小伙伴又要問了,這幾個數值有啥用呀,非要這樣設定嘛?
- 廢話不多說,先來看一下這樣設定出來的效果圖吧

- 雖然效果有點陋~但是勉強能達到我想要的一個開炮使得炮筒移動的效果,
- 我們上面的影片設定的五個關鍵幀,分別是Position.z的值為:0,1,0,-1,0
- 第一個關鍵幀Position.z的值設定為0,默認值我們沒改動
- 第二個關鍵幀將Position.z的值設定為1,讓炮筒向前移動一米
- 第三個關鍵幀將Position.z的值設定為0,讓炮筒復位
- 第四個關鍵幀將Position.z的值設定為-1,讓炮筒向后移動一米
- 第五個關鍵幀將Position.z的值設定為0,讓炮筒再復位
-
這樣就達成了上圖中的效果,炮筒前后移動一米,然后初末位置相同,形成一個簡單的無縫回圈動作,就達成我們的目的啦~
-
關鍵幀就是在一個我們指定的時間,將設定的影片屬性修改成我們設定的值
-
上面五個關鍵幀,相當于五個時間節點,在每個時間節點都設定好了他們應該執行的屬性
-
然后將這個檔案拖到Animation的組件上在腳本中呼叫執行影片的代碼就可以啦

💛腳本代碼控制影片API
- 上面的步驟設定完成之后,就可以在想使用影片的地方呼叫啦~
- 下面是簡單的影片播放和停止的呼叫方法
-
Play(“TankAnimation1” );,播放影片,傳入引數為影片名字
-
Stop(“TankAnimation1”) ,停止影片,傳入引數為影片名字
-
CrossFade(“TankAnimation1”, 0.5f); ,有過度的切換影片,傳入引數(影片名字,過度時間)
🔔Animator影片組件
- Animator是4.6版本以后出現的,Animator是影片控制器,控制Mecanim影片系統的介面,用來管理多個影片;
- Mecanim影片系統就是Animator

💚影片作業流程
- Unity的影片系統是基于影片剪輯的概念,其中包含了特定物件如何隨著時間改變其位置、旋轉或其他屬性的資訊,
- 每個片段都可以看作是一個單一的線性錄音,
- 來自外部來源的影片剪輯是由藝術家或影片師與第三方工具,如Max或Maya,或來自動作捕捉作業室或其他來源,
- 然后,影片剪輯被組織成一個被稱為Animator Controller的類似于流程圖的結構化系統,
- Animator控制器充當一個“狀態機”,跟蹤當前播放的剪輯,以及影片何時應該改變或混合在一起,
- 通俗來說就是就是通過Animator組件去控制Animator Controller中的影片切換,來達到我們想要的模型執行各種動作,
💙屬性介紹
Animator組件屬性:

-
Controller :影片控制器(影片狀態機)
-
Avatar: ?骼
-
Apply Root Motion: 應?根動作
-
Update Mode:影片的更新模式,
Normal:同步更新,影片速度與運行速度相匹配,運行速度慢,影片慢,
Animate Physics:影片是有物理的相互作用時,用此模式,
Unscaled Time:不成比例的時間,影片忽略當前的運行速度, -
Culling Mode:影片的裁剪模式,
Always Animate:總是啟用影片,不進行裁剪,
Cull Update Transforms:更新裁切,
Cull Completely:完全裁切,
其中骨骼與根動作這里不做研究,因為一般是建模師負責,我們用的時候不多
Controller 就要仔細研究一下了,因為他就是導致Animator強大的一個原因!
Controller 的屬性:

- Controller 新建方法:Creat -> Animator Controller

Animator Controller視圖:

-
可以在這個面板右鍵創建一個Empty,新建的第一個成為默認影片狀態!
-
也可以直接將影片從Project面板拖動到這個Animator Controller視圖中~

Animation States影片狀態:
點擊這個State可以查看(Animation States)影片狀態:

- Motion :當前狀態下的影片片段
- Speed :影片的默認速度
- Mirror :鏡像
- Foot IK :是否使用Foot IK
- 是否使用Foot IK :是否對沒有影片的屬性寫回默認值
- Transitions :由當前狀態出發的過渡條件串列
黃色顯示的狀態為默認狀態,指狀態機首次激活時所進入的狀態,可以在其他狀態上右擊選擇Set as Layer Default State命令改變默任狀態,
Animation Transitions(影片過渡)
在某一影片狀態右擊后選擇Make Transition,然后選擇過渡到的下一影片狀態,即可建立過渡聯系,

- 就是點擊影片之間的小箭頭這個


- Has Exit Time :有退出時間,上一個影片播放完畢才能執行過渡影片,
- Setting:設定
- Exit Time:退出時間
- Fixed Duration:固定持續時間
- Transfition Duratio:過渡持續時間
- Transition Offset:過渡偏移
- Interruption Source:中斷源
- Ordered Interuption:有序中斷
Animation Parameters(影片引數)

引數值的四種基本型別:
- Float:浮點數
- Int:整數
- Bool:回傳布林值,通過復選框來選擇True或者False
- Trigger:觸發一個布林值,復位控制器時消耗一個轉變,由一個圓按鈕表示,
Animation Layers(影片層)
- 實作同一時刻進行多種影片狀態播放,

Blend Tree(融合樹)
對兩個或更多個相似的運動進行混合,

制作:在視圖右擊空白處后選擇Create State -> From New Blend Tree,雙擊進入,
實體:


Blend Type(混合型別)
- 1D混合:通過唯一的一個引數來控制子影片的混合,
- 2D Simple Directional(2D簡單定向模式)適用于所有影片都具有一定的運動方向、其中任何兩段影片的運動方向都不相同的情形,
- 2D Freeform Directional(2D自由定向模式)適用于所有影片都具有一定的運動方向,但同一方向上可以存在多段影片,
- 2D Free Cartesian(2D自由笛卡爾模式)適用于影片不具有確定運動確定運動方向的情形,
Direct:直接,讓用戶直接控制每個節點的權重,
該內容部分知識參考文章 https://blog.csdn.net/NCZ9_/article/details/84639900
💜Animator類介紹
先來介紹下Animator的常用類,后面實戰演練會用得到

💞影片操作步驟
以下是一個實施影片的具體操作步驟:

-
1、配置好?骼
-
2、裁剪好影片?段
-
3、創建影片控制器 AnimatorController
- 添加影片?段
- 設定默認的影片狀態是哪個
- 設定影片與影片之間的過渡關系
- 添加影片引數
- 設定影片過渡條件
-
4、通過代碼調整影片引數,從?達成過渡條件,實作影片切換
💕Animator實戰演練:實作人物行走,攻擊影片切換
- 下面我們開始進行Animator實體介紹:實作人物行走,攻擊影片切換
- 這個實體就不需要我們自己設計影片了(不是科班出身,設計的影片還丑,怕你們吐槽~)
- 我們只需要將現成的影片使用腳本控制來實作目的!
開始操作
- 首先我們新建一個場景,匯入一個模型站立的小貓咪,如下圖:

- 因為我匯入的這個小貓咪的模型自帶幾種影片,所以我這里就不需要自己制作模型影片啦~
- 一般也都是這樣,我們只需要將這個影片在Animator Controller進行設計就好啦!

- 在小貓咪模型身上添加一個Animator組件:Add Component -> Animator

新建一個Animator Controller,上面已經講過了,這里再發一次~
并將這個Controller拖到Animator組件中~


-
雙擊打開Controller后,直接將影片從Project面板將影片片段拖動到這個Animator面板中即可
-
然后將他們之間的影片過渡關系設定好
-
如下圖中,Aert為待機影片,Move為移動影片,ATK3為攻擊影片
-
左邊是Animation Parameters(影片引數),上面提到過~
CanMove是一個Bool值,用來控制執行移動影片
Attack是一個Trigger值,用來控制執行攻擊影片
MovePlayerSpeed是一個Float值,用來控制移動影片的播放速度

- 這里有需要注意的一個點,點擊Move狀態,然后將MovePlayerSpeed添加上,因為我們待會要通過這個改變移動影片的播放速度!

待機影片向移動影片過渡設定::
- 點擊下圖中左邊待機影片向移動影片過渡的箭頭,在右邊有個小加號,將我們的影片引數CanMove加上,選擇True

-反過來則是CanMove加上,但是數值變為False

待機影片向攻擊影片過渡:
- 點擊左邊影片 Aert -> ATK3 的箭頭,然后點擊右邊的小加號,將Attack添加上

移動影片向攻擊影片過渡:
-
點擊左邊影片 Move-> ATK3 的箭頭,然后點擊右邊的小加號,將Attack添加上

-
但是到這里有的小伙伴可能就有些疑惑,為什么影片引數一個用Bool,一個用Trigger,還有一個用Float呢?
-
這個呢,是根據具體情況而定的
-
因為移動影片,使我們按下某個鍵后就一直執行的,所以用Bool值來進行移動的判定
-
但是攻擊影片呢,是你按下去一次就執行一次,顯然Trigger更適合攻擊影片
-
使用float值呢是為了改變影片的播放速度,顯然是一個數值,使用float是最好的選擇啦!
這樣的話在Unity視圖方面就設定完成了,接下來就是寫代碼控制影片的播放了
直接上代碼掛在我們的小貓咪身上就行啦!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CatAnimation : MonoBehaviour
{
[Header("移動速度")]
public float MoveSpeed = 1f;
[Header("旋轉速度")]
public float TurnSpeed = 5f;
private Animator ani;
private float hor, ver;
private void Awake()
{
ani = GetComponent<Animator>();
}
private void Update()
{
hor = Input.GetAxis("Horizontal");
ver = Input.GetAxis("Vertical");
if (hor !=0 || ver !=0)
{
ani.SetBool("CanMove",true);
}
else
{
ani.SetBool("CanMove",false);
}
//判斷當前角色是否正在播放移動影片
if (ani.GetCurrentAnimatorStateInfo(0).IsName("Move"))
{
//宣告一個臨時播放速度
float sp = 0;
if (ver >= 0)
{
if (Input.GetKey(KeyCode.LeftShift))
{
sp = 2;
}
else
{
sp = 1;
}
}
else
{
if (Input.GetKey(KeyCode.LeftShift))
{
sp = -2;
}
else
{
sp = -1;
}
}
//前后移動
transform.position += ver* transform.forward * Time.deltaTime * MoveSpeed;
ani.SetFloat("MovePlaySpeed",sp);
transform.eulerAngles += transform.up * TurnSpeed * hor;
}
if (Input .GetKeyDown(KeyCode.J))
{
ani.SetTrigger("Attack");
}
if (Input.GetKeyDown(KeyCode.LeftShift))
{
MoveSpeed *= 2;
}
if(Input.GetKeyUp(KeyCode.LeftShift))
{
MoveSpeed /= 2;
}
}
}
代碼決議:
-
代碼中在Awake中拿到Animator組件,在Update中定義了一個簡單的移動和旋轉的方法
-
然后通過判斷 是否按下水平和垂直軸 來進行 是否播放移動影片的方法
-
如果按下任意一個WASD或者上下左右鍵,呼叫ani.SetBool(“CanMove”,true);進行播放移動影片
-
不然就執行ani.SetBool(“CanMove”,false);執行待機影片
-
然后對當前是否進行播放移動影片進行了一個判斷:if (ani.GetCurrentAnimatorStateInfo(0).IsName(“Move”))
-
如果在播放移動影片,則按下Shift鍵時,對移動影片播放進行加速,并且加速小貓咪的移動速度,這樣就可以讓小貓咪的移動速度和影片播放速度更協調
-
不然的話小貓咪普通移動時的影片播放和加速移動時的影片播放就是一樣的,顯然不符合常理,之前所添加的MovePlayerSpeed屬性就是為了如此!
-
再就是按下J鍵的時候呼叫 ani.SetTrigger(“Attack”);進行攻擊影片的播放~
上動圖,看效果!

- 到此為止一個簡單的Animator使用就完成啦!
- 我做的這個只是最簡單的Animator使用方法,在真正的一個游戲里面,對影片這塊的內容操作也是極其復雜
- 本篇文章只是作為一個對Unity影片系統的基礎入門介紹+使用
- 想更深入影片系統還需要更多的時間進行研究!
👥總結
-
本文介紹了Unity中的兩種影片系統:Animation 和 Animator
-
目前前者用的較少,后者使用的較為普遍
-
文章不僅對Unity的影片系統做了一個簡單的介紹,還分別介紹了兩種影片系統的基礎屬性和實戰演練
-
感興趣的小伙伴可以自己動手演練一番,畢竟實戰出真知!
-
個人感覺介紹的可能沒有那么深,但還是挺詳細的,適合新手入門!
-
如果文章哪里寫的不好,請各位多多指教~
文章干不干,你來說了算!肝了兩天,碼字不易! -
覺得文章不錯可以給個三連支持一下博主哦~謝謝

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/287429.html
標籤:其他
上一篇:C語言案例教程詳解
下一篇:DHT協議介紹
