Unity初心者のためのアニメーションの基礎の基礎

Unity を学んでいる初心者がぶち当たる壁のひとつに「アニメーションって何？」があります。

アニメーションの基礎をきっちりと説明することで、自分の入るべき初心者向けの入り口を知り、スムーズに学んでいけるのではないか？そう考えてこの説明文を作成してみました。

Unityの初心者、アニメーションをこれから学ぼうとしている方にお勧めします。

# 初心者の間違いやすいポイント

「Unity のアニメーション」と言われたら、まずは以下のようなものを想像しませんか？

![アニメの例](https://camo.qiitausercontent.com/5459d3e91464f4ca59d401955c1e14a6eb4883b2/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3139333531392f62346161663163342d396434622d616333662d623930322d6566623430636234643937332e676966)

確かにこれは「Unityのアニメーション」としては正しいです。

でもこれを題材に、初心者がアニメーションを理解するには無理があります。使うだけならいいのですが「理解」するには適さない、初心者には高度すぎるサンプルなんです。

料理の初心者は最初に「ゆで玉子」など簡単なものを作りますよね。いきなり「活オマールエビのテルミドール」などを作り出す初心者は稀なわけです。何事にも段階があり、難易度の差があり、初心者は基本的なものから学ぶ、のが理にかなったやりかたです。

ですので初心者にお勧めのアニメーションは、例えば以下のような地味なものです。この記事ではこのレベルの題材を対象にアニメーションの解説をしていきます。

![out3.gif](https://qiita-image-store.s3.amazonaws.com/0/193519/b05cad23-0753-b506-a714-22df0d48a487.gif)

# 練習用シーンの準備

[練習用シーン(1) 3色キューブ](https://qiita.com/yamachan360/items/43b6d63f74b782ff1ba3#%E7%B7%B4%E7%BF%92%E7%94%A8%E3%82%B7%E3%83%BC%E3%83%B31-3%E8%89%B2%E3%82%AD%E3%83%A5%E3%83%BC%E3%83%96) の記事を参考に、三色のキューブが並んだシーンを用意してください。

![練習用シーン(1) 3色キューブ](https://camo.qiitausercontent.com/ad3ebe4a64b230fa68330860fbbc8d3e81b7f9b4/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3139333531392f35656461613637622d336665622d616563622d663536392d6635393830396535393638642e706e67)

# 最初のアニメーションを作成する

プロジェクトで Assets を選択し、作成メニューから「アニメーション」を新規作成し、"Green Animation" という名前に変更します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/9fc5448a-c941-693c-03d5-13f082e75fb8.png)

まだアニメーションの設定画面がないと思うので、上の「シーン」タブ上で右クリックし「アニメーション」タブを追加してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/16ace7f2-0fa8-bd81-ba0e-7b15109e98d6.png)

プロジェクトで作成したばかりの "Green Animation" アニメーションを選択すると、以下のような表示になるはず。赤枠の部分がこれからよく使用するアニメーションの設定画面です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/757c3cca-29a1-0414-3472-2eb70c4cf679.png)

さて、ここが大事なところ！ヒエラルキーで "Green Cube" オブジェクトを選択し、右側のインスペクターにオブジェクトの設定内容を表示します。そして先ほど作成した  "Green Animation" アニメーションをドラッグ＆ドロップで追加してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/51e90cfe-caf2-859a-3177-66f2c3ccd5e1.png)

すると以下の赤枠のようにインスペクターに追加されるはず。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/2bd5d0f1-55fb-154b-f644-f3029ff3172b.png)

"Green Animation" アニメーションが、"Green Cube" オブジェクトに設定された、状態になりました。[練習用のシーンを作成](https://qiita.com/yamachan360/items/43b6d63f74b782ff1ba3#%E7%B7%B4%E7%BF%92%E7%94%A8%E3%82%B7%E3%83%BC%E3%83%B31-3%E8%89%B2%E3%82%AD%E3%83%A5%E3%83%BC%E3%83%96) した際に、色を設定したマテリアルをオブジェクトに設定した時と同じですね。

アニメーションは作成しただけではダメで、対象のオブジェクトがないと設定できません。対象の形状によって可能なアニメーションも異なりそうですよね。

で、いままさに設定がされたので！アニメーションの設定画面にも変化が起こります。再生ボタンなどが有効化され、そしてなにより重要な「プロパティーを追加」というボタンが有効化されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/16f873c5-547a-3562-b317-fb7f7e12d7cb.png)

# 最初のアニメーションを設定する

今の状況を整理しましょう。まず "Green Animation" アニメーションを作成し、"Green Cube" オブジェクトに設定しました。ただしまだ "Green Animation" アニメーションの中身は空です。

よし、今度は空のアニメーションに内容を定義していきましょう。

アニメーション設定の画面で「プロパティーを追加」ボタンを押して、「拡大/縮小」を追加してみます。右にある＋のアイコンで追加です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/8d865db1-5dc8-8fbf-4a06-b048f1981d5b.png)

追加すると以下のような表示になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/eb7a9dbe-3ac0-34df-ebda-ecf5ced3a241.png)

この表示を見て、ピン！ときた方はこの先は楽に理解できるでしょう。音楽ソフトや、映像編集ソフトなどを使ったことがあれば、これと似た「タイムライン」表示を操作した経験があるはずです。そんな方はマニュアル [Animation Window Guide](https://docs.unity3d.com/ja/current/Manual/AnimationEditorGuide.html) などを見て、ガンガン進めていってokです。

試しに再生ボタンを押してみると、中央のタイムラインのところで白線が右に動き、それにあわせて右のインスペクターの拡大/縮小の欄が青く光るのがわかります。アニメーションで時間が経過すると、この部分が変化するよ、と教えてくれています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/341b5971-cee5-346d-ebd9-5f9faddf7f58.png)

さて、いよいよアニメーション動作の追加です。まずはタイムラインの 0:30 の部分をクリックして白い線を移動しましょう。この位置は開始から0分30秒を示しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/c53d0008-871e-3860-817a-10a60f9acdf0.png)

そしてその下、Scale.x の行で白線と交わるあたりで右クリックし「Add Key」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/a6ee280d-75ff-3b34-36f3-d7950f2bbf40.png)

するとその位置にキーフレームが追加され、四角いアイコンが表示されるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/65d31ca3-dc30-1f64-6a89-2dfcc88fee5a.png)

今度はこのキーフレームにおける値の変化を設定するため、下のタブで「カーブ」モードに変更します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/c223e0b2-c1ba-268f-c2f6-616de6562bd1.png)

そして　Scale.x と 0:30 の位置にある小さな丸いアイコンを、上にぐっとドラッグして持ち上げます。今回は +6 のあたりまで持ち上げています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/f4140804-052c-105b-9128-5d6b929c6028.png)

これで設定は終わりです。どんな設定を実施したかというと…

* "Green Cube" というオブジェクトを対象にした
* "Green Animation" というアニメーションに
* 「拡大/縮小」プロパティを追加して
* 全部で 1:00 の長さのなかで 0:30 の位置にキーフレームを追加した
* そして「カーブ」の画面で 0:30 の位置にある Scale.x の値を 6 にまで持ち上げた

となります。アニメーション設定の中で再生すると、白線の移動と共にインスペクターの Scale.x の値が増減するのを確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/ecd967c4-5d6b-b8fa-bcf8-4cb2ffc782d1.png)

さて、このシーンを再生するとどうなるでしょうか？

![out4.gif](https://qiita-image-store.s3.amazonaws.com/0/193519/b4d9c9d9-9ddf-d751-d1ae-e5b840f04689.gif)

わかりますかね？ x軸方向に0.5秒ほどぐぃーんと伸びて、次の0.5秒で元に戻ります。これが今回設定したアニメーションの動作なのです。

ちなみに、Unity で実行すると、伸びるアニメーションは1回で終了します。上の画像はアニメーションGIF化しているので、それが繰り返し表示されています。

# アニメーターについて

最初のアニメーション作成は如何だったでしょうか？地味なサンプルではありますが、アニメーションの仕組みを理解するのには適した対象だとおもいます。Unityにおけるアニメーションとは結局

> 時間とともにパラメーターを変化させる仕組み

なんですよね。

ところで、さきほどのアニメーション作成中に、Assets の中に見知らぬオブジェクトが自動生成されていたのに気がついていましたか？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b7b1e3fd-1871-7a5f-ae16-81fb334a59c0.png)

"Green Cube" オブジェクトを選択した時、インスペクターのここに表示されているものです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b97fe78d-fb9f-7cdd-f453-ca2bf2ea235d.png)

この自動生成されたオブジェクトが「アニメーター」もしくは「アニメーションコントローラー」と呼ばれるものです。選択してインスペクターを見てもよくわからないのですが…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/23e2bb76-f135-c4df-02df-d5ea8fb85249.png)

「開く」ボタンを押すと、「アニメーター」の設定画面が開きます。さきほど操作していた「アニメーション」とは違うので注意してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/a0c1d0a2-b11f-4480-4470-120070aae8bd.png)

これが自動生成された理由なのですが、以下になります。

* 実はオブジェクトにアニメーションは直接設定できない
* オブジェクトに設定するのはアニメーターで、アニメーターの中にアニメーションを設定する
* オブジェクトにアニメーションをドラッグするとUnityが必要なアニメーターを自動生成する<br/>(自動生成されるアニメーターの名称は対象オブジェクトと同じになるようだ)

このようにして "Green Cube" というアニメーターが自動生成されていた、というわけです。

# アニメーターの仕組み

さて、アニメーター(アニメーションコントローラー)ですが、名前のとおりアニメーションをコントロールするもの、です。複数のアニメーションをまとめて、実行順序などをコントロールしてくれます。

さきほどの "Green Cube" アニメーターをよく見てみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/a0c1d0a2-b11f-4480-4470-120070aae8bd.png)

緑色の「Entry」というボックスから、オレンジ色の「Green Animation」に矢印が設定されているのがわかります。この矢印を「遷移」と呼ぶのですが、まあ、アニメーションの実行順序を指定するものです。

最初から用意されている3つのボックスにはそれぞれ意味があって、まずは緑の「Entry」はこのコントローラーの実行の開始点です。それに対して赤の「Exit」が終了点ですね。「Entry」から始まった矢印、つまり遷移が、最後の「Exit」までいけばこのコントローラーの管理しているアニメーションは終わり、ってことですね。

もうひとつ水色の「Any State」は特に遷移先のない場合に実行される、いわゆるデフォルト処理的なボックスのようです。

さて今回の "Green Cube" アニメーターですが、「Entry」から「Green Animation」に遷移しますので、さきほど作成した "Green Animation" アニメーションが1回実行されます。で、その後に遷移先が指定されていないので、たぶん「Any State」のボックスに遷移しますが、その先の遷移もないので、ここで処理が停止するのかな？

ならば、ということで「Green Animation」から「Green Animation」へループする遷移を追加してみましょう。「Green Animation」ボックスの上で右クリックして「遷移を作成」を選択します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/f1d15945-72e5-ada3-db78-26e640cad3e8.png)

遷移先の指定になりますので、やはり「Green Animation」ボックスをクリックして遷移を作成します。すると「Green Animation」ボックスの下に小さな白い矢印で遷移追加され

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/fafcc143-8cc4-4da6-61b3-7efc0d7e3966.png)

その遷移のインスペクターは以下のようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/bbfa94b4-0fb7-a208-dea0-7a641b4ac1af.png)

アニメーションを遷移させると、前のアニメーションの終了を待つのではなくて、クロスフェードのように少し重なった状態があるのがわかりますね。

さて、この状態でシーンを再生してみましょう。

![out5.gif](https://qiita-image-store.s3.amazonaws.com/0/193519/49f4575a-833c-4821-44b9-be46bcc43f2c.gif)

ね、連続でアニメーションするようになりましたが、重なっているせいか完全に戻る前に次のアニメーションが始まってしまいますね。

# アニメーターの遷移を変更してみる

さきほどのアニメーターの遷移を調節して、アニメーションの間隔をちょっとあけてみます。以下の赤枠の値を修正してみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/3357108b-623e-22cf-71f4-fc94b9cb5bc7.png)

さて、この状態でシーンを再生してみましょう。

![out6.gif](https://qiita-image-store.s3.amazonaws.com/0/193519/b0d70568-bc39-895b-0cec-2164ff7fa138.gif)

よっしゃ、うまくいきました！

## 2018年5月23日追記

この記事では遷移の先を同じアニメーションにすることでアニメーションをループさせていますが、アニメーションのインスペクターにはループの設定がありますので、一般的には、こちらを使うのが良さそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/c3b047c1-66a8-6a0e-2c5d-dea9a4f6cdba.png)

# もうひとつアニメーションを追加してみる

さて最後は、これまでの拡張です。

まず、アニメーションをもうひとつ追加してみましょう。 "Green Animation" アニメーションと同じ作り方で、x軸のかわりにy軸を伸ばしてみます。名前は "Green Animation Y" としましょうか。

もしくはプロジェクト画面で "Green Animation" アニメーションを選択し、Ctrl+D キーでオブジェクトの複製を実施して、名前とパラメーター設定を変更するのも手っ取り早いです。

そしてアニメーター上に追加して、それぞれのアニメーション間にさきほどと同様の遷移を設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b9910bc4-43f2-a54a-832b-94b0509ed826.png)

さて、この状態でシーンを再生すると、どうなるでしょうか？

![out7.gif](https://qiita-image-store.s3.amazonaws.com/0/193519/9f4bebca-3e2a-1aa6-1316-a8fb3516f1bf.gif)

遷移で設定したとおり、二つのアニメーションが順に実行されましたね。

# というわけで

Unity のアニメーションの根っこの部分を説明したい、とできる限りシンプルなサンプルを用意して記事を書いてみましたが如何でしょうか？

どんな複雑なアニメーションも、結局は何かのパラメーターを時間で操作しているのです。対象の数が多いだけ… まずはそれを理解して、そして、これだけ簡単なサンプルなら自分でもいろいろ試せそうだぞ？などと感じていただければ嬉しいです。

この先、親子関係を使ったアニメーションなど幾つかネタはありますが、かなーり長くなってきたので、今回はこれまでとします。もしよろしければ [続編](https://qiita.com/yamachan360/items/1f3d1638440f5bdc8072) も読んでみてください。

ではでは。