意味を無くしたアプリ

[クソアプリアドベントカレンダー 2020](https://qiita.com/advent-calendar/2020/kuso-app)の22日目の記事です。

はじめてのUnityだったので、入門してからクソアプリをリリースするまでをまとめました。最後に計算してみたら3万円以上使っていたので、なんだかなぁという気持ちでこの記事を書いています。クソアプリの魅力は即席感にあるというのにお金をかけ過ぎた。

## アプリから意味を無くす
![release.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89103/a83a9650-2a09-d72c-9122-5f2a25a69cbe.gif)
[漢字に夢中なピロシキ](https://pirozhki.noplan.cc)
ピロシキと名乗る動物の集団が、文字の坂道でラージヒルするのを眺めるアプリ。

漢字に夢中なピロシキという名前と、意味を持たないアプリという方向性だけで作りはじめて、文字の坂道でラージヒルという形に落ち着きました。飛び立つタイミングで画面をタップしたら飛距離が伸びる、みたいなゲームらしさは無く、ただ坂を下るのを眺めるのみ。虚無感だけが残ります。

普通に実装を進めていくと、無意識のうちに意味をつけてしまうので、その意味を無くす作業がある種の拷問のよう。途中から、なにが意味かの判断がつかなくなったので、どこかに意味が残ってるかもしれないけど、もうよくわからない。

## 入門は猫
まずはUnityのインストールから。とりあえず[LTS](https://unity3d.com/unity/qa/lts-releases)にしておけば良さそうだっったので、`2019.4 LTS` を選ぶ。それから「Unity 入門 本」で検索して出てきた良さげな本を購入。いくつか迷ったけど、最後は猫につられた。

[Unityの教科書 Unity 2020完全対応版](https://www.sbcr.jp/product/4815606657/)

ゆるい表紙をしてますが中身は実践的で、ステージの作成・オブジェクトの動かし方・当たり判定なんかを、実際にゲームを作りながら学んでいく〜みたいな流れ。手を動かしながら読み終えたときには、なんだか行けそうな気がしてる。軽めのゲームなら頑張れば作れるんじゃないか、という希望を抱かせてくれる素敵な本。

## Udemyと紳士服
まだ作り始められる気がしなかったので、Udemyで[2Dゲームを作る講座](https://www.udemy.com/course/studio_shimazu_sideview_action/)を観た。猫本が入門だとしたら、この講座は入門＋テクニック集といった感じ。タイルマップの使い方や、シネマシーン、アニメーションの調整など、猫の手が届かなかった部分を補完できた。

[Unityインストラクターが教えるマリオ風2Dアクションゲームを作成する方法](https://www.udemy.com/course/studio_shimazu_sideview_action/)

この講座は良かったのだけど、Udemyの価格設定が腑に落ちない。定価が2万円以上だったので、高いなぁと思いながらフラフラしてたら、値引きされて1500円ぐらいで買えた。たまたまセール時間に入ったのか、行動履歴から狙われたのかわからないが、どちらにせよガチャが過ぎる。

2着目1000円の紳士服しかり、定価はあってないようなものなんだろう。


## とりあえず動くもの
![first-step.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89103/15af3400-babe-07f1-54f6-00e22f7521ee.gif)

入門書と入門講座では、スクリプトまわりが心もとなかったので、今更ながら[Unityのドキュメント](https://docs.unity3d.com/Manual/index.html)を読んだ。スクリプト以外にも、グラフィックや物理エンジンなどの、使いそうなところは眺めておく。

他にも、そもそもC#がわからんということで、[独習C#](https://www.shoeisha.co.jp/book/detail/9784798153827)という本と、[MicrosoftのC#のドキュメント](https://docs.microsoft.com/ja-jp/dotnet/csharp/)を行き来しながら構築を進めた。そんなこんなで、画面に文字を流すところまで行けた。この段階では、流れてくる文字の上にピロシキが鎮座する、という内容。黒い棒がピロシキのイラストになる想定。

## 動物のイラストを買う
せっかくの機会だからイラストを自分で描いてみる手もあったが、意味もなく質の高いイラストにした方が虚無いかなと思い、ペンを持つ前に[iStock](https://www.istockphoto.com/jp)で買ってしまった。

![zebra.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89103/a006cbaa-9380-6765-2c5d-4b12b583c0a0.png)
これは描けない。

本当はピロシキのイラストを探していたのだけど、パンチの効いたシマウマのイラストが先に見つかったので、「ピロシキと名乗る動物に集団」ということにして、動物のイラストを集めました。さようなら、ピロシキ。[シマウマ以外にも素敵な絵がいっぱい](https://www.istockphoto.com/jp/%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC/%E5%8B%95%E7%89%A9%E3%83%98%E3%83%83%E3%83%89-%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%83%89%E3%83%AD%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%B0%E5%BD%AB%E5%88%BB%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%A9%E3%82%A4%E3%83%B3-%E3%82%A2%E3%83%BC%E3%83%88%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB-gm960138990-262193754?clarity=false)あって1200円は安い。

他にもいくつか衝動買いして計7点を購入。調子に乗って買いすぎた。こんなに質の高いイラストが、この価格で買るえるのはありがたい。ロゴや商標に使わない〜などの禁止事項に触れなければ、モバイルアプリにも使えるとのこと。

[iStockコンテンツライセンス契約](https://www.istockphoto.com/jp/legal/license-agreement)

## ラージヒル
![kajiki.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89103/f48c4d9f-f9a5-c274-dd0a-926d6ded42ed.gif)
動物のイラストをどうしようかと考えた結果、斜面を滑走してもらおうと思い、ラージヒルに決定。いくつか動画を見てみると、滑走時間が4〜5秒だったので、それに合わせてステージの形状を調整する。動物とステージに当たり判定をつけて重力に身を任せただけなので、ほとんどコードは書いてない。

↓ラージヒルの動画（音が出ます）
https://www.youtube.com/watch?v=LnwuJrQn1WU

スーツを着て板を付けただけの人間が時速90キロで飛び立つなんて正気じゃない。

![stage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89103/b5536172-dd7d-97e4-8356-88ce7ae66454.png)

最初はIllustratorで坂道の画像を作ってたんですが、[Sprite Shape](https://blogs.unity3d.com/jp/2018/09/20/intro-to-2d-world-building-with-sprite-shape/)という便利な機能があったので、単色の画像に適用してUnityのシーン上で曲線のパスを調整しました。そのまま斜面にコライダーを適用できるので、こっちの方が楽。

[Sprite Shape を使って 2D ワールドを構築しよう](https://blogs.unity3d.com/jp/2018/09/20/intro-to-2d-world-building-with-sprite-shape/)

## アニメーションとバイブレーション
![IMG_0592.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89103/7a575789-3c79-c742-923b-20d7c23d9114.jpeg)

ピロシキに憑依する文字。

### [DOTween](http://dotween.demigiant.com/documentation.php)
Webでいうところの[GSAP](https://greensock.com/gsap/)みたいなやつがないか探したら、[DOTween](http://dotween.demigiant.com/documentation.php)という素敵なアセットがあった。アニメーションの終点と時間とイージングが設定できる。完璧。[ドキュメント](http://dotween.demigiant.com/documentation.php)が充実していて、どのコンポーネントに何のアニメーションが適用できるかを一覧で確認できて便利。無料でもある程度使えたけど、感謝の気持ちを込めて$15。

### [Nice Vibrations](https://assetstore.unity.com/packages/tools/integration/nice-vibrations-haptic-feedback-for-mobile-gamepads-108559)

BGMやSEを入れるつもりはなかったものの、フィードバックが何もないのは味気ない。色々なゲームを触ってみると、「コリッ」とした[Haptics](https://developer.apple.com/design/human-interface-guidelines/ios/user-interaction/haptics/)が返ってくるゲームがあった。[Nice Vibrations](https://assetstore.unity.com/packages/tools/integration/nice-vibrations-haptic-feedback-for-mobile-gamepads-108559)というマルチプラットフォーム対応の良さげなアセットがあったので購入。数行で実装できた。時は金（$15）。結局、Androidは手元の実機が古くて動作確認に不安があったので、iOSのみ震えるようにした。

```c#
void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.tag == "Player") {
        Transform t = gameObject.GetComponent<Transform>();
        SpriteRenderer sr = gameObject.GetComponent<SpriteRenderer>();

        t.DOScale(6.0f, 0.25f).SetEase(Ease.OutCubic);
        sr.material.DOFloat(1.0f, "_Threshold", 0.25f).SetEase(Ease.OutCubic);

        #if UNITY_IOS
            MMVibrationManager.Vibrate();
        #endif
    }
}
```

この2つのアセットを組み合わせて、動物と文字がぶつかったときに、Haptic feedbackを返しつつ、文字をScale up & Dissolveさせています。[Material.SetFloat](https://docs.unity3d.com/ScriptReference/Material.SetFloat.html)の代わりにDOFloatが使えたので、シェーダーのプロパティを変更するアニメーションが1行で書けた。

## ゲーム性の放棄
なんとなく完成が見えてきた段階で我に返る。面白くないのは仕方がないとして、絵面が変わらない坂を下るだけではゲーム性が無い。そもそもゲーム性ってなんだ？画面をタップするタイミングで飛距離を変えればいいのか？ガチャが引ければいいのか？

考えているうちに面倒になって、ゲーム性は放棄した。
これはクソゲーじゃない、クソアプリだ。

```
ゲーム - ゲーム性 = 虚無
```

## 広告の設定
![IMG_0565.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89103/012a9dd9-3411-c7d1-82c6-b560fb438b98.jpeg)

クソアプリではあるが、広告はしっかり設定する。
組み込みが簡単そうだったので[Unity Ads](https://unityads.jp)にした。

* Rewarded video - 再生したら報酬があるやつ
* Interstitial video - 途中で強制的に挟まるやつ
* Banner - 画面下とかにあるバナー

[Integration guide for Unity](https://unityads.unity3d.com/help/unity/integration-guide-unity#basic-implementation)に実装パターンが書いてあった。

画面遷移に動画を挟むのは嫌だったので、動画広告のリンクを置いて、自分から動画を再生してくれる徳の高い人がいることを願うことにした。プレゼントできるアプリ内報酬が思いつかなかったので、「ありがとう」を伝える仕様。これをリワードと呼べるかは知らない。この世に著作権というものがなかったら、いきものがかりを流したかった。

こんな感じで、動画再生後の処理を書けます。
[Rewarded video example](https://unityads.unity3d.com/help/unity/integration-guide-unity#rewarded-video-example)

```C#
using UnityEngine;
using UnityEngine.Advertisements;

public class RewardedAdsScript : MonoBehaviour, IUnityAdsListener { 
    // ここで初期化
    void Start () {}

    // 動画を見せて
    public void ShowRewardedVideo() {}

    // 見終わったら報酬をプレゼント
    public void OnUnityAdsDidFinish (string placementId, ShowResult showResult) {}
}
```


> No automated payouts scheduled.
> Your balance does not exceed the threshold of 100 USD

収益の受け取りは$100から。道は険しい。

## プライバシーポリシーの作成
クソアプリにプライバシーポリシーって・・・という気持ちはあるが、Unity Adsが[IDFA](https://developer.apple.com/documentation/appstoreconnectapi/advertising_identifier_idfa_declarations)などを収集するので必要。ついでにLPでも作ろうかと思ったんですが、特にサイトで伝えたいこともなかったので、[何か言ってそうで何も言ってない文章](https://pirozhki.noplan.cc)を並べて[Vercel](https://vercel.com/)にホスティング。プライバシーポリシーへのリンクは、アプリ内やストアにあるので、トップページは文字とアプリのバナーだけにした。

https://pirozhki.noplan.cc
https://pirozhki.noplan.cc/privacy/

プライバシーポリシーには、[UnityのブログにあったFAQ](https://blogs.unity3d.com/jp/2018/05/24/gdpr-monetization-services-jp/)を参考にしつつ、「Unity Adsで適切な広告配信するために、デバイスタイプや〜を収集してます。オプトアウトの方法は〜。何かあったらメールまで」みたいな内容を書きました。

▼ 参考
[Unity Ads、Unity Analyticsを利用する開発者・パブリッシャー向けGDPR関連情報](https://blogs.unity3d.com/jp/2018/05/24/gdpr-monetization-services-jp/)

## iOS版のリリース

### Apple Developer Program
リリースに必要なので登録。
11,800円/年。高いぞ。

### ビルドのための設定
iOS向けにビルドするために、Unityの[Player settings](https://docs.unity3d.com/2019.4/Documentation/Manual/class-PlayerSettingsiOS.html)でアイコンなどを設定。

* [アプリのアイコン設定](https://docs.unity3d.com/2019.4/Documentation/Manual/PlayerSettingsiOS-Icon.html)
* [向きはPortraitを指定してステータスバーを表示](https://docs.unity3d.com/2019.4/Documentation/Manual/PlayerSettingsiOS-Resolution.html)
* [スプラッシュスクリーンのUnityロゴアニメーション無効](https://docs.unity3d.com/2019.4/Documentation/Manual/class-PlayerSettingsSplashScreen.html)

### 申請
[丁寧に解説してくれているブログ](https://i-app-tec.com/ios/app-release.html)があったので、参考にしながら申請を進める。証明書とか複数解像度のスクショ作成とか地味に面倒くさい。なんだかんだで半日かかってしまった。

[[iPhone] iOSアプリを登録、申請して公開するまで](https://i-app-tec.com/ios/app-release.html)


### リジェクト → 説得失敗
> Guideline 4.2 - Design - Minimum Functionality
> 
> We found that the usefulness of your app is limited by the minimal amount of content or features it includes.

アプリがショボすぎるから出直せと。クソアプリとしては褒め言葉かもしれないが、リジェクトされては意味がない。そもそもクソアプリなどリリースしてくれるなということだろう。機能を足してしまうと軸がブレるので、[問題解決センター](https://help.apple.com/app-store-connect/#/devaf41ecbd5)から説得をはかる。このアプリは最小限だからこそ価値があります。みたいな内容で送ったが、気持ちはわかるけどガイドラインに従ってくれ、とたしなめられる。反論の余地がない。

### 機能追加 → 公開！
![IMG_0566.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89103/b2611148-9403-69b1-1113-09488d6bb396.jpeg)

不本意ながら、動物を一覧で見られる機能を追加したら、無事に審査が通った。基準がよくわからん。ともあれ、アドベントカレンダーに間に合って安心した。

### ストアで確認

![IMG_0559.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89103/356468ce-7a5b-ce45-dada-1fb8b715e81c.jpeg)
[App Store - 漢字に夢中なピロシキ](https://apps.apple.com/jp/app/%E6%BC%A2%E5%AD%97%E3%81%AB%E5%A4%A2%E4%B8%AD%E3%81%AA%E3%83%94%E3%83%AD%E3%82%B7%E3%82%AD/id1542441357)

ストアで「ピロシキ」と検索しても競合アプリが見当たらない。ブルーオーシャン。参考までに、申請から配信までのタイムラインです↓

```
=== 1回目：リジェクト ===
2020/11/28 18:36 審査待ち
2020/11/30 02:25 審査中
2020/11/30 03:00 却下済み

=== 2回目：リリース ===
2020/12/07 03:38 審査待ち
2020/12/07 04:50 審査中
2020/12/07 09:13 配信準備完了
```

## Android版のリリース
iOS版の申請で待ち時間があったので、Android版のリリースも進める。下記のブログを参考にしながら順に設定。アプリのアイコンやスクショは、iOSのものをリサイズして使い回せたので2時間ぐらいで終わった。

* [Google Playで公開するためにアプリの書き出しをする](https://miyagame.net/unity-android-google-play-apk/)
* [Google Play ConsoleにてapkファイルをアップロードしUnityのアプリを公開する](https://miyagame.net/google-play-console-upload/)

以前にAndroidアプリを作りたいと思ってお金を払っていたので、ここでの出費は無し。$25を一回払えばOKというのは良心的。審査に4日かかったものの、無事に公開されて安心。Androidは審査が優しいという噂は聞いていたが、一発で通るのは嬉しい。

[Google Play - 漢字に夢中なピロシキ](https://play.google.com/store/apps/details?id=cc.noplan.pirozhki)


# 支出 32,826円

| 項目 | 金額 |
|:-:|:-:|
| 書籍 | 6,710円 |
| Udemy | 1,610円 |
| イラスト | 9,020円 |
| Unity Asset Store | 3,686円 |
| Apple Developer | 11,800円 |
| 合計 | 32,826円 |

そこそこの家電が買える金額。

# 良いお年を
このところピロシキが食べたいと思うことが多かったので、アプリの名前にまでしたのに、まだ食べられてないのが心残り。来年はピロシキを食べられる年にしたい。最後に、Unityの宣伝動画が素敵だったので、リンクを置いときますね。

[あなたもUnity、はじめてみませんか？（音が出ます）](https://www.youtube.com/watch?v=9GKo2iogPsM)