
ごきげんよう、Budding Lab.編集部のゆくすぃです!
ここでは、Unityを使ったゲーム制作Tipsをお伝えしています!
「サンプルゲーム:クラスメイト」のような恋愛シミュレーションゲームの醍醐味は、何と言っても、個性豊かな登場人物たちとの「会話」ですよね!そして、会話には相手の顔 = キャラクターの立ち絵が欠かせません。
せっかく、我が子とも言えるキャラクターを登場させるのですから、より魅力的に表現したい・・・でも、表情やポーズの差分をいくつも描くのは大変。そんな時は、キャラクターをまばたきさせるだけで、驚くほど魅力的になるんです!
そこで、今回は「Animationで2Dキャラクターをまばたきさせる」を解説します!
キャラクターの絵を準備する
キャラクターをまばたきさせるには、最低でも下記2枚の絵が必要です。
目を開いている絵


目を閉じている絵


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


キャラクターの絵を準備できたら、すべての画像をImagesフォルダ内(Assetsフォルダ内の画像保存フォルダ内)に保存し、基本の立ち絵となる「目を開いている絵」をGameObjectとして、Hierarchyウインドウの任意の場所に配置します。
キャラクター絵の準備は以上です。
アニメーションを作成する
Unityで「まばたき」などのアニメーションを作成するには「Animation Clip」と「Animation Controller」を作成し、それらをスクリプトで制御します。


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



「かなえクンをおいかけろ!」作成当時、Unityでアニメーションを作れるとは知らなかったので、まばたきをすべてスクリプトで制御していました・・・学びって大事ですね!
Animation Clip の作成
まずは、準備した絵(目を開いている絵・目が半開きの絵・目を閉じている絵)を並べて、まばたきの動きを作成します。




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


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




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


今回は、0.08秒間隔で画像をタイムラインに置きました。画像を置くと、タイムライン上に「キーフレーム」と呼ばれる点が打たれます。
- 縦の三点リーダーをクリックすると、タイムラインの設定を「時間(秒)単位」か「フレーム単位」に変更できます。
- タイムラインの右下のバーを左右に動かすことで、タイムライン全体の表示範囲を拡大・縮小できます。


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


以上で、Animation Clip の作成(=まばたきの動きの作成)は完了です!
Animation Controller の作成
Animation Clip を作成すると、自動的に Animation Controller も作成されます。


もしくは、Hierarchyウインドウで対象のGameObject(今回は「SampleImage」)を選択した状態で、メニューから「Animation」>「Animator」を選んでクリックします。
Animatorウインドウが開くと、既に「SampleBlink」という「State(ステート)」が作成されています。Stateとは、このAnimation Controllerと紐付いているGameObjectが、どんな状態でいるのか(どんな動きをしているのか)を管理する部品のようなものです。


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


Animatorウインドウに「ステート:SampleBlink」がない場合は、下記手順で作成してください。
- Animatorウインドウ内で右クリックし、表示されたコンテキストメニューから「Create State」>「Empty」を選んでクリックする。「New State」が作成される。
- 「New State」を選んでクリックし、Inspectorウインドウで名前を変更する。
※今回は「SampleBlink」に名前を変更。 - 「Motion」にAnimation Clipをドラッグ&ドロップしてセットする。
※今回は「SampleBlink」をセット。
Animatorウインドウ内で右クリックし、表示されたコンテキストメニューから「Create State」>「Empty」を選んでクリックすると「New State」が作成されます。
「New State」をクリックして選び、Inspectorウインドウで「Idle」に名前を変更します。
更に「ステート:Idle」を右クリックし、表示されたメニューから「Set as Layer Default State」を選んでクリックします。


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


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


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


Triggerパラメータは、特定のAnimation Stateを発動させるスイッチのようなものです。このTriggerパラメータをスクリプトで制御して、アニメーションを実行させます。
Parametersタブを選択し、右の「+」をクリックして表示されるメニューから「Trigger」を選んでクリックします。


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


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


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


「ステート:SampleBlink」から「ステート:Idle」へ繋がる矢印(Transition)をクリックして選択します(矢印が青くなります)。アニメーションの遷移について、Inspectorウインドウの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コンポーネント」が追加されているのがわかります。


この状態で再生モードにしても、まだ、キャラクターはまばたきをしません。まばたきさせるには、スクリプトを作成して、Animation Controller で設定した「SampleBlinkTrigger」を発火させる(処理を開始させる)必要があります。
Assetsフォルダ内のスクリプトを保存しているフォルダ(例えば、Scriptsフォルダ)の中で右クリックし、表示されるコンテキストメニューから「Create」>「Scripting」>「MonoBehaviour Script」を選んでクリックします。
すると、C#スクリプトファイルが新規作成されるので、名前を付けて保存します。
※今回は「SampleBlink」としました。
「スクリプト: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」をループさせることができます。
- “PlayBlinkAnimation”:呼び出したいメソッドの名前
- 0f:最初にメソッドを呼び出すまでの遅延時間(秒)。「0f」は遅延なし。
- interval:その後、メソッドが繰り返される間隔(秒)
→ 今回は「float型変数:interval」を引数に設定。
最終的に、Startメソッドに「BlinkRepeatedly(3f); 」と書くことで、SampleImageが有効になったら(表示されたら)キャラクターが3秒ごとにまばたきするという内容になっています。
作成した「スクリプト:SampleBlink.cs」を「ゲームオブジェクト:SampleImage」にアタッチします。更に、Sample Blink(Script)コンポーネントのSample Imageプロパティに「SampleImage」をセットします。


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


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



まばたきを実装するたけで、キャラクターに生命が宿ったような感動を覚えます!頑張った甲斐がありますよね!
まとめ
Animation Clip と Animation Controller を上手く使えば、会話の内容に合わせて、キャラクターの表情や動きを自在に変えることができますね!キャラクターが生き生きしていると、シナリオへの没入感も高まります。ぜひ、習得しておきたい仕組みです!
以上、最後まで読んでいただき有難うございました!