Unity玉転がしをスマホにビルド

# はじめに
Unityの玉転がしをスマホに入れる。
Unity Hubを使ってUnityを入れているとAndroidのビルドがすごく簡単。
Unity Hubをダウンロード:https://unity3d.com/jp/get-unity/download
iOSのビルドもしますが基本的に`Macが必要`なので注意。
また、私はAndroidなのでiOSの説明は雑になります注意。

スマホ操作用にスクリプトの書き換えもします。
完成したUnityチュートリアルの玉転がしを書き換える。
玉転がし:https://unity3d.com/jp/learn/tutorials/s/roll-ball-tutorial


Unityバージョンは2019.2.1f1
Unity Hubは 2.1.0




# 準備
Unity Hubを開いてインストール>３つの点>モジュールを加える。
![スクリーンショット 2019-09-05 16.50.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/f13aae5c-b89a-c83a-123e-17a3d263fc3f.png)
![スクリーンショット 2019-09-05 16.52.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/b60c886d-4663-61ac-2414-067d65428423.png)


Androidなら
`Android Build Support`
`Android SDK & NDK Tools`
`OpenJDK`の3つを選択して実行。

iOSなら`iOS Build Support`を選択して実行。
![スクリーンショット 2019-09-05 17.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/ae7bc13f-f291-c72e-f321-0d9861e03ee9.png)
何か聞かれるかもしれないけど同意してインストール。

インストールが終わったら準備ok。
プロジェクトを開く。



# スクリプト書き換え
キーボードで操作していた部分をスマホでも操作できるようにする。
だいたいUpdate()の中身を書き換える。

```c#:PlayerController.cs
public class PlayerController : MonoBehaviour
{
    //重力加速度
    const float GRAVITY = 9.81f;    // 追加

    public float speed;
    public Text scoreText;
    public Text winText;

    private Rigidbody rb;
    private int score;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
        score = 0;
        SetCountText();
        winText.text = "";
    }

    void Update()
    {
        Vector3 vec = new Vector3();   // 追加

        //エディターか実機か判定する
        if (Application.isEditor)
        {
            // こちらが元々の操作
            // ここに元々Update()に入っていたコードを移す
            var moveHorizontal = Input.GetAxis("Horizontal");
            var moveVertical = Input.GetAxis("Vertical");
            var movement = new Vector3(moveHorizontal, 0, moveVertical);
            rb.AddForce(movement * speed);
        }
        else
        {
            // こちらがスマホでの操作
            vec.x = Input.acceleration.x;
            vec.z = Input.acceleration.y;
            vec.y = Input.acceleration.z;

            //シーンの重力を入力ベクトルの方向に合わせて変化させる
            Physics.gravity = GRAVITY * vec.normalized * speed/10;
        }
    }
```

キーボードでの操作から端末の傾きでの操作に変える。

タッチでの操作。

```c#:
if (Input.GetTouch(0).phase == TouchPhase.Ended)
{
    // タッチで行いたい処理、ジャンプとか
}
```

これでスマホで操作できるはず。



# 設定
メニューからFile>Build Settingsを開く。
![スクリーンショット 2019-09-05 17.30.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/be35cf47-f0b7-b4e5-dd47-1534dba0a384.png)

##### 使うシーンを入れる
`Scenes In Build`に使うシーンをAssetsからドラッグドロップ。
シーンが複数あるなら最初に来て欲しいシーンを一番上にする。
玉転がしならシーンはひとつのはず。

##### プラットフォームを切り替える
`iOS`か`Android`を選択して`Switch Platform`。
現在選んでいるプラットフォームにはUnityアイコンがついている。

##### Player Settings
`Player Settings`を開く。
![スクリーンショット 2019-09-05 17.43.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/7316188f-81bf-d2c5-29b4-c9162346bd56.png)

◆`Company Name`と`Product Name`を適当に変える。
<dd>変えないとビルドに失敗する。</dd>
◆Resolution and Presentation>Orientation>`Default Orientation`を`Landscape Right`にする。
<dd>スマホの向きを横向きで固定している。
他の向きにしたり傾き検知で回転もできる。</dd>
◆Other Settings>Identification>`PackageName`を一応確認する。iOSは`Bundle Identifier`。
<dd>先ほど変えたCompany NameとProduct Nameの組み合わせになっていれば○
例:`com.watasi.ball`</dd>

　
これで設定ok。
ここからAndroidとiOSで分かれる。


# Android
端末側の設定を変える。

◆ 設定>端末情報>ソフトウェア情報 からビルド番号を7回タップし開発者モードにする。
◆ 設定>開発者向けオプション からUSBデバッグをオンにする。
◆ 端末とPCをデータ通信が可能なケーブルでつなぐ。

これで端末側の準備はok。


ケーブルを繋いだら`Build Settings`の`Build And Run`をクリック。
![スクリーンショット 2019-09-05 18.14.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/5f080901-180d-0066-2961-797ea9b7b1ad.png)

適当に名前をつけ`Save`。
保存場所もそのままで良い。

これで自身のスマホにゲームをビルドできたはず。
できなかった人は解決策をまとめるので見てみて。


# iOS
Macがないとダメよ？
Xcodeが必要になるのでApp Storeからインストールする。

とりあえず`Build Settings`の`Build And Run`をクリック。
![スクリーンショット 2019-09-05 18.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/391ecce7-bddf-7ca5-5ff5-964dbee34526.png)

適当に名前をつけ`Save`。
保存場所もそのままで良い。

ビルド後にXcodeが開くはず。
![スクリーンショット 2019-09-05 18.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/bb68a980-1779-cffc-0942-025134f5215c.png)

左の一番上(Unity-iPhone)をクリック。
タブの`General`を選択。
Teamを選んで`Add An Account`、自身のApple IDでログイン、戻る。
またTeamを選んで先ほど追加したアカウントを選択。

端末とPCをケーブルで繋ぎ、上側の`~~ Generic iOS Device`から自身の端末を選ぶ。

再生マークのボタンを押す。

端末側でMacと制作者を信用する。

ビルド成功でok。



# エラーが起きたら
体験したビルドの失敗と解決策を書いておく。
## Androidエラー
### No Android devices connected
◆端末をPCと繋がずにビルドした
繋ぐ。

◆ケーブルがデータ通信に対応していない
ケーブルがデータ通信に対応している場合、PCと繋いだ時端末側のステータスバーに「通常充電」の他に、「USBをファイル転送に使用」という項目が出てくるはず。

◆端末側でUSBデバッグがオンになっていない
上の[Android](#android)を見てもう一度。

◆逆に繋いでいないのにこのエラーが出ない
[プラットフォーム](#プラットフォームを切り替える)がAndroidに切り替わってないかも。

### CommandInvokationFailure: Unable to install APK to device. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details.
実際に体験していないエラーなので解決策だけをつらつらと。
◆タスクマネージャーでadb.exeのプロセスを終了する
よく分からないけどこれでビルドが通るようになるらしい。

◆Package Nameを変える
[Player Settings](Player Settings)で`Company Name`と`Product Name`を変え、`Package Name`が変わっていることを確認したはず。
それでもダメならさらに`Package Name`を変えてみる。

◆保存したビルドのパスに日本語を入れない
C:aaa/bbb/ccc/ddd.apk
ビルドすると拡張子がapkで保存されると思いますが、そこまでのパスに日本語が入っているとダメだそうです。




## iOSエラー
なんのエラーがあったかふわっと忘れました。

https://qiita.com/segur/items/bef54efa7764885173bb
この方の「ケース：プライバシー情報がロックされてしまった」の症状でした。


# おわり
だんだんと雑になっていく記事になりました。
大変ですがスマホに入れられるとわくわくしますね。