Unity Remoteを導入・使用したので覚え書き(Android)

## はじめに
UnityでAndroid端末向けのアプリを作成している際、タッチ操作がPCのエディタ上で確認できないため苦労しました。
手軽にタッチ操作の挙動を確認するには…と調べてみると「Unity Remote」というものがあったので実際に使用してみました。その際の手順や注意点など、何点か記録に残しておきます。

なおAndroidとiOSで手順など違いがあるかもしれません。自分が動かしたのはAndroid環境のみです。

### 対象
- UnityでAndroid端末のタッチ操作を手軽に動作確認したいひと
- Unity Remoteがうまく動かないひと
- Unity Remoteと、実際にAndroid端末で動かす場合との違いで困っているひと


### 前段
[公式ドキュメント](https://docs.unity3d.com/ja/2018.4/Manual/UnityRemote5.html)に書かれている通り、Unity Remoteはあくまでも
　・エディタで再生されるシーンを端末に表示する
　・端末のタッチ操作を受け付ける
というものです。
Unity Remoteを入れた端末上でアプリが動いているわけではないので、実際にビルドして端末にインストールして動かした場合とは全く別物です。
とはいえ、ビルドとインストールなしで手軽に雰囲気味わえるのは大変助かる話です。


## Unity Remote導入
### わたしの環境
- Unity: 2019.2.19 64bit
- Android端末: URBANO V02, Android 5.1

### 手順
**◆Android端末側**
１. Unity Remote 5を[Google Play](https://play.google.com/store/apps/details?id=com.unity3d.genericremote)から取得してインストールする  
２. USBデバッグをONにする
　端末の設定 -> 開発者向けオプション -> USBデバッグ で設定をONにします。
　(開発者向けオプションを有効にする手順は省略…)  
３. Unityのエディタを起動するPCとUSBで接続し、Unity Remoteを起動

とりあえず端末側はここまでです。

**◆PC側**
１. 事前準備
　既に設定済みのものはスキップしてください。

- **Android Build Supportを入れておく**
File -> Build Settings でPlatform:Android を選択した際、右側の設定が表示される「Open Download Page」となっていた場合、そのボタンをクリックしてAndroid Build Support をインストールしておく必要があります。 
無事にインストールされれば、各種設定が表示されるようになります。図のようになっていればOKです。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474074/ae29d337-2364-8ba4-8a89-bef40b87805b.jpeg)

- **Android SDKのパスを通す**
Edit -> Preference -> External Tools -> Android の設定で、Android SDKのパスを設定しておきます。
Unityと一緒にインストールしていた場合は「Android SDK Tools Installed with Unity(recommended)」にチェックを入れればよさそうです。
自前でインストール済みの場合はそのパスを入れておきます。![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474074/e14f821f-3124-49b8-1d67-f14c257f9724.jpeg)
Android SDKがまだ無い場合は、[このあたり](https://developer.android.com/studio/index.html?hl=ja)からAndroid Studioを取得・インストールすればSDKも一緒に取ってこれます。
(またはAndroid Studioインストール後にSDK Managerで取得？)

- **Unity Remoteの端末設定を行う**
Edit -> Project Settings -> Editor -> Unity Remote の設定で、Deviceを「None」から「Any Android Device」に変更しておきます。
それ以外の設定はおそらくデフォルトのままでよいと思います。
(もちろん必要に応じて変えることもあるのでしょうが)
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474074/70cead28-4d89-25b1-14ab-a42f968bbb0c.jpeg)  

２．Unity Remoteで再生したいシーンを起動して再生
　端末側が各種設定済み && Unity Remote起動済みであれば、端末側でシーンが再生されるはずです。
　もし再生されない場合は上記手順で抜けている部分が無いか確認し
　それでもだめならエディタを再起動してシーン再生しなおすとうまくいったりします。(よくある)


## 使用にあたっての覚え書き
### Unity Remoteはあくまでもエディタ環境である
現在作成しているアプリについて

- Windows PC版: マウス移動+クリック操作
- Android端末版: タッチ移動+クリックに相当するボタンを表示してボタンタッチ操作

というように、プラットフォームに応じてUIや操作方法を変えるようにしていました。
そのため、エディタ上のシーン再生も

- PC: Windows PC版と同じ
- Unity Remote: Android端末と同じ

となってほしかったのですが、その区別がなかなかできずに苦労しました。
Unity Remoteでシーン再生した場合でも

- `Application.platform` で取得されるプラットフォーム種別は`RuntimePlatform.WindowsEditor`
- `Application.IsEditor` で取得される結果も`true`

であったためです。

### Unity Remoteかどうか判別する方法
`UnityEditor.EditorApplication.isRemoteConnected`を使うことでなんとか判別できました。
ただし注意があります：

- **シーン再生してから少しの間(Unity Remote側で表示されるまで？)はisRemoteConnectedがfalse**
Awake, Startなどの関数で参照するとうまく判断できないことがあります。

- **ビルド環境によってビルドエラーになる**
Android端末向けにビルドしようとしたら
`error CS0234: The type or namespace name 'EditorApplication' does not exist in the namespace 'UnityEditor' (are you missing an assembly reference?)`
というエラーが発生しました。
`EditorApplication`はUnity Editor環境でのみ使用できるようなので、コンパイルオプションで切っておく必要があります。

最終的にはこんな感じで携帯端末かどうか判断できるようにしました。

```
// 動作プラットフォーム判断
public class PlatformInfo
{
    static readonly bool isAndroid = Application.platform == RuntimePlatform.Android;
    static readonly bool isIOS = Application.platform == RuntimePlatform.IPhonePlayer;

    public static bool IsMobile() {
        // AndroidかiOSか、あるいはUnity RemoteだったらMobile扱いとする
    #if UNITY_EDITOR
        bool ret = UnityEditor.EditorApplication.isRemoteConnected;
    #else
        bool ret = isAndroid || isIOS;
    #endif
        return ret;
    }

}
```

以上です。