Unity3D – Animator Condition

簡介

在我們學習到了建模→上材質→套骨架→製作了許多動畫後,我們在各種模擬平台基本上都可以使用上,但是每一個軟體的平台都有自己的一套撥放、控制動畫的模式。

控制動畫已經是一個不可或缺的技能,在Unity3D中有數種動畫控制的方法,而最基本的切換Animation透過Animator Condition,雖然在Unity Asset Store可以下載到很多的套件可以快速套用,但這篇我還是想要分享一下最基本的Animator Condition,讓我們開始吧。

Animator Condition

Animation Parameters是在動畫控制器中定義的變量可以從腳本訪問和分配值 。這就是透過程式可以控製或影響狀態機流程的方式 。讓我們來看看Unity提供幾種的Condition參數。

在這邊介紹一下這幾個參數:

  • Float , Int : 浮點數的參數與整數的參數,這通常運用在程式來判斷數值來觸發動畫,浮點數通常會使用在時間的判斷、血量的判斷等等,而整數數值通常用在打擊次數或是適用於沒有小數點的數值判斷中。
  • Bool : 判斷布林值,例如假如腳色進入了某個區域要啟動開門的動作,這時就會用到這個控制參數。
  • Trigger : 你可以把這個參數想像成一個開關,通常用在腳色的控制,當你按下某Input後隨即觸發Trigger參數進而啟動動畫。

實際操作

在實做之前你要準備好要控制的角色與角色動畫,並創立一個腳色Animator,如上圖,你可以看到有幾個灰色的區塊,這些都是要觸發的動畫。上圖二,點進去會呈現你用哪一個Animation、動畫的撥放速度等等的參數,我們這邊都使用預設。

  • 0 : 角色待機
  • 1 : 角色招牌動作
  • 2 : 角色喘息
  • 3 : 角色跑步
  • 4 : 角色攻擊

Animator腳本

我們在設定控制參數時就要先想好控制腳本,回到上圖一,你可以看到有些Animation Transform箭頭,有的是雙向,有的是循環單向的(1)(3)。你可以把雙向的就是撥放一次就回到(0)的角色待機動畫,而角色喘息(2)就會使用單向循環,等她喘完才會回到角色待機,最後可以看到角色攻擊(4),這時候就會用到Condition的數值控制了,以上就是Animator Condition腳本概述。

新增Condition

這邊我們就根據上述腳本來新增參數,請到Animator中的Parameters按下”+”來新增。

就如上述腳本所說的我,這邊我就搭配程式碼來介紹,我就省略角色控制的程式碼,單純的介紹Animator Condition:

(3)是比較單純的觸發控制,但是要隨時偵測按鍵是否被按下或按起來,我們先點到Transform的箭頭,點下後會出現右側編輯視窗,這邊有一個很重要的重點要注意,就是假如你要讓你角色可以瞬間切換動畫,不需要等動畫播完的話就要把上圖打星星的勾勾「Has Exit Time」取消。

接著看到下方Condition區塊,把相對應的參數按下”+”放進來,這邊我是要控制觸發角色跑步的參數。而在放開向前跑的按鍵後,如上圖二,按下回到待機的鍵頭並設定不跑的參數即可。

//向前跑的程式 按下鍵盤W
if(Input.GetKeyDown(KeyCode.W))
{
   CharacterAnimator.SetTrigger("Run");
}

這是有打勾與沒打勾「Has Exit Time」的差別。

(2)是要偵測玩家跑了多久之後並放開跑的按鍵會進入角色喘息參數判斷,假如符合就撥放角色喘息動畫,撥放完即刻回到待機動畫。 由於這是要跟角色跑步動畫相互配合,所以剛剛的「noRun」參數這邊一併介紹,直接在程式碼講解。

//當玩家持續按著W按鍵時會觸發
if(Input.GetKey(KeyCode.W))
{
   //偵測腳色跑多久的數值 一直按著就會一直+
   runTime++;
   //將跑多久數值傳給Animator Condition
   CharacterAnimator.SetFloat("TiredFloat", runTime);
}
//當玩家放開W按鍵時會觸發
if(Input.GetKeyUp(KeyCode.W))
{
  //假如一直跑的數值大於300
  if(runTime > 300)
  {
     //就會先觸發腳色喘息的動畫,並把一直跑數值歸零下次才可以確實運用
     CharacterAnimator.SetTrigger("Tired");
     runTime = 0;
  }else
  {
    //假如一直跑的數值沒超過300則回放正常待機畫面,跑步時間一樣要歸零
    CharacterAnimator.SetTrigger("NoRun");
    runTime = 0;
  }
}

(1)就是單純雙循環的撥放動畫,所以我只需要設定開始波動化的Trigger就好,由於角色招牌動作動畫通常都會讓他演完,所以back的Transform鍵頭就不需要將上圖按鈕勾勾取消,也不用加任何Condition,如上圖。

if (Input.GetKeyDown(KeyCode.R))
{
   //發送Animator Trigger訊號
   CharacterAnimator.SetTrigger("Show");
}

(4)再來就是比較多步驟的攻擊動畫控制,由於我這邊有三種攻擊的動畫,所以要讓他依序撥放,我們一樣透過程式碼介紹。

//玩家按下E攻擊按鍵後
if (Input.GetKeyDown(KeyCode.E))
{
   //每按一次,攻擊數值就會+1
   attackCount++;
   //透過攻擊數值來排列攻擊順序,並且傳給Animator說我現在已經按到某數值請顯示相對應動畫
   CharacterAnimator.SetInteger("AttectInt", attackCount % 3);
   //發送Trigger
   CharacterAnimator.SetTrigger("Attect");
}
if (Input.GetKeyUp(KeyCode.E))
{
   //當玩家放開攻擊鍵就傳送該Trigger
   CharacterAnimator.SetTrigger("NoAttect");
}

大致上Condition已經設定好了,可以開始測試摒除錯,在Animator視窗中,當你在控制角色時,此視窗會同步顯示動畫的流向,如下影片。

小結

本篇介紹是比較基本的Animator Condition的應用,大家可以嘗試透過程式碼來一步一步控制豐富你的角色,這個技能可以用在很多地方,例如被車撞到物件的破碎、掉進坑洞角色表情變化等等,由淺入深的進階Condition的複雜度,完整做出來會很有成就感,大家步訪試試看,下面是角色控制透過Animator Condition控制的成果。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *