Animator Controller的使用以及配合PlayMaker設置交互控制


在Unity3D的當前版本中,Animator Controller已經全面取代了原來(大概是4.x版本左右)的Animation系統。

從本質上來說,Animator Controller是一個內置在Unity3D中的,專門用于動畫控制的“狀態機”,所以學習Animator Controller和學習PlayMaker有一定的共通之處。

從實際的使用場景來說,Animator Controller雖然可以建立復雜的運動邏輯,但其本身并不具備任何交互能力,也就是說我們不能僅使用Animator Controller就達到“控制”目標對象動畫的目的,還必須撰寫Script(腳本)來操縱Animator Controller中的Parameter(參數)從而真正控制對象的動畫。或者,使用PlayMaker來代替C#腳本。

因此,本章內容主要分為三個部分:

  • 從fbx文件中導入或直接在Unity3D中制作動畫片段(Animation Clips)
  • 在Animator Controller設計動畫邏輯
  • 在PlayMaker中制作交互控制Animator Controller

生成動畫片段(Clips)

導入FBX文件中的動畫

可以參看文章:為Unity3D創建素材(2):模型、綁定、動畫 中的相關內容

FBX中的動畫會被識別為動畫片段文件(.anim),但存在于FBX中的動畫片段不可被編輯,所以如果需要修改或者重復調用這些文件,建議還是Ctrl+D復制一份之后再使用。

另外,FBX中的動畫是根據角色的Avatar設置而生成的,因此雖然理論上動畫可以重復使用,但其前提是兩個角色都使用了相同的Avatar設置。最簡便的方法是將所有角色都設置成Humanoid類型的Avatar,這樣就可以避免因為Avatar的不同而產生動畫映射出錯的問題。

比如"Unity-chan!" ModelHQ Fighting Animation FREE這兩個素材,雖然都使用了同一個角色模型,骨骼設置也都是一樣的,但由于Avatar設置不同,所以個素材中的動畫是不能直接共用的,必須將一個修改成另一個的Avatar(比如將HQ Fighting Animation FREE中的所有帶Animation的FBX都設置成Humanoid形式)之后才能通用。

animation_01.png
animation_02.png

創建動畫

簡單的動畫可以在Unity中直接生成。

從菜單Window -> Animation打開動畫面板。如果選擇的游戲物體上沒有附加任何動畫片段,動畫面板上應該是這樣的:

animation_03.png

點擊Create按鈕并保存文件,則為該游戲物體創建了一個動畫片段(.anim),點擊左上方的“錄制”按鈕可以進入錄制狀態,也可以理解成進入“自動創建關鍵幀”的狀態。在這個狀態中我們對任何參數進行修改,都會自動為這些參數創建動畫關鍵幀,并記錄在動畫片段中。

animation_04.png

除了Transform組件上的屬性,我們還可以手動點擊Add Property為該游戲物體上其他組件的可動畫參數創建關鍵幀動畫。

animation_05.png

關閉“錄制”按鈕可以將動畫保存起來。一個游戲物體上可以附加有多個動畫片段,比如下圖中的Cube就是當前正在編輯的動畫片段的名稱,而點擊這個名稱則可以切換到其他動畫片段或者創建新的動畫片段。

animation_07.png

添加了動畫片段的游戲物體中會自動添加上Animator組件,并自動附上Controller。要注意的是,下圖中的Controller參數中的Cube和上面動畫片段的Cube并不是一回事,只是Unity自動創建了相同名稱的Controller和動畫片段而已。

animation_06.png

雙擊Cube Controller打開編輯器:

animation_08.png

這是最簡單的一個動畫邏輯:當被載入時,播放Cube動畫。

單擊這個橘色的Cube,在Inspector中會顯示這個“狀態(State)”的詳細設置:

animation_09.png

這個狀態所調用動畫片段(Motion)是“Cube”,播放速度(Speed)是正常1倍速,由于這個動畫片段中僅有一個關鍵幀,所以其實它是不包含任何“動畫”的,只不過是一個“姿勢”而已。對于Unity3D來說,“姿勢(Pose)”和“動畫(Animation)”本質上是一樣的。

雙擊這個橘色的Cube會直接選擇到Cube動畫片段文件:

animation_17.png

下面我們給這個Cube創建一個自動旋轉的動畫片段:

animation_10.png

這個動畫很簡單:3秒鐘以內,Y軸旋轉360度。有幾個細節值得留意一下:首先,Transform上的動畫關鍵幀,一加就是加3個(x、y、z),這是因為Unity對于位置數據是作為Vector3類型來處理的;然后,當處于“錄制”狀態時,Animator組件是處于“不激活”狀態的,這樣我們才可以在場景視圖中觀察到所制作的動畫。

打開Animator面板,可以看到多出來一個灰色的狀態“Rotate”,這就是剛剛制作的旋轉動畫。如果沒有自動出現,可以將Rotate.anim文件拖進來。

animation_11.png

運行游戲時,這個Cube是不會旋轉的,因為當前被播放的是Cube動畫。

我們可以右鍵單擊Rotate,選擇Set as Layer Default State,這樣會讓Rotate變成初始“狀態”,游戲運行時就會自動播放了。

animation_12.png
animation_13.png
animation_14.png

設計動畫邏輯

Animator Controller的基本動畫邏輯是:一個游戲物體可以使用任意多個動畫片段,每個動畫片段都是一個獨立的“狀態”,而運動的變化則體現為從一個狀態到另一個狀態的過渡。

比較先進的是,Animator Controller中狀態到狀態的過渡,可以是“漸變”的,因此運動變化顯得非常自然。

用小方塊做一個簡單的例子

我們先從這個簡單的小方塊動畫開始。

這里我們有兩個狀態,靜止和旋轉。我們可以將初始狀態依然設置給Cube,然后右鍵單擊Cube,選擇Make Transition,然后將箭頭指給Rotate狀態。

animation_15.png
animation_16.png

這個意思是“當Cube狀態的動畫播放完畢,則過渡到播放Rotate狀態的動畫”。點擊這個連線,可以看到實際的Transition參數:

animation_18.png

從這里可以看到兩個動畫片段是如何“融合過渡”的(其實跟Maya的Trax Editor,或者Premiere的軌道編輯器挺像的)。

我們可以看到這個過渡并不是一開始就發生了的,而是在Cube狀態停留了大概1秒鐘的時候才在大概1/4秒的時間內過渡到Rotate狀態。

我們可以在這個軌道圖上對整個動畫過渡進行修改。

不論怎么修改,整個過渡都依然是“自然過渡”,也就是前一個狀態播放完畢過渡到下一個狀態。除非我們為它提供一個條件(Condition)。

目前的Conditions一欄中是空的,點擊小+號添加一個條件,但提示說:“沒有任何參數存在”。條件是需要用參數來指揮的。

回到Animator Controller面板,左上方Parameters一欄中點擊小+號添加一個新的參數,這里我們選擇Bool類型,命名為“Rotate”。

animation_19.png
animation_20.png
animation_21.png
animation_22.png

然后指定這個Rotate參數為剛剛創建的Condition,并設置當Rotate取值為true時,條件成立。

animation_23.png
animation_24.png

同理,我們再創建一個從Rotate狀態到Cube狀態的Transition,并添加一個條件,并設置成當Rotate取值為false時,條件成立。

animation_25.png

運行場景,小方塊一直在Cube狀態循環,手動點擊Rotate參數使其為true,小方塊開始旋轉。手動修改Rotate參數為false,小方塊又停了下來。

目前小方塊的旋轉和停止都有點“滯后”,這是因為兩個Transition中都勾選Has Exit Time選項,這個選項保證必須播放到一定時間才能進行過渡,在有些情況下是需要的,但這個簡單例子中卻并不需要。

取消這兩個勾選,我們就作出了一個非常簡單的旋轉動畫控制邏輯。

將這個場景保存起來。

用Unity-Chan做一個復雜一些的例子

新建場景,導入"Unity-chan!" ModelHQ Fighting Animation FREE這兩個素材。

animation_26.png

找到UnityChan -> Models中的unitychan.fbx文件,拖到場景中。建議拖動到Hierarchy面板中松開鼠標,這樣會將模型生成在場景原點位置,如果直接拖到場景面板中,則很有可能不在原點位置。

animation_27.png

在Assets文件夾中單擊右鍵創建一個新的Animator Controller資源,命名為UnityChan_AC,并將這個Animator Controller配置文件拖到場景中unitychan物體的Animator組件的Controller參數上去,這就為該角色的Animator指定了一個控制器。

animation_28.png
animation_29.png

雙擊打開UnityChan_AC,目前是沒有任何狀態的,這是因為這個.fbx文件只是一個模型文件,不包含任何動畫,當然也就沒有任何“狀態”。我們可以在目錄:UnityChan -> Animations中找到包含動畫數據的.fbx文件,但這些文件的模型貼圖都不正確。

animation_30.png
animation_31.png

選擇某個動畫文件,并不能看到正確的動畫預覽,即便是點擊小箭頭展開之后選擇其中包含的動畫數據文件,也只能看到模型不完整的預覽動畫。這是因為這些動畫文件中根本就只有骨骼和面部多邊形,并沒有身體的模型數據。

animation_32.png

我們可以將場景中的unitychan模型拖動到預覽窗口,這樣就可以預覽到該動畫在我們希望的目標模型上的表現了。

animation_33.png

點擊預覽窗口的播放按鈕可以播放動畫。

animation_34.png

由于Animations文件夾里面動畫很多,我直接利用搜索功能來尋找所需要的動畫文件。

animation_35.png
  1. 這里是搜索欄,搜索的范圍默認是整個Assets文件夾,但可以修改為搜索當前文件夾或者搜索Asset Store;
  2. 這里的滑桿拖到最左邊是以文件名方式顯示,適合同時查看較多的文件對象,拖到最右邊是最大的圖標顯示,適合查看文件對象內容;
  3. 這里可以看到當前選擇的文件所處的文件夾路徑,可以以此判斷是否是我們想要的資源,因為有可能在不同的文件夾下有同樣名稱的資源,比較容易發生混淆;
  4. 這種圖標就代表了動畫數據文件,選擇這樣的文件可以在預覽窗口中預覽到動畫效果。

WAIT00是我現在所需要的靜止動畫,其他幾個wait動畫都過于動感了。

WAIT00拖動到Animator Controller中,設置為初始狀態。運行場景,可以看到角色已經不是T-Pose站立了。如果當前的攝影機角度不適合查看角色模型,可以自行修改一下。

animation_36.png

如果我們使用“idle”作為關鍵詞來搜索,可以搜索到另一個素材包中所包含的Idle動畫文件,但這個文件不能直接應用在現在這個角色身上。

animation_37.png

如果強行使用,會得到非常奇怪的效果:

animation_38.png

找到這個Idle動畫數據所在的文件:FUCM05_0000_Idle.fbx,修改其導入參數的Animation Type為Humanoid(UnityChan的模型就是用的Humanoid類型),點擊Apply應用該修改。

animation_39.png

再次運行場景,這回動畫就顯示正常了。

animation_40.png

從“站”到“走”到“跑”

下面我想實現這樣的一個動畫邏輯:角色根據其移動速度自動選擇是站立原地不動,還是慢慢行走,或者快速奔跑。這個動畫邏輯非常適合使用Animator Controller的Blend Tree來制作。

Blend Tree可以被看作是一個特殊的“狀態”。

在Animator Controller面板中點擊右鍵,新建一個Blend Tree,修改狀態名稱為Localmotion,并設置其為初始狀態:

animation_41.png
animation_42.png

雙擊打開Localmotion,可以看到:

  • 默認Blend Type為1D,也就是說當前使用的一維模式,僅使用一個參數來控制動畫混合;
  • 自動為我們創建了一個Blend參數,數據類型是Float,同時指定Blend參數為該Blend Tree的控制參數,也就是說,當Blend數值從0~1變化時,角色依次從一個Motion變化到另外的Motion;
  • 當前Motion欄中是空的,需要點擊小+號來添加融合的動畫片段數據。
animation_43.png

添加3個Motion,出現一個圖示表示這3個Motion是如何被混合的。

使用搜索功能搜出WAIT00WALK00_FRUN00_F三個clips,分別依次拖到這3個Motion框中。

animation_44.png

Animator Controller中的圖示變成下面這個樣子:

animation_45.png

拖動Blend滑桿,可以看到后面3個狀態依次高亮(高亮表明在融合中的權重較高),且Inspector面板中的圖示也相應發生變化。

運行場景,這時拖動滑桿就不是很有作用了,因為這個滑桿并不會影響到真正Blend參數的取值。但我們可以手動修改Blend值來檢查動畫混合是否正確:

  • Blend = 0時,角色播放靜止動畫;
  • Blend = 0.5時,角色播放步行動畫;
  • Blend = 1時,角色播放跑步動畫;
  • Blend處于0 ~ 0.5,或者0.5 ~ 1之間時,角色播放的動畫是融合的。

跳躍動畫

跳躍動畫的一般設計邏輯是這樣的:當某個按鍵被觸發時,角色動畫立刻切換到播放跳躍動畫,同時利用動力學或者直接編輯位置屬性的方式讓角色模型沿Y軸發生上升下降的運動模擬跳躍,然后檢測角色是否落地(碰撞體與地面發生接觸),如果落地,則立刻切換回行走動畫或站立動畫。

在Animator Controller中,我們沒辦法去移動角色或者檢測角色是否落地,只能做動畫的切換。

回到Base Layer,搜索出JUMP00動畫片段,拖到Animator Controller中,修改狀態名稱為Jump

animation_46.png

新建一個Bool類型的變量IsJump

animation_47.png

Localmotion創建一個Transition指向Jump,再從Jump創建一個Transition指向Localmotion

animation_48.png

選擇從Localmotion指向Jump的Transition,取消Has Exit Time的勾選,并新建一個Condition,設置條件為:IsJump = true。

animation_49.png

同理選擇從Jump指向Localmotion的Transition,為其設置條件為:IsJump = false。

這時如果我們運行場景,當手動設置IsJumptrue時,角色會馬上開始跳躍,然后如果手動設置IsJumpfalse,角色馬上轉回運動狀態(Blend參數設置為0.5或者1)。

但如果一直處于IsJump = true,Jump動畫播放完以后不會自動轉換會Localmotion。如果想要自動轉換,可以再創建一個從Jump指向Localmotion的Transition,不取消
Has Exit Time的勾選,也不設置任何條件。

運行場景,發現并沒有如我們所想的轉換動畫到Localmotion,而是不斷重復Jump動畫,我一開始認為這是因為JUMP00動畫片段被默認設置為Loop循環播放了,所以我找到JUMP00動畫片段所在的JUMP00.fbx文件,發現其Loop Time并沒有被勾選。其實關鍵原因還在于IsJump = true這個設置。Jump跳轉回Localmotion之后,因為IsJump依然為true,所以立刻又跳轉回Jump了。這不是我們在Animator Controller中能夠解決的問題,我們留到后面再解決吧。

受打擊動畫和死亡動畫

這兩種動畫的邏輯都是在滿足特定條件下即激活,但與跳躍動畫的實現有一些不同之處。主要表現在受打擊和死亡都不需要使用Bool類型的參數來控制,只需要一個“開關”就好了,所以通常使用Trigger類型的參數來進行觸發。

新建兩個Trigger類型的參數:HurtDie。然后搜索DAMAGE00動畫片段作為受打擊動畫。

animation_50.png

這次我們從Any State新建一個Transition到DAMAGE00,設置無退出時間,設置其條件為Hurt(因為是Trigger,所以并無取值,是最方便的一種條件了)。

animation_51.png

然后從DAMAGE00創建一個Transition到Localmotion,使其受打擊完畢以后繼續返回正常休息或行走姿勢。

animation_52.png

大家可以測試一下先讓角色跳起再讓角色受傷,動畫混合得還挺不錯的。從Any State開始設置Transition挺方便,但也蠻容易出現奇奇怪怪的混合結果,大家要小心一點。

這兩個素材中我都找不到合適的死亡動畫,勉強拿DamageDown用用,大家別忘了修改其所在的.fbx文件的Avatar設置,并確保動畫的Loop Time未勾選。

animation_53.png
animation_54.png
animation_55.png

Any State新建一個Transition到DamageDown,設置無退出時間,設置其條件為Die,這次就不用再設置跳出的Transition了,因為這是死亡狀態了嘛。

animation_56.png

這里會有一個小bug,因為既然從Any State都可以過渡到DamageDown,那么從DamageDown本身也可以,所以我們可以一再激活Die Trigger來讓角色“死了又死”,不過這個bug很容易在腳本中被修復,這里也暫時不管他。

連擊

很多格斗游戲或者動作游戲中都有連擊(Combo)的概念,大概意思是如果連續攻擊判定成立,角色依次播放不同的攻擊動畫,以達到華麗的視覺效果。

我們這里也利用Animator Controller做一個簡單的連擊動畫邏輯。

在Animator Controller中單擊右鍵,選擇Create Sub-State Machine創建一個“子狀態機”,更改名稱為“Attack”。

“子狀態機”相當于把一個復雜的狀態機的一部分“打包”起來,方便我們的設置。

animation_57.png

雙擊進入Attack,然后搜索出Jab(左輕拳)、Hikick(高踢)、Spinkick(回旋踢)、RISING_P(升龍拳)四個動畫片段(都在HQ Fighting Animation FREE素材中),拖到Attack子狀態機中。

animation_58.png

新建一個名稱為Combo的Bool類型參數,以及一個名稱為Attack的Trigger類型參數。

依次建立JabHikickHikickSpinkickSpinkickRISING_P以及RISING_PJab的Transition,統統設置成有Exit Time,觸發條件為Combo = true。

animation_59.png

然后在依次建立從這4個狀態到Exit狀態的Transition,統統設置成有Exit Time,觸發條件為Combo = false。

animation_60.png

這樣設置的意思是:如果“連擊”條件成立,則依次輪換進行輕拳、高踢、回旋踢、升龍拳四種攻擊,否則,就在當前攻擊動畫完成后進入“退出”狀態。

然后返回Base Layer,設置從LocalmotionAttack的Transition,無Exit Time,觸發條件為Attack Trigger,同時設置從AttackLocalmotion的Transition,不做任何修改。

animation_61.png

因為Attack子狀態機中的所有狀態都回歸到Exit狀態,所以從AttackLocalmotion的Transition顯示為灰色,表明是自然過渡。

我們在Attack子狀態機中還可以直接設置某個狀態往Base Layer中的某個狀態的Transition,那就要連接到(Up) Base Layer狀態并自行選擇目標狀態了,我們這次不搞得這么麻煩。

animation_62.png

測試發現,從Localmotion過渡到Jab的時候幾乎看不到輕拳攻擊的動作,這是因為默認的過渡時間太長,導致出拳動作被“洗”掉了。修改Transition中的動畫過渡,讓其變得很短就可以了。

animation_61b.png

運行場景,設置Blend為0.5,角色開始步行,然后勾上Combo,再激活Attack,角色開始“四連擊”,由于這幾個動作的動畫片段都沒有設置成原地動畫,所以實際在場景中是有位移的,看起來挺爽快。

取消Combo的勾選,角色回歸步行動畫。

如果不希望有位移,可以為這幾個動畫所在的.fbx文件設置Root Motion:在Animation設置中,找到Motion一欄,然后設置Root Motion Node<Root Transform>,最后點擊Apply確認修改。

animation_63.png
animation_64.png

控制Animation Controller

準備場景

  • 安裝PlayMaker插件;
  • 為場景添加一個地面Plane(10×10×10);
  • 為unitychan游戲物體添加一個Rigidbody組件,一個Capsule Collider組件,修改參數以適合角色模型;
animation_65.png

使用PlayMaker操控Animator Controller的參數

PlayMaker提供了一系列與Animator Controller有關的Actions:

animation_70.png

我們暫時只關心與Animator參數有關的內容。

為場景中的unitychan添加一個Fsm,改名為AC_Test,我們用這個Fsm來測試一下如何控制Animator Controller的參數,從而操縱角色動畫。

在State 1中添加1個Set Animator Float行為,設置使用speed變量來控制Blend參數:

animation_71.png

然后在Variable面板中設置speed變量在Inspector中可見,運行場景,現在就可以在Inspector中通過調整speed變量來控制角色停走跑了。

可以再添加一個Get Axis Vector行為,將方向輸入向量儲存為axis vector變量,將Magnitude(可以理解為輸入向量的長度)儲存為magnitude變量。修改Set Animator Float行為的Value參數,改為使用magnitude變量來控制Blend參數值。

animation_72.png

運行場景,現在可以通過“AWSD”或者方向鍵來操控角色從停到走到跑了。

Get Axis Vector行為我們在設置角色運動控制中用得非常多,具體可以參見 PlayMaker簡單實例(2):角色與攝影機的運動控制 一文中的內容。在不做放大的情況下,Magnitude的取值會在0~1.414之間變化,單軸向最大值1,兩個軸向一起最大值為1.4左右(2的平方根)。

State 1中添加一個Get Button Down行為,設置當“Jump”按鈕(默認設置是空格鍵為“Jump”按鈕)被按下時,觸發事件“Jump”,然后跳轉到State 2。然后再添加一個Set Animator Bool行為,設置Animator的IsJump參數值為false。

animation_73.png

State 2中添加一個Set Animator Bool行為,設置Animator的IsJump參數值為true,然后添加一個Wait行為,設置為等待1.5秒之后觸發事件“Landing”,跳轉回State 1

animation_74.png

一些解釋:

  • State 1中添加Set Animator Bool行為的目的是確保IsJump參數值在State 1中為false,否則不會停止跳躍動畫,這也解決了之前Animator Controller設置的一個小bug。
  • Wait行為中設置1.5秒的原因是Jump動畫大概在1.5秒的時候就完成了,這里這樣設置可以保證不會連續多次跳躍。更有效的做法是監測碰撞體是否碰到了地面,或者監測Rigidbody的Y軸速度是否大于某個數值(比如0.1)來確保跳躍動畫完成時切換狀態。

下面是關于攻擊的設置。首先在State 1中添加一個Get Key Down行為,設置當F鍵被按下時,觸發事件“Attack”,跳轉到State 3,同時在State 1中用Set Animator Bool行為設置Combo參數值為false。

animation_75.png

State 3中:

  • 使用Set Animator Trigger行為,設置Attack被觸發(所以一進入State 3角色就開始攻擊);
  • 同時使用Set Animator Bool行為設置Combo參數值為true,開始連擊;
  • 使用Get Key Down行為,設置當F鍵被按下時,觸發事件“Attack”,重新進入State 3
  • 最后使用Wait行為,設置0.2秒后觸發Stop Attack事件,跳轉到State 1,結束攻擊狀態。
animation_76.png

這樣做的效果是:如果F鍵被按得足夠頻繁(間隔 < 0.2s),則State 3會不停重置,導致Wait行為一直不能累積足夠時間來觸發Stop Attack事件。

這只是一個非常簡陋的邏輯,大家可以自行探索更合理更有效的邏輯思路。

這樣,我們就制作了控制角色動作的交互邏輯,下面將這套交互與真正的角色運動結合起來。

刪除AC_Test或者使其不激活,為unitychan另建一個Fsm:

State 1中先設置角色的運動速度:

  • 首先用Get Axis Vector行為獲得基于相機視角的方向輸入,儲存為input axis變量,將Magnitude儲存為magnitude變量
  • Vector3 Multiply行為將input axis變量放大,倍數參數使用新建的speed變量(設置初始值為6)
  • Set Velocity行為給角色添加上運動速度,速度矢量使用input axis,坐標空間選擇世界坐標(World),勾選Every Frame選項;
  • unitychan的Rigidbody組件中勾選x軸和z軸的旋轉約束,避免角色發生“側翻”。
animation_77.png

然后在State 1中設置角色的面朝方向:

  • Get Position行為獲得Owner位置my position
  • Vector Operator行為將my Position加上input axis,儲存為aim position(這是一個角色指向輸入方向的位置);
  • Smooth Look At行為讓角色平滑地朝向該位置,并確定Keep Vertical選項被勾選以保持Y軸始終指向天空;
  • 最后使用Set Animator Float行為,設置使用magnitude變量值來控制Blend參數。
animation_78.png

然后再按前面的做法依次添加上對跳躍、攻擊等動畫的控制。

animation_79.png
animation_80.png
animation_81.png

最后對Animation Controller做一點小修改,刪掉從RISING_PJab的Transition,讓RISING_P成為“終結技”。

受傷和死亡的動畫控制就留給大家自己完成吧。

實際應用中對于跳躍動畫的實現

真正要做個可玩的跳躍交互邏輯需要對角色的速度以及碰撞有所判斷。至少要像下面這樣有3個不同的狀態。我使用一個剛體(Rigidbody)小方塊來做演示:

animation_84.png

State 1中設置了小方塊的移動和自動轉向的交互邏輯,最后添加一個Get Key Down來探測Space鍵是否被按下,按下則跳轉到State 2

animation_85.png

State 2中利用Add Force行為來實現跳起,也就是給角色一個向上的力量,我設置Force Mode為Impulse可以保證這個力量的一致性和瞬時性。

Get Velocity行為中,我實時獲取Y軸速度,然后用Float Compare行為監測其是否為負,為負代表小方塊在下降,這時候就可以跳轉到State 3去判斷是否落地了。

animation_86.png

State 3中使用Collision Event行為監測是否有標簽為“ground”的碰撞體與角色碰撞,如果有,則跳轉回State 1結束跳躍。

最后把地面物體添加上標簽“ground”,這樣就可以用空格鍵控制小方塊跳躍了。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,543評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,131評論 5 13
  • iOS視圖控制器詳解 視圖控制器中的視圖顯示在屏幕上有兩種方式:最主要的方式是內嵌在容器控制器中,比如 UINav...
    coder_feng閱讀 11,244評論 2 12
  • This article is a record of my journey to learn Game Deve...
    蔡子聰閱讀 3,833評論 0 9
  • 1. 準備場景 下載并導入官方Space Shooter教程的范例素材包,我們僅使用其中的模型、材質、貼圖、Pre...
    shimmery閱讀 6,444評論 0 16