【非プログラマ対象】UnityでLive2Dの売り子アプリを、コードを触らずに作りたいひとを鍛え直してコードを触らせる Cubism SDK 入門 その1

# はじめに

[Live2Dアドベントカレンダー](https://adventar.org/calendars/4268)7日目の記事です。
Live2D Cubism SDK for Unity を使えるようにビシビシしごいてやる。覚悟しろ。
SDKは一生の相棒
がんばるか、超がんばるかの2択です


## 対象読者と必要知識、開発環境
### 想定する読者レベル

- Live2Dの基本的な操作や組込み用書き出しは理解していている
- Unity初心者、インストールは済ませた
- 簡単な入門サンプルやチュートリアルを最低1個以上打ち込んだことがある
- コードとか書きたくないでござる！ 俺は売り子アプリを作りたいだけなんだ！

![usa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/1df62740-fcad-f38e-f86c-26713f696c2e.png)

### Unityの想定バージョンや環境
- Unity 2018.3～2019.4.22辺り[筆者の執筆時点はは2018.3.11f1、最近は2019 4.22f]
- Microsoft Visual Studio Community 2017～2019
- [2019/11/14] Cubism 4 SDK for Unity beta2
- Windows 10

(上記範囲外でも、たぶん問題ない筈)

#### Unity概要
完全な初心者向の方は以下のリンク先にざっと目を通しておいてください
リンク：[入門者向けにUnityの概要を大雑把に解説する](https://qiita.com/kurisaka_konabe/private/ea2568b2de4ad5a46886)
リンク：[Unityで初心者がハマりがちな罠とエラー対策](https://qiita.com/kurisaka_konabe/items/a5fb06f2a8e6a7efd2cf)

## プロジェクト作成と準備
#### プロジェクト作成
プロジェクト名は適当に(半角英数で)。テンプレートは「2D」で。
保存場所も半角英数のディレクト名が無難です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/4bb09119-8a50-7633-46dc-c191ecb066b5.png)


#### SDKのインポート
公式ダウンロード先：[Cubism SDK for Unity ダウンロード](https://www.live2d.com/download/cubism-sdk/download-unity/)
ダウンロードした「CubismSdkForUnity-4-beta.2.unitypackage」(執筆時点の最新版)をProjectウィンドウのAssetsフォルダ内にドラッグ&ドロップでぶち込みます。

ぶち込んだら「import」ボタンを押してインポートします(チェックマークは弄らずにそのまま全部インポートしてください)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/b7d1f85e-3dbd-54d3-035b-8dc54b91d2be.png)

無事インポートが済んだら、一旦Unityを再起動してください。
**必ずUnityを再起動** してください（大事なことなので2回言う必要がある）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/4873cd86-8581-ff36-d511-aaf9bc656860.png)

Samplesフォルダ内のどこかにあるシーンファイル(Unitロゴの四角いアイコンのやつ)をダブルクリックするとそのサンプルシーンを読み込めます。Unityの再生ボタンを押すと実行できます。

#### サンプルたのしい
Live2D SDKには色々なサンプルシーンが入っています。詳しくは…
[初心者向け Live2D Cubism SDK for Unity のサンプルシーンについて軽く解説する](https://qiita.com/kurisaka_konabe/private/1aa8c78d7239f3898ac7)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/6909c7a6-2351-28d5-f274-961807c09d31.png)

Assets > Live2D > Cubism > Samples > OriginalWorkflow > Demo 内にある Demo.unity(Unityロゴのシーンファイル)をダブルクリックで開いて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/aafdbc01-5010-bb48-cf8b-5f7086cada5f.png)


再生ボタンで実行してみてください。Gameウィンドウ上でドラッグするとLive2D的な顔がグリグリ動くサンプルになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/4afccff1-c67c-bbb9-909e-6e53ff80efa0.png)


この名執 尽のサンプルを参考にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/e68e27b7-6ae0-7028-b9e6-f8d8175bc69a.png)

CubismLooKTarget.cs…うん
このコンポーネント(C#のスクリプト)を使わせて貰おう。

### コンポーネントってなんやねん?
詳しくは
[初心者向け UnityのGetComponentってなんやねん？](https://qiita.com/kurisaka_konabe/private/9d0250de8610666b9013)


## Cubism SDK for Unity

### SDKのドキュメントについて
公式ドキュメント： https://docs.live2d.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/83b1d4d3-a065-7fe4-2955-bce698133900.png)


- 大きく分けて「マニュアル」と「チュートリアル」の2つがある。
- **「SDKチュートリアル」**をメインに読むことになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/568139fe-bf36-a2e1-189c-4d8efe584270.png)


## モデルとモーションを用意する
以下、基本的な組込み用ファイルの書き出しは方法はわかっている前提で説明します。
(わからない方は公式マニュアルを参照願います)
#### パラメータIDの変換
必須ではないですが、新形式(3.0以降)の形式に変換しておいてください。
特に「テンプレート適用」でモデリングした方は旧形式のIDになっている方が多いと思います。
(当たり判定用アートメッシュのIDと統一感を持たしたいので…)

#### 当たり判定用アートメッシュの用意
これも公式マニュアルに作り方が載っています。
[当たり判定の設定準備](https://docs.live2d.com/cubism-editor-manual/hittest/)

わかりやすいように

- HitAreaHead (頭タッチ用)
- HitAreaBust (胸タッチ用)

っとします(もちろん、お好きなIDでもいいです)。
余談ですが、出来れば親デフォーマはルートのままではなく、適切なデフォーマを指定してやってください。(余程、大きく動くモーションでない限り殆どの場合問題ありませんが、頭が当たり判定を置き去りにしたり…)


#### moc3書き出しとモーションファイルの書き出し
ここではhiyoriちゃんで説明します。
[公式マニュアル 「組み込み用データ」](https://docs.live2d.com/cubism-editor-manual/export-moc3-motion3-files/)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/5530ad34-bc86-7004-c5d6-c00a1135bd1a.png)

- モーションファイルの書き出しは「motions」という名前である必要はない
- hiyoriフォルダ内に書き出す必要もない
- Live2D Viewerでモーションと紐付けてモデル設定ファイルに保存する**必要はない**
- モデルを書き出したフォルダとモーションを書き出したフォルダは別で、**別々にインポートしてもよい**
- ここでは、上図のようにhiyoriフォルダ内のmotionsフォルダに書き出し、一緒にまとめてインポートします


## MyGameフォルダの作成
これは個人的な私の流儀であって必須ではないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/21183ccb-f0e9-2d07-ca9e-766d7f07886d.png)

他のアセットをインポートしたときに混ざるのが嫌なので、Assetsフォルダ直下に自分のアプリ名（ここではMyGameとします）などでフォルダを作り(右クリック→Create→Folder)、

- シーンファイルはScenesフォルダに
- スクリプトファイルはScriptsフォルダに
- Live2DモデルはModelsフォルダに
- 「s」が付いて複数形です

Live2Dフォルダ内は純粋にSDKをインポートしたときのままにして下手に弄らないのが無難です。あとでSDKを最新版に更新したくなったときにも困ります。

フォルダやファイルの階層構造はドラッグ&ドロップでいつでも変更できます。変更しても参照しているファイルへのリンクが切れてしまったりしません。

↓のルールは必須ではないですが、慣例に倣っています (ただし「特殊フォルダ名」は特別な動きをするので注意)。
参考：[Unityフォルダ構成のルールについて](https://qiita.com/takish/items/8608ba9070755da3ae6d)

### Live2DモデルのUnityへのインポート
[公式チュートリアル 入門 「SDKをインポート→モデルをインポート」](https://docs.live2d.com/cubism-sdk-tutorials/getting-started/)
公式のSDKマニュアルにもありますが、ドラッグ&ドロップで自動的にUnityのプレハブを作ってくれます。
丸投げ(「モデルをインポート」ってところを読んで！)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/7f7937fe-44f8-ce53-9202-8f5c5d2a635f.png)


プレハブってなんやねん？ ってレベルのひとは
[入門者向けにUnityの概要を大雑把に解説する](https://qiita.com/kurisaka_konabe/private/ea2568b2de4ad5a46886)


## シーンの準備
空のシーンから作ってもいいのですが、面倒なのでサンプルの「Animation」シーンをダブルクリックして開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/5c32799c-36eb-936d-a5c0-e08f3ade9895.png)

開いたらシーンを別名で保存しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/7bfa6881-20f9-0cd2-5cc6-045068d7d0ab.png)

ここではMyGameのScenesフォルダ内にhiyoriで保存しました(Assetsフォルダ以下ならどこでもどんな名前でも保存できます)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/1b717e30-f88b-a041-93ff-f95707c1a4e1.png)

元からあるこはくちゃんを選択してDeleteキーを押して削除するか、移動ツールで脇にどけてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/2c8e1c33-ed32-2c0e-6fbc-fdc34f8960b6.png)

hiyoriのPrefab(青いキューブアイコンの)をシーン内にドラッグ&ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/ccdfca62-b1ba-4776-9fbb-c9b1709f1588.png)

配置できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/96ec0670-852d-b1bb-a02e-62c808b3b014.png)

Hierarchy上の(ProjectウィンドウのPrefabではなく)hiyoriちゃんを選択した状態でInspectorの値を弄ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/4113df37-165c-76cf-f9ad-2e78fcce0c5b.png)

positionを 0,0,0に調整しましょう。

## Mecanim(メカニム)でモーションを再生、管理

#### 状態遷移ってなんぞ？ってひとは
[初心者向け Unity 状態遷移、メカニムってなんやねん？](https://qiita.com/kurisaka_konabe/private/1af541c01eb1ba3e9ae6)

hiyoriのモーションが入ったフォルダ内にあるAnimation clip(再生マークのアイコン)のどれか好きなやつをHierarchy上のhiyoriにドラッグ&ドロップします。
![hiryo_drop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/833c110b-e25d-dad8-f6f6-6610a1fd550f.gif)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/933c3749-318f-e5e8-0afa-613b7604e39a.png)
すると自動的にAnimation Controllerというものが作られます。
(手動で作る場合はAssetsフォルダ内で右クリックからCreateでも作れる)
![hiryo_icon_size.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/98019458-dcfc-d064-8bfb-0ee1867a21c5.gif)
おっきいアイコン表示にするとこんな感じ(状態遷移図を表している)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/4bdf3acb-18a3-5671-a177-d5a67580f0b0.png)

Hierarchy上のhiyoriを選択状態にするとInspector上にAnimation Controllerが付いていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/588f623b-32be-2960-832f-6380ce52f2ff.png)

Controller項目の「hiyori」をクリックするとセットされているAnimation Controller黄色くハイライト表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/1b9e77c5-dead-3616-af15-a1289f4e8810.png)

再生ボタンを押してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/9a22dbe6-0382-ea5c-0e2d-f20ab64e8cba.png)
hiyoriちゃんが動き出すと思います。

再生中にHierarchy上でhiyoriちゃんオブジェクト選択状態にしてAnimator(アニメーター)ウィンドウを表示してください(メニューのWindow→Animation→Animatorから開くか、「hiyori」Animation Controllerをダブルクリックする)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/2ed78d79-0e90-66e8-5bb8-ffb4635ceecc.png)
![hiryo_01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/d1acfcdb-ea6c-bcb8-5426-d8694b99140b.gif)


これはhiyori_m01(Animation clip名で自動で付いた名前)という名前のステートがループ再生され続けています。

再生を止めて(Unityは再生中の変更は保存されない)、

では、他のアニメーションクリップもセットしてみましょう。
![hiryo_make_tra.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/b7e9e770-557e-df29-9a04-1dc25cd0e6b7.gif)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/3e0a6fd7-1070-8389-4480-647f5fef1eac.png)
hiyori_m02、hiyori_m03をこのAnimatorウィンドウ内にドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/0c91b632-0e06-d0a7-942e-a87ca738ba12.png)
すると、Animation clip名で自動的にステート(状態が作られます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/5a25fea3-ebdd-6c47-e770-b3a5b1c3bf39.png)
hiyori_m01ステートを右クリックしてMake Transitionを選び、矢印を次のm02に繋ぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/fb1dbd7a-c3bc-c4f7-4b33-1ba2a953ef4a.png)

同様にm02からm03にも繋ぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/cee510da-6f17-709e-c3a4-e5028168a27d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/56c6bd9d-2627-8241-d3b4-bee3e62f474f.png)

3つを循環するように繋げて再生すると、ぐるぐると循環して再生されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/d17222b8-b923-3ccf-a2f3-a31d01fed9a4.png)
![hiryo_03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/73384fdc-e5c6-65fe-56db-ba1484a2452f.gif)

この矢印(トランジション)を選択状態にしてInspectorをみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/4ca05922-6862-c43e-df7b-deae60c1cab2.png)
遷移する条件が書かれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/166879f2-234e-f4bf-c904-6d3bb58eb42c.png)
ごちゃごちゃして難しそうですが、HasExitTimeのチェックはモーションが再生し終わったら…っという条件です。

**その他詳細は次回に…**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/9be6d88a-db19-3f20-89b1-a5009f109353.png)

折角作ったシーンの保存を忘れずしておいてください。

## 余談
#### 関数ってなに？ってレベルのひとは
[初心者向け Unity 関数ってなんだよ？](https://qiita.com/kurisaka_konabe/private/1b4fd992429ee35207ec)

#### 余談 Actionという名前のスクリプトは作らないでください(他アセットにあってもダメ)
[Live2D Cubism SDKのActionという名前でハマった話、名前空間と衝突](https://qiita.com/kurisaka_konabe/private/02c9a1b6bf7906256828)

## 今回扱っていない項目
**長くなったので、その2 に続きます(執筆中)**

今回の記事は必要最低限のものです。
また、ベストな手段であることを保証しません。
より、効率の良い方法がある可能性があります。
(Unityつよいひとのツッコミ待ち)

#### 次回以降予定：

- クリックで当たり判定を取って任意のモーションを再生
- Live2Dのパラメータを直接弄る
- モデルファイルの更新
- SDKで用意されている便利コンポーネントの解説
- 背景画像の表示
- 複数モデルの同時表示
- 複数モデルの表示切り替え

## たになつみ神のスマホ作例
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">UnityとLive2DSDKを使えば超エモいポートフォリオつくれる！😎<br><br>全部ネットの無料知識で作れて、完全に理解できる！<br><br>「HP見てください」<br>「後でポートフォリオデータ送ります」<br>から<br>「こんなことできます（スマホ ｽｯ）」<br><br>どう考えても強い！💪<br><br>全Live2Dマンは勉強すべき<a href="https://twitter.com/hashtag/%E3%81%AA%E3%81%A4%E3%81%BF%E3%81%A1%E3%82%83%E3%82%93%E3%81%AE%E3%81%8A%E3%83%86%E3%82%AF?src=hash&amp;ref_src=twsrc%5Etfw">#なつみちゃんのおテク</a> <a href="https://t.co/AVK8bd4N33">pic.twitter.com/AVK8bd4N33</a></p>&mdash; 【たに なつみ】ちゃん/無頼♦♠🏰 🕛🐈🐤火曜日西地区 &quot;Ｋ &quot;　11a (@BURAI_VC2008) <a href="https://twitter.com/BURAI_VC2008/status/1202017376323002368?ref_src=twsrc%5Etfw">December 4, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ご本人様がメイキングをアップしてくださるかもしれませんね。
まぁ、どちらにせよ想像で似たアプリを作れるような解説の続編を書く予定です。
あと、Live2D社様の中のひとがより良い方法をご提案してくださるかも(チラッ)

### 続き

[続き その2](https://qiita.com/kurisaka_konabe/private/6bdff265cdbe8fd9b846) へ

## アドカレについて

明日は[トライタム](https://twitter.com/traitam)さんの『上体パラメータについて考えたり研究して、まとめを書きます(がんばります)。』です。
たのしみですね。

## 更新履歴
### 2019/12/09
- gifアニメを幾つか追加

### 2019/12/07
- アドカレ当日につき取り敢えず投稿…今後細かい修正予定、続編執筆予定