【Lottielab】クリスマスプレゼントを届けよう！🎁

この記事では物語風にLottielabを使ったアニメーションのつくり方を紹介します。

主人公のたまくんは目が覚めると突然サンタさんになっています。そこで課された仕事は明日の朝までに全国の子どもたちにプレゼントを届けること。たまくんは無事その役目を果たせたのでしょうか？

# 1. 目が覚めたらサンタさんになっていた件🎅
今日は12月24日、クリスマスイブ。
たまくんはクリスマスマーケットに行き、美味しい食事とホットワインを楽しみました。

でも、つい楽しみすぎちゃって帰りの電車の中で寝てしまいました💤

時刻は23:50。
最寄駅につき、目が覚めるとたまくんは立派な白髭を貯え、赤い帽子と赤い服を着ていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941610/d4ab661a-e4c5-caa1-13c5-9c7f5aa7fe1c.png)

そう、サンタさんになっていたのです。
そしてたまくんは急遽仕事を課されることに。

それは子どもたちが起きてくる前にクリスマスプレゼントを届けること。あと10分で25日。
さぁ、急いでプレゼントを届けに行きましょう！！

# 2. どうやってプレゼントを届ける？🛷
「急にプレゼントを届けろって...しかも時間もない。
普通に歩いたら配り終わらない。
空飛ぶトナカイとソリがあればなぁ...」

「そっか！つくればいいんだ💡」

# 3. Lottielabで必要なものをつくる / 動きをつけよう！
Lottielabってなに？
Lottielab社が開発したweb上でlottieファイルを作成するためのツールです。

https://www.lottielab.com/

無料版・有料版があり、無料版でもファイル数に制限なく作成することができますが、透かしが入ってしまうんですよね...現在は勉強段階なので無料版を使っていますが、実際にプログラムを作る場合には課金したほうが良さそうです。（ちょっと高い...💸）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941610/adbd0376-da52-db60-484e-dc40a76c7be1.png)

 ### Lottieってそもそもなに？
LottieとはAirbnbのエンジニアが開発したJSONベースのベクターアニメーション用ファイル形式です。

Lottieには、
・ファイルサイズが軽量
・拡大、縮小しても画質が劣化しない
・開発工数を削減できる
というメリットがあります。

それでは実際にLottielabの使い方を見ていきましょう🎵
以下がLottielabの画面になります。
一般的なWebデザインツールと動画編集ツールを合わせたような画面になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941610/e4ee4ac7-76bd-0ca1-53a1-0f413845fa52.png)

実際に行う工程は、
①デザインを作成する
② アニメーションを追加する
③ エクスポートするだけです😳
それでは各工程の例を見ていきましょう！

ここでは、ソリに乗ったサンタさんが空からプレゼントを届けるアニメーションを作ってみたいと思います。

## 3.1 デザインを作成する
Lottielabファイル左上にあるツールを用いてデザインを作成したり、既存のイラストをインポートして利用したりすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941610/6348bf1d-9883-4462-bc21-d8a0e70342ea.png)

また、LottielabにはFigma用のPluginも存在しており、デザインをFigmaで作成してLottielabにインポートすることもできます！詳しくは[こちら](https://www.figma.com/community/plugin/1307008445393559148)


デザインを作成したら、アニメーションの初期位置となる場所にオブジェクトを配置します。
今回は画面の外にサンタさんとプレゼントを置きました。
なお、プレゼントボックスはサンタさんの後ろに隠れるように・プレゼントボックスがツリーの前に表示されるようにレイヤーを調整しています。レイヤー順序については以下の図の左側を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941610/737b427f-f5c3-67e6-4712-a871c84b149c.png)


## 3.2 アニメーションを追加する
1. 動かしたいオブジェクトを選択し、画面中央上部にある「Animate」をOnにします。
2. 画面下部にタイムラインバーが現れるので、任意の時間まで緑色のバーを動かします。
3. 任意の時間後にいて欲しい場所までオブジェクトを動かします。これにより移動前と移動後が点線で繋がれ、その線に沿ってオブジェクトが移動するようになります。点線の傾きは、画面右側のプロパティパネルから自由に変更することが可能です！

今回は、全体のアニメーション時間を5.00sにし、2.00s後に画面中央部で極大となる放物線を描くようにしたいと思います。また、2.80s後にサンタさんがプレゼントを落下させ、クリスマスツリーの脇にプレゼントが置かれるようにします。

実際に作成したのが以下の動画です。雪も降らせたかったですが、アニメーションをつけるのが面倒だったので省きました😂

![完成品.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941610/3b2f47b3-42c6-612d-75c6-9ce1b85bee04.gif)


Figmaを使っている人であれば、「ここまでの工程であればプロトタイプ機能で良くない？」ってなりますよね。本当に優れている点は、次の工程にあるのです！

## 3.3 エクスポートする
Lottielabを利用すると、JSON形式でファイルをエクスポートできます。そのため、エクスポートしたデータのパスをコードに組み込むことで簡単にアニメーションを表示することができます！
画面右上の「Export」ボタンを押してダウンロードします。今回は「12_24.json」という名前で保存しました。
それでは次の項で実際に実装してみましょう！！

## 4. 結果は？
今回はStreamlitと呼ばれるPythonでWebアプリケーションを作成できるフレームワークを用いてアニメーションを表示してみます。

:::note
Streamlitにはstreamlit-lottieと呼ばれるパッケージがあるため容易にコードを書くことができます。
詳細は[こちら](https://pypi.org/project/streamlit-lottie/)
Flutterにもlottie用のパッケージがあるため、簡単にモバイルアプリに組み込めそうです。
詳細は[こちら](https://pub.dev/packages/lottie)
:::

はじめに必要なライブラリをインストールします。

```bash
pip install streamlit（==1.41.1）
pip install streamlit-lottie (==0.0.5)
```

次に、アニメーションを表示するためのコードを書きます。
```python
from streamlit_lottie import st_lottie
import json

# JSONファイルを読み込む関数
def load_lottie(file_path):
        with open(file_path, "r") as f:
                return json.load(f)

# ローカルにあるJSONファイルのパスを指定
file_path = "12_24.json"

# ローカルにあるJSONファイルを読み込む
animation = load_lottie(file_path)

st_lottie(animation, width = 600, height = 400)
```

最後に、Lottielabで作成したJSONファイルのパスを指定し、AdventCalendar2024.pyを実行します。 
コードの実行には以下のコマンドを用います。

```bash
streamlit run AdventCalendar2024.py
```
![実行物.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941610/6d4c8290-ff48-071d-2c7b-5b4a7ed073d2.gif)

アニメーションをブラウザに表示することができました！

こうしてサンタさんになったたまくんは空飛ぶトナカイの引くソリに乗ることができ、無事プレゼントを届けることができました🙌

# 5. エピローグ
そういえば中身を見ずにプレゼントを配ってしまったけど、あの箱の中には何が入っていたんだろうか...？
後編へつづく...

# 6. あとがき
本記事は
「アニメーションのあるデザインをしたい。だけどエンジニアの方にアニメーションのイメージを伝えるのは難しいし、伝えられたとしても実装難しそう...なにかいい方法ないかな」
と思ったことをきっかけにLottielabの存在を知り、せっかくなら触ってみて記事にしようと思い、執筆しました。

わたしもLottielabを触り始めたばかりですが、非常に有用と感じたのでこれからも勉強していきたいと思いました！この記事がみなさんにとって少しでも有益なものとなればとてもうれしいです。
最後までお付き合いいただきありがとうございました。

Happy Holidays！🎄

# 7. 利用させていただいたイラスト
https://soco-st.com/

# 8. 参考
https://pypi.org/project/streamlit/
https://pypi.org/project/streamlit-lottie/