【Unityゲーム制作Tips】Animationで2Dキャラクターをまばたきさせる

Unityゲーム制作Tips、Animationで2Dキャラクターをまばたきさせる
ゆくすぃ

ごきげんよう、Budding Lab.編集部のゆくすぃです!
ここでは、Unityを使ったゲーム制作Tipsをお伝えしています!

サンプルゲーム:クラスメイト」のような恋愛シミュレーションゲームの醍醐味は、何と言っても、個性豊かな登場人物たちとの「会話」ですよね!そして、会話には相手の顔 = キャラクターの立ち絵が欠かせません。

せっかく、我が子とも言えるキャラクターを登場させるのですから、より魅力的に表現したい・・・でも、表情やポーズの差分をいくつも描くのは大変。そんな時は、キャラクターをまばたきさせるだけで、驚くほど魅力的になるんです!

そこで、今回は「Animationで2Dキャラクターをまばたきさせる」を解説します!

目次

キャラクターの絵を準備する

キャラクターをまばたきさせるには、最低でも下記2枚の絵が必要です。

目を開いている絵

目を開けている絵

目を閉じている絵

目を閉じている絵

更に、この中間にあたる「目が半開きの絵」があれば、より滑らかな「まばたき」を表現できます。
今回、ゆくすぃは「目を開いている絵」・「目を閉じている絵」・「目が半開きの絵」の3枚を準備しました。

目が半開きの絵

目が半開きの絵

キャラクターの絵を準備できたら、すべての画像をImagesフォルダ内(Assetsフォルダ内の画像保存フォルダ内)に保存し、基本の立ち絵となる「目を開いている絵」をGameObjectとして、Hierarchyウインドウの任意の場所に配置します。

キャラクター絵の準備は以上です。

アニメーションを作成する

Unityで「まばたき」などのアニメーションを作成するには「Animation Clip」と「Animation Controller」を作成し、それらをスクリプトで制御します。

classmate-blog_28
アニメーションの概要
  • Animation Clip:アニメーションの具体的な動きを保存したファイル。
    → 今回は「まばたき」の動きを作成・保存する。
  • Animation Controller:Animation Clip を管理して、どのタイミングでどの Animation Clip を再生するのかを制御する。
  • Animation用スクリプト:Animation Controller を制御する。パラメータを設定したり、トリガーを発動させたりする。

Animation Clip 、Animation Controller どちらの作成も直感的にできて、とても助かります!

ゆくすぃ

「かなえクンをおいかけろ!」作成当時、Unityでアニメーションを作れるとは知らなかったので、まばたきをすべてスクリプトで制御していました・・・学びって大事ですね!

Animation Clip の作成

まずは、準備した絵(目を開いている絵・目が半開きの絵・目を閉じている絵)を並べて、まばたきの動きを作成します。

classmate-blog_29
STEP
メニューから「Window」>「Animation」>「Animation」を選んでクリックし、Animationウインドウを開く。
Animation Clip作成01
STEP
Animationウインドウが開いたら、アニメーションさせたいGameObjectをクリックして選択する。

Hierarchyウインドウに配置した「キャラクターの基本の立ち絵」を選びます。
※下図では「SampleImage」を選んでいます。

Animation Clip作成02
STEP
Animationウインドウの「Create」ボタンをクリックし、新しいAnimation Clipに名前を付けて保存します。

Assetsフォルダ内に「Animations」などのわかりやすい名前でフォルダを新規作成し、その中に保存するとわかりやすいでしょう。
※下図では、新しいAnimation Clipを「SampleBlink」の名前で保存しています。拡張子は「.anim」。

Animation Clip作成03
Animation Clip作成04
STEP
目を開いている絵 ▶ 目が半開きの絵 ▶ 目を閉じている絵 ▶ 目を開いている絵 の順に画像をタイムラインに配置する。

Imagesフォルダ内に保存してある3つの画像を、Animationウインドウのタイムラインにドラッグ&ドロップして配置します。
Animationウインドウは、ProjectタブやConsoleタブと同じようにタブになっている場合がありますが、掴んで移動することができるので、Imagesフォルダから画像をドロップしやすい位置に動かしてください。

Animation Clip作成05

今回は、0.08秒間隔で画像をタイムラインに置きました。画像を置くと、タイムライン上に「キーフレーム」と呼ばれる点が打たれます。

  • 縦の三点リーダーをクリックすると、タイムラインの設定を「時間(秒)単位」か「フレーム単位」に変更できます。
  • タイムラインの右下のバーを左右に動かすことで、タイムライン全体の表示範囲を拡大・縮小できます。
Animation Clip作成06
STEP
アニメーションをプレビューし、動きに問題がなければ、Animation Clipを上書き保存する。

Animation Clipは自動保存されますが、念のため、ゲームを手動保存しておくと安心です。

Animation Clip作成07

以上で、Animation Clip の作成(=まばたきの動きの作成)は完了です!

Animation Controller の作成

Animation Clip を作成すると、自動的に Animation Controller も作成されます。

Animation Controller作成01
STEP
Projectウインドウの Animation Controller をダブルクリックして開く。

もしくは、Hierarchyウインドウで対象のGameObject(今回は「SampleImage」)を選択した状態で、メニューから「Animation」>「Animator」を選んでクリックします。

Animatorウインドウが開くと、既に「SampleBlink」という「State(ステート)」が作成されています。Stateとは、このAnimation Controllerと紐付いているGameObjectが、どんな状態でいるのか(どんな動きをしているのか)を管理する部品のようなものです。

Animation Controller作成02
STEP
「ステート:SampleBlink」をクリックして選択し、Inspectorウインドウの「Motion」を確認する。

Inspectorウインドウの「Motion」に、先ほど作成した「Animation Clip:SampleBlink.anim」がセットされていることを確認します。もし、セットされていない場合は、Projectウインドウからドラッグ&ドロップしてください。

Animation Controller作成03

Animatorウインドウに「ステート:SampleBlink」がない場合は、下記手順で作成してください。

  • Animatorウインドウ内で右クリックし、表示されたコンテキストメニューから「Create State」>「Empty」を選んでクリックする。「New State」が作成される。
  • 「New State」を選んでクリックし、Inspectorウインドウで名前を変更する。
    ※今回は「SampleBlink」に名前を変更。
  • 「Motion」にAnimation Clipをドラッグ&ドロップしてセットする。
    ※今回は「SampleBlink」をセット。
STEP
「ステート:Idle(待機)」を作成する。

Animatorウインドウ内で右クリックし、表示されたコンテキストメニューから「Create State」>「Empty」を選んでクリックすると「New State」が作成されます。
「New State」をクリックして選び、Inspectorウインドウで「Idle」に名前を変更します。

更に「ステート:Idle」を右クリックし、表示されたメニューから「Set as Layer Default State」を選んでクリックします。

Animation Controller作成04

すると「ステート:Idle」が黄色くなり、自動的に「ステート:Entry」と矢印で繋がります。こうすることで、アニメーションの開始地点を明確にでき、アニメーションの発動条件(トリガー)を設定したりできるようになります。

Animation Controller作成05
STEP
「ステート:Idle」と「ステート:SampleBlink」を繋ぐ。

「ステート:Idle」を右クリックし、表示されたメニューから「Make Transition」を選んでクリックします。すると、マウスポインタに追従する白い矢印が伸びてくるので、そのまま「ステート:SampleBlink」をクリックします。これで「ステート:Idle」から「ステート:SampleBlink」へ、アニメーションの遷移が設定されました。

Animation Controller作成06

同様に「ステート:SampleBlink」から「ステート:Idle」も、白い矢印を繋げます。
これで「ステート:Idle」→「ステート:SampleBlink」→「ステート:Idle」というアニメーションの流れができました。

Animation Controller作成07
STEP
Triggerパラメータを追加する。

Triggerパラメータは、特定のAnimation Stateを発動させるスイッチのようなものです。このTriggerパラメータをスクリプトで制御して、アニメーションを実行させます。

Parametersタブを選択し、右の「+」をクリックして表示されるメニューから「Trigger」を選んでクリックします。

Animation Controller作成08

「New Trigger」が作成されるので「SampleBlinkTrigger」に名前を変更します。
右側のラジオボタンにはチェックを入れません。

Animation Controller作成09
STEP
TransitionのConditionsプロパティにTriggerパラメータをセットする。

「ステート:Idle」から「ステート:SampleBlink」へ繋がる矢印(Transition)をクリックして選択します(矢印が青くなります)。inspectorウインドウのConditionsプロパティにある「+」をクリックします。

Animation Controller作成10

プルダウンメニューから「SampleBlinkTrigger」を選んでクリックします。これで「ステート:SampleBlink」のトリガー(発動条件)として「SampleBlinkTrigger」がセットされました。

Animation Controller作成11
STEP
アニメーションの遷移に関する設定を行う。

「ステート:SampleBlink」から「ステート:Idle」へ繋がる矢印(Transition)をクリックして選択します(矢印が青くなります)。アニメーションの遷移について、InspectorウインドウのSettingsセクションで設定していきます。

Animation Controller作成12
Settingsセクション
  • Exit Time:アニメーションを終了するタイミングを設定する。値の範囲は0~1。
    → 今回は「1」、最後まで再生する。
  • Fixed Duration:アニメーションの遷移にかかる時間を固定にするか、アニメーションの速度に依存するかを切り替える。
    → 今回は「ON」、アニメーションの遷移にかかる時間を固定にする。
  • Transition Duration:2つのアニメーションの遷移にかかる時間を設定する。
    → 今回は「0.25秒」
  • Transition Offset:遷移先のアニメーションをどのタイミングから再生するかを設定する。値の範囲は0~1。
    → 今回は「0」、最初から再生する。

以上で、Animation Controller の作成(=まばたきのループと発動条件:Triggerの設定)は完了です!

アニメーションを実行するスクリプトの作成

Hierarchyウインドウの「SampleImage(キャラクターの立ち絵)」を選んでクリックすると、Inspectorウインドウに「Animatorコンポーネント」が追加されているのがわかります。

アニメーションを実行するスクリプトの作成01

この状態で再生モードにしても、まだ、キャラクターはまばたきをしません。まばたきさせるには、スクリプトを作成して、Animation Controller で設定した「SampleBlinkTrigger」を発火させる(処理を開始させる)必要があります。

STEP
「スクリプト:SampleBlink」を作成する。

Assetsフォルダ内のスクリプトを保存しているフォルダ(例えば、Scriptsフォルダ)の中で右クリックし、表示されるコンテキストメニューから「Create」>「Scripting」>「MonoBehaviour Script」を選んでクリックします。

すると、C#スクリプトファイルが新規作成されるので、名前を付けて保存します。
※今回は「SampleBlink」としました。

STEP
スクリプトを書く。

「スクリプト:SampleBlink」を開いて、下記のようにコードを書きます。

1 using UnityEngine;
2
3 public class SampleBlink : MonoBehaviour
4 {
5     // キャラクターの立ち絵と接続
6     [SerializeField] GameObject SampleImage;
7
8     // SampleImageから取得したAnimatorコンポーネントを取り込む変数   
9     private Animator sampleAnimator; 
10
11    void Start()
12    {
13       // SampleImageにアタッチされているAnimatorコンポーネントを取得
14       sampleAnimator = SampleImage.GetComponent<Animator>();
15
16       // アニメーションのループを開始
17       BlinkRepeatedly(3f); // 3秒ごとに繰り返す
18    }
19
20    // アニメーションをintervalの間隔で実行する
21    void BlinkRepeatedly(float interval)
22    {
23       InvokeRepeating("PlayBlinkAnimation", 0f, interval); // 一定間隔で実行
24    }
25
26    // Triggerを発動して、アニメーションを実行
27    void PlayBlinkAnimation()
28    {
29       sampleAnimator.SetTrigger("SampleBlinkTrigger");
30    }
31 }

メソッド:PlayBlinkAnimation」で「トリガー:SampleBlinkTrigger」を発火させています。
SetTrigger関数」は、Animation Controller で設定したTriggerパラメータをONにします。これにより、Animatorで設定したアニメーションの遷移条件が満たされ、ステートが遷移します(=ままばたきが再生されます)。

ただ、これだけでは、アニメーションがループしないので、もうひと手間が必要です。

そこで「メソッド:BlinkRepeatedly」で「メソッド:PlayBlinkAnimation」をループさせています。
InvokeRepeating関数」は、特定のメソッドを一定間隔で繰り返し実行します。これにより「メソッド:PlayBlinkAnimation」をループさせることができます。

InvokeRepeating関数
  • “PlayBlinkAnimation”:呼び出したいメソッドの名前
  • 0f:最初にメソッドを呼び出すまでの遅延時間(秒)。「0f」は遅延なし。
  • interval:その後、メソッドが繰り返される間隔(秒)
    → 今回は「float型変数:interval」を引数に設定。

最終的に、Startメソッドに「BlinkRepeatedly(3f); 」と書くことで、SampleImageが有効になったら(表示されたら)キャラクターが3秒ごとにまばたきするという内容になっています。

STEP
SampleImageにスクリプトをアタッチする。

作成した「スクリプト:SampleBlink.cs」を「ゲームオブジェクト:SampleImage」にアタッチします。更に、Sample Blink(Script)コンポーネントのSample Imageプロパティに「SampleImage」をセットします。

アニメーションを実行するスクリプトの作成02
STEP
再生モードでアニメーションを確認する。

再生ボタンをクリックして、再生モードでアニメーションを確認します。

アニメーションを実行するスクリプトの作成03

以上で、スクリプトの作成&アタッチ(=まばたきの実装)は完了です!

ゆくすぃ

まばたきを実装するたけで、キャラクターに生命が宿ったような感動を覚えます!頑張った甲斐がありますよね!

まとめ

Animation Clip と Animation Controller を上手く使えば、会話の内容に合わせて、キャラクターの表情や動きを自在に変えることができますね!キャラクターが生き生きしていると、シナリオへの没入感も高まります。ぜひ、習得しておきたい仕組みです!

以上、最後まで読んでいただき有難うございました!

よかったらシェアしてね!
  • URLをコピーしました!
目次