Inkの紹介

# はじめに
2DのRPGを制作しようと勉強する中で、会話システム作成の解説動画を見たところ`Ink`と呼ばれる便利なスクリプト言語を使って作成していました。実際に使って見るとシンプルなテキストベースで使いやすいと思い、私自身の備忘録も兼ねて紹介いたします。
## Inkとは
Inkは`Inky`というIDEを使用してテキストベースで記述していくスクリプト言語です。会話の分岐など基本的な会話システムを実装したい時に便利な機能が備わっています。Inkで記述したものをUnityで使用する際には連携用プラグインの導入とC#での記述が必須となります。
`Inky`の画面はこんな感じです。
![スクリーンショット 2022-06-27 194352.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/fa7f8fb1-1804-78dc-0e79-a9d24563b18a.png)
特に設定も必要なく、会話にあたる文やコメントなどの部分は日本語で記述することができます。`#`で続く部分は`Tags`と呼ばれる機能で`C#`で個別に取得することができます。この辺については後ほど解説いたします。右側のスペースでは左側で実装した会話の流れを追うことができます。マウスで選択肢をクリックしたり、右上のアイコンで巻き戻したりすることができます。
## InkyとInk Unity Integrationのダウンロード
まずは下記のサイトから`Inky`と`Ink Unity Integration`ダウンロードリンクをそれぞれクリックします。
https://www.inklestudios.com/ink/
`Inky`はGithubのページにアクセスするので、OS環境に応じてダウンロードしてください。私はWindowsなので`Inky_windows_64.zip`をダウンロードしました。
`Ink Unity Integration`はGithubかアセットストアからダウンロードする事ができます。私はGithubからダウンロードしましたがどちらかはお好みで。
ダウンロードしたら`Inky`を解凍し、Unityを開いて`Ink Unity Integration`をインポートしてください。
![ImportInkPackage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/6cd4890d-5fca-7ae9-f065-1d7ef7f767de.png)
インポートが終わりましたらInkの導入は完了です。
# Inkの書き方
まずはInkでの書き方を解説していこうかと思います。
最初にProjectウィンドウで右クリックから`Create->Ink`をクリックしてInkファイルを生成します。
ファイル名を入力すると下の画像のように同じ名前の`JSONファイル`が生成されると思います。
![スクリーンショット 2022-06-30 092655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/31acc63f-b218-bf99-aca4-7e3d247ebcc0.png)
このJSONファイルは簡単に言うとInkファイルの中身をUnityで扱えるようにJSON形式に変換したファイルとなります。Unity上ではこちらのファイルを使います。また、このファイルはInkファイルを更新すると自動的に反映されます。もし、反映されてなかった場合はProjectウィンドウで右クリックから`Recompile Ink`をクリックすれば問題ないかと思います。
Inkは基本的にダイアログで表示したい順に上から下に書いていく形になると思います。そのほかに様々な構文があります。今回は基礎的なものを順番に説明していきたいと思います。
## Comments
まずはコメントです。`//`と`/＊～＊/`のおなじみ一行と複数行コメントアウトが使えます。そしてもう一つ`TODOコメント`が使えます。書き方は、`TODO:`と書いてその後ろに書きたい内容を書きます。
![スクリーンショット 2022-06-30 132105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/f1d55d66-931d-ae2a-a81a-4cf950e8dbeb.png)
TODOコメントを書いた状態で更新するとUnity上で下の画像ようになります。
![スクリーンショット 2022-06-30 131431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/fb1b1cee-94cf-2fa1-07a3-b27a60f293b0.png)
![スクリーンショット 2022-06-30 131639.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/ec7dd371-7159-2811-879f-87db55010a9f.png)
## Tags
文の後ろに`#`をつけることで`Tags`と呼ばれる機能を使うことができます。コメントと似ていますが、違う点としては文を読み込んだ際にその文の後ろに記述したTagsも同時に読み込まれ、`C#`で`string型`で取得できるという点です。ちなみに文章も取得する際は`string型`です。`C#`上では一文ずつ取得していくやり方がメインになると思うので、例えば一行ごとに名前のタグをつけて、ゲーム上で出力する際にTagsも同時に取得して名前を別の位置で表示させる、ような使い方ができます。また、Tagsは一文に複数使うことができるので、各Tagsをそれぞれ参照して、一つ目で名前を表示する、二つ目でメゾットを起動する、３つ目でGameObjectを有効/無効にする、というような使い方もできます。
![スクリーンショット 2022-06-30 140129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/f2d4c1fd-f163-6d2f-eca7-f13f278eecaf.png)
Unityで`Tags`を使った簡単な実装については別の記事で紹介しようと思います。
## Choices
文章の先頭に`＊`を付与することでその行を選択肢として実装することができます。それ以降に書かれた文章は分岐後の文として扱われます。複数選択肢を実装する場合は下の画像のように書きます。
![スクリーンショット 2022-06-30 164123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/8a7f15c5-1568-4468-3283-c33b3d2544c3.png)
また、選択肢の下の行で`＊`を一つ増やした選択肢を書く毎に分岐のさらに分岐を実装することが可能です。
```
*分岐1
   **分岐1-1
     ***分岐1-1-1
   **分岐1-2
*分岐2
```
選択肢をクリックすると次に読み込まれる文は選択肢の文となります。もし、選択肢の文を会話の文として読みこませたくない場合、選択肢の文を`[ ]`で囲むとその選択肢は読み込まれずスキップされます。
他の`[ ]`の使い方として、選択肢では短い文を表示し、選択後はそれに続くような文も追加して表示したい、といった場合は下の画像のように書きます。
![スクリーンショット 2022-06-30 172141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/22ea7baa-e971-d86e-be4d-9f43d96f5b76.png)
下の画像は一番上の選択肢をクリックした後です。`[ ]`の部分が消え、それに続く文が追加で表示されているかと思います。
![スクリーンショット 2022-06-30 172259.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/ee475948-1809-cd19-4b5f-f500de690366.png)
## Knots
会話の文を各セクションごとに分けたい時などに使われます。書き方としては下記のようになります。
```
=== main ===
```
`Knots`は三つのイコールの間にセクション名を書く形になりますが、書けるのは半角英数字とアンダーバーなどの一部の記号のみとなります。この機能を使うことで選択肢を再表示させることができます。下の画像で`Knots`を使った例を書きます。
![スクリーンショット 2022-06-30 182650.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725660/c24abd45-509d-c569-34ea-0daa47dc0e9b.png)
一行目は始めに`main`のセクションを参照する文です。セクションを設定した場合、
`->セクション名`と記述しないと読み込まれません。その後各選択肢の最後に`->セクション名`が記述されているかと思います。一つ目の選択肢は`->END`となっており１１行目の`->END`スキップされ、現在のセクションから抜けることを示します。
二つ目の選択肢の`->main`は`main`のセクションの最初まで戻ることを示します。これにより選択肢を再度表示することができます。一つ注意点として、見づらかったら申し訳ないのですが、二つ目の選択肢は`＊`ではなく`＋`で記述しています。この違いは何かというと、`＊`で記述して元の選択肢に戻った場合、既に選択したものは表示されません。`+`で記述した場合は再度表示されます。
# 終わりに
今回はInkの基本的な部分の紹介となりました。別の記事でUnityでの簡単な実装を紹介してみたいと思います。
もし、この記事を見てInkに興味を持ちましたら下記のリンクやYoutubeなどで主に海外の方があげている解説動画などを見てみて学んでみていただけると嬉しいです。
# 参照
https://github.com/inkle/ink
https://github.com/videlais/learning-ink-unity