日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unity人物旋转移动代码_游戏诞生之日02 - 美术篇 快速制作人物动画

發布時間:2024/4/17 编程问答 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity人物旋转移动代码_游戏诞生之日02 - 美术篇 快速制作人物动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在上一篇《游戲誕生之日01 - 美術篇 快速搭建和渲染游戲的第一個場景》里,我們得到了一個靜態渲染的游戲場景。

接下來我們需要加入人物動畫,為游戲注入活力。

第五塊拼圖 - 動畫素材從哪里來

動畫文件中包含了很多關鍵幀,計算機根據當前時間對這些關鍵幀進行插值,形成了人物或物體的動畫。創作動畫的過程就是創作關鍵幀的過程。

動畫的創作是一個需要經驗積累的過程,需要了解動畫原理,并且對創作對象進行充分地進行觀察和嘗試。這不夠輕量,我們首先要先建立一條最短路徑。

如果你看過前一篇文章的話,你能猜出我們將怎么做:充分利用已經有的資源庫,先讓人物跑起來,有需要的話后期再進行迭代。

Mixamo動作庫

Mixamo 就是一個免費的動作庫,支持自動蒙皮和綁骨,動畫文件直接在網頁上就能進行預覽。這正是我們想要的。

Mixamo網站

我們可以上傳自己的模型,然后選擇任意動作后在網頁上預覽動作,此外還能修改一些預設的參數如步幅,播放速度等。當調整完成后選擇下載就可以將動畫下載到本地。

下載的動畫素材

這樣就得到了一系列動畫素材了。

骨骼規范

模型庫的動畫使用的模型和我上傳的模型,初始姿勢不一樣,手腳長度不一樣,怎么做到將對應動畫應用到對應位置的呢?

這就涉及到骨骼規范的問題。模型師在制作模型的過程中會遵循一系列的命名和父子排布規則來建立骨骼。當動畫系統識別到對應骨骼之后,會進行動畫重定向,即將動畫的運動范圍依據骨骼的長度進行縮放,以便讓一個小矮人的動畫也能通用到巨人身上。這在動作捕捉的流程中也是很重要的。

例如之前下載的 POLYGON - City Pack 資源中,模型就是標準的人物骨骼,如果將Standard Assets中的動畫控制器賦予人物,就直接能應用其中的動畫。

人物骨骼

在Unity中有兩套Avatar系統,人形動畫系統Humanoid,以及通用動畫系統Generic。對于一些非人形骨骼的怪物,或是有特殊定制的人物,會選擇Generic通用動畫系統,而我這里則選擇更加直觀的Humanoid人形動畫系統。

Humanoid

自定義模型動畫

除了識別人物身上自帶的骨骼,Mixamo還有一個強大的功能:自動蒙皮綁骨。這對于想要對模型進行自定義的開發者來說,真是好消息。手動刷蒙皮真是一件很繁瑣的工作。

為了測試自動蒙皮綁骨,我在3dsMax中將模型的骨骼全部刪除,再簡單地建了立方體和圓環,作為測試模型的帽子和手鐲。

導入Mixamo 選擇關節

將自定義的模型上傳Mixamo,拖動圓環到頸部,四肢的關節處,然后網站自動進行解算。

自定義模型動畫

可見自動蒙皮綁骨的效果也很不錯,甚至手指也的動畫也很自然。這為未來的迭代中魔改人物模型提供了可能性。

第五塊拼圖 - 動畫素材 蒙皮綁骨 Mixamo網站

  • 付出成本: 1
  • 上手難度: 1
  • 可控性: 3
  • 表現效果: 6
  • 性價比: 4.5

第六塊拼圖 - 如果動畫庫里沒有的動作呢

我們有了一段段的循環動畫片段,但目前還存在幾個問題:

  • 動畫庫可能缺少我們想要的動作。
  • 每個動畫片段的初始位置并不一樣,播放時直接切換片段會顯得非常生硬。
  • 有些特殊需求無法滿足,如上身保持射擊姿勢,下身依據玩家輸入走走停停。
  • 我們可以使用混合動畫片段來解決這些問題。相比從零開始創造出一個新的動畫而言,混合動畫要容易得多。

    動畫片段管理:動畫狀態機 Animator

    動畫控制器(Animator Controller)是Unity提供的動畫切換解決方案。在Animator中每一個動畫片段被視為一種狀態,一個Animator則構成一個狀態機。

    我們使用Animator就可以實現動畫的插值過渡和混合。

    Animator

    如上圖,圖中包含了角色在地面的狀態,在空中的狀態,下蹲的狀態。當動畫機啟動時默認進入在地面上的狀態,三個狀態間可以相互切換。

    過渡不同的動作姿勢:動畫過渡 Animation Transition

    不同的動畫可以順著Transition的連線自動插值過渡,這樣就實現了動作間的平滑切換。我們可以在Animator中任意連接Transition,并且在屬性窗口中,可以對過渡動畫時間,狀態變化條件等屬性進行設置。

    過渡箭頭的屬性

    狀態切換

    如上圖,當Animator的參數發生改變后,狀態也隨之改變。人物也就隨之做出平滑的過渡動畫了。

    混合不同的動作片段:混合樹 BlendTree

    如果我們想要的動作并非一個漸入漸出的過渡,而是兩個動畫的疊加狀態,例如:

    0.4 * 走路 + 0.6 * 跑步 = 快步走路動畫

    我們可以使用混合樹對兩個動作進行混合,用速度作為混合權重,就得到了走路狀態逐漸加速至跑步狀態的動畫。

    簡單地混合走路和跑步動畫

    不僅僅走路的跑步這樣的動畫可以混合,像是走路的拳擊這樣不相干的動畫同樣可以進行混合,說不定還會有意外收獲。

    除了使用速度作為權重值的1D混合樹,我們還可以使用速度+方向作為權重值,用2D混合樹混合出更復雜的結果。

    2D混合樹示例

    如上圖,動畫不僅受向前的速度影響,還受左右轉向影響。屬性窗口清晰地顯示出動畫混合樹的狀態空間。

    每個片段僅使用一部分:動畫遮罩 AvatarMask

    因為我們Avatar使用了標準的Humaniod系統,就可以對一些骨骼進行屏蔽組合。

    AvatarMask 屏蔽身體的骨骼

    瞄準動畫

    例如當人物要舉槍瞄準時,我們可以在原來的跑步動畫上覆蓋一個瞄準的上身動作。

    這里還涉及到動畫的層(Layers),多層動畫可以進行覆蓋和疊加,還可以調整每一層占的權重,上圖中動畫就分為了基礎移動動畫層與控制上身的手臂動畫層。

    簡單地開始制作動畫:反向動力學 IK

    如果以上解決方案均不能得到滿意的動畫片段,或是做一些手腳位置較為固定的動作,可以考慮使用反向動力學進行動畫制作。

    人物身上有很多關節和骨骼,如果使用前向動力學,每一個骨骼的位置都由父節點確定,如果要調節手臂動畫就需要調節肩膀-大臂-小臂-手腕的骨骼,效率太低。而反向動力學則是先確定子骨骼的位置,再逆向確定父骨骼的位置,四個節點就可以控制人的基本姿態,調節起來更加輕松快速。

    要使用反向動力學,需要自己掛載一個代碼腳本,想了解更多可以參考博客《Unity IK 反動力學動畫》。

    public class IKTest : MonoBehaviour {//我們的目標膠囊體public Transform Target;//獲取要操作的animatorpublic Animator Animator;//unity自帶的ik方法,開啟ik通道會執行private void OnAnimatorIK(int layerIndex){//設置右腳骨骼的權重,0-1,可自行改變查看效果Animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1f);Animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1f);//設置右腳骨骼的ik目標為膠囊體的坐標和旋轉Animator.SetIKPosition(AvatarIKGoal.RightFoot, Target.position);Animator.SetIKRotation(AvatarIKGoal.RightFoot, Target.rotation);} }

    反向動力學 示例

    我想這些解決方案組合起來,已經足夠應付一般的運動和演出了,是時候該繼續往下走了。

    第六塊拼圖 - 動畫二次編輯 Unity動畫系統

    • 付出成本: 3
    • 上手難度: 2
    • 可控性: 4
    • 表現效果: 5
    • 性價比: 1.8

    第七塊拼圖 - 怎么結合到人物控制中

    這里會稍稍引入一些程序的簡單知識,以保證理解的連貫性。

    我們在控制人物時經常需要和動畫系統進行交互,考慮下面兩個常見的場景:

  • 當用戶輸入前進指令的時候,人物向前移動,播放向前的動畫。
  • 玩家點擊鼠標時,播放掏槍射擊動畫,玩家射出子彈。
  • 分析這其中的邏輯關系,可以分為兩類情形:

    程序傳遞消息到動畫系統

    如在用戶輸入前進命令或射擊命令時,程序需要告訴動畫系統播放哪一段動畫,在Animator中,這是通過狀態機的Parameter參數來實現的。步驟是這樣的:

    檢測到程序輸入 -> 程序設置狀態機的參數-> 動畫播放完成(或動畫不需要退出時間) -> 判斷過渡箭頭的條件 -> 依據條件切換狀態

    我們可以用以下接口來實現這個消息傳遞。

    Animator.SetBool(string ParameterName, bool ParameterValue);

    動畫系統傳遞消息到程序

    有一些反饋并不是即時的,需要依靠動畫系統時間來進行觸發。例如用戶點擊鼠標后到人物掏出槍射擊是有一定延遲的。點擊鼠標僅僅是告訴動畫系統要播放射擊動畫,而射擊事件則需要動畫系統在射擊那一幀進行觸發。同類的事件還可能存在于格斗游戲的連招,或是動作游戲的彈反機制中。

    動畫系統傳遞消息的機制是AnimationEvent,使用這樣的方式能夠實現恰好在射擊那一幀發射出子彈,更加真實可信。

    制作人物控制器可以參考Unity的示例項目Standard Assets,或是AngryBots2。為了通用AI和玩家的動畫邏輯控制,建議將接收輸入與動畫控制拆分為兩部分。

    在Unity中快速制作人物動畫https://www.zhihu.com/video/1176986907514454016

    這樣就完成了基本的人物動畫。人物動畫是GamePlay的重要構成部分,還有很多地方值得挖掘,我們到適當的時機再繼續深入。

    第七塊拼圖 - 人物控制 第一/第三人稱控制器

    • 付出成本: 3
    • 上手難度: 2
    • 可控性: 4
    • 表現效果: 5
    • 性價比: 1.8

    我們又新增三塊拼圖,現在能夠做出一個可動的場景了。但是為了完成場景的交互,以進一步實現游戲的玩法設計,我們還需要引入更多的模塊。

    思維導圖

    下一章打算研究一下特效和物理相關的話題,做出更為可信的效果,敬請期待。

    這一系列文章將會收藏于專欄之中,希望大家多多支持。

    游戲誕生之日 - 游戲開發流程研究?zhuanlan.zhihu.com

    只要對游戲開發有興趣,歡迎加入交流群 Unity游戲開發流程研究 479984340

    總結

    以上是生活随笔為你收集整理的unity人物旋转移动代码_游戏诞生之日02 - 美术篇 快速制作人物动画的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。