【React】Riveを使えば誰でも楽しいインタラクションを実装できる！！！

楽しいインタラクションを手軽に実装できないかと色々漁っていたら、Riveが良さそうだったので自分用にメモとしてまとめてみます。

## 使ったもの
- React
- Rive

https://rive.app/

※[React](https://ja.react.dev/)のプロジェクトを用意したところから始めます。

## Riveのインストール
こちらのReactでの使い方を参考にインストールします。

https://help.rive.app/runtimes/overview/react

`npm i --save @rive-app/react-canvas`

これをすればとりあえず使えるようになります。

## Riveを.rivファイルでエクスポート
今回Reactで使うには、Riveのファイルを.ribの拡張子形式でエクスポートしたものをReactのプロジェクトに入れて、画像データとかと同じように引っ張ってきます。

Riveのアカウントを作成すると、こんな感じのホーム画面になるので、右上のNew fileボタンを押すとファイルを作成できます。
![Screenshot 2024-03-30 at 23.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628307/ea3132a5-9f65-78ad-140e-bd826658ea7d.png)
今回はサンプルファイルのStar ratingを使ってやっていきます。
![Screenshot 2024-03-30 at 23.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628307/d31a392d-3a01-c53c-c965-22d0315d576a.png)

※アニメーションの作り方とかは今回説明を省くので、気になる人は実際に触ってみましょう。Affter effectとBlenderのアニメーションを触ったことある人なら割とサクッと使えると思います。

ファイルを作るとEditページに遷移します。右上にプルダウンのボタンがあるので、Exportを押すと、rating_animation.rivがダウンロードされます。
![Screenshot 2024-03-30 at 23.10.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628307/bafab52d-f038-352b-7b77-d424d556a383.png)

このrating_animation.rivをReactのプロジェクトに投げ入れます。一応srcフォルダに入れています。

## Riveファイルで見るべきものはとにかくState machineとinput
Riveファイルの下部に、アニメーションの設定できるエリアがあります。ここでアニメーションのステータスを管理しています。今回で言うと、Animations>State Machine 1と、Inputs>ratingの数字がコードを書いていく上で使うので、しっかりと見ておきます。
![Screenshot 2024-03-30 at 23.37.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628307/b71ade30-52ba-dc76-9cc4-eed7ab5fd335.png)

## rating_animationのコンポーネントを作ろう
このアニメーションのファイルを作ります。インタラクティブにするために、useRiveとuseStateMachineInputのHookを使います。
ここで、STATE_MACHINE_NAMEと、INPUT_NAMEに使うのが、さっきRiveでこれだけは見とけっていったState machineとinputです。RiveファイルでそれぞれState Machine 1とratingを使っているので、これを入れます。

```javascript:RatingAnimation.js
import { useRive, useStateMachineInput } from '@rive-app/react-canvas';

export default function RatingAnimation() {
    const STATE_MACHINE_NAME = 'State Machine 1';
    const INPUT_NAME = 'rating';
    const { rive, RiveComponent: RiveComponentTouch} = useRive({
    src: 'rating_animation.riv',
    autoplay: true,
    stateMachines: STATE_MACHINE_NAME,
    artboard: 'New Artboard',
    });
    const animation = useStateMachineInput(rive, STATE_MACHINE_NAME, INPUT_NAME);

    return (
    <div>
        <RiveComponentTouch />
    </div>
    );
}
```
これでindex.jsに<RatingAnimation />を入れるとあら不思議。Riveファイルで見たインタラクティブアニメーションが実装されています！！！


return以下をこれにして、アニメーションを外のボタンから変えられるようにしてみると、より仕組みが理解できます。
```javascript:RatingAnimation.js
    return (
    <div>
        <RiveComponentTouch />
        {/* ボタンでも状態を変えられるようにした */}
        <div>
            <button onClick={() => animation && (animation.value = 0)}>0</button>
            <button onClick={() => animation && (animation.value = 1)}>1</button>
            <button onClick={() => animation && (animation.value = 2)}>2</button>
            <button onClick={() => animation && (animation.value = 3)}>3</button>
            <button onClick={() => animation && (animation.value = 4)}>4</button>
            <button onClick={() => animation && (animation.value = 5)}>5</button>
        </div>
    </div>
    );
```

Rive上でもこのようにアニメーションの状態を数字で決めていて、これをvalueで指定するといけるってことのようです。（この状態は星が2個白くなるアニメーションのことを示している）
![Screenshot 2024-03-31 at 0.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628307/1ed3cfc7-c56d-5b01-7c14-99f6fe8b0dda.png)

実際にアニメーションを動かしている様子を上げてるので参考にどうぞ

https://twitter.com/kanonnot_/status/1774070829418201441?s=12&t=liZq60adcgoqviuJ_fWbow

## まとめ
- Riveを使えば気軽にゴリゴリアニメーション付きのインタラクティブ的なあれこれを実装できそう
- 割と知識浅めでも使えたからReact初心者にもおすすめ