toio SDK for Unityでシミュレータ接続のままアプリビルドする

# 概要
[toio SDK for Unity](https://github.com/morikatron/toio-sdk-for-unity/) v1.3で、なんとMacのUnity Editorから直接リアルのtoioコアキューブに接続できるようになりました！ :tada:

https://toio.io/blog/detail/20210729-1.html

これ自体も素晴らしい機能なのですが、実はこれのうれしい副作用として、逆に、ビルドしたアプリからシミュレータのキューブに接続することが簡単にできるようになっています。
これによって、toioコアキューブを持っていない方にも、どんなアプリなのか試してもらえるというメリットがあります。
以下、やり方をまとめます。

# 対応方法
コアキューブに接続するためのクラス（CubeManagerなど）のコンストラクタで引数のConnectType.(Auto|Simulator|Real)を切り替えるだけで、接続先を変えてくれます。
https://github.com/morikatron/toio-sdk-for-unity/blob/main/docs/usage_cube.md#4-cube%E3%81%AE%E6%8E%A5%E7%B6%9A%E8%A8%AD%E5%AE%9A

> - 基本設定(ConnectType.Auto)の場合はビルド対象に応じて内部実装が自動的に変わります。 **＝従来動作**
- シミュレータ設定(ConnectType.Simulator)の場合はビルド対象に関わらずシミュレータのキューブが動作します。
- リアル設定(ConnectType.Real)の場合はビルド対象に関わらずリアルのキューブが動作します。

## 参考：v1.3より前の方法
以前はSDK内のマクロで切り分けている箇所に手を入れる必要がありました :sweat_smile: 

https://mu-777.hatenablog.com/entry/2021/01/31/154532

# シミュレータのキューブの操作方法
https://github.com/morikatron/toio-sdk-for-unity/blob/main/docs/development_simulator.md#cube-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E6%93%8D%E4%BD%9C
キューブを持ち上げる必要があるアプリの場合、右クリックが要求されるので、AndroidやiOSではその辺考慮する必要があります。WebGL推奨ってことになりそうです。

# Tips
## GUIで設定変更する
ビルド設定としてInspectorから変更できるようにしておくと、切り替えが簡単にできて便利です。

```ToioSdkConfig.cs
using UnityEngine;
using toio;

[CreateAssetMenu]
public class ToioSdkConfig : ScriptableObject
{
    private static ToioSdkConfig instance;

    public ConnectType ConnectType;

    public bool IsSimulator => ActualConnectType == ConnectType.Simulator;

    private ConnectType ActualConnectType => ConnectType == ConnectType.Auto
        ? CubeScanner.actualTypeOfAuto
        : ConnectType;

    public static ToioSdkConfig Instance
    {
        get
        {
            if (instance == null)
            {
                instance = Resources.Load<ToioSdkConfig>("ScriptableObjects/ToioSdkConfig");
            }

            return instance;
        }
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191129/21f1aa90-dcad-6307-7a09-90618d57024e.png)

```cs
// コンストラクタ引数に使う
var cubeManager = new CubeManager(ToioSdkConfig.Instance.ConnectType);
```

## 衝突、ダブルタップなどを発生させる
UnityEditor上ではInspectorからCubeSimulatorのinternalなmethodを呼び出す形で操作することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191129/181e37a8-d75d-d6c3-9132-13507115e07f.png)

が、ビルドしたアプリではこれを触ることができません。
そのため、InspectorのGUIが呼び出しているのと同じmethodを、Reflectionで呼び出すボタンを配置します。

```ToioCubeSimulatorCollisionButton.cs
using System.Reflection;
using toio.Simulator;
using UnityEngine;
using UnityEngine.UI;

public class CubeSimulatorCollisionButton : MonoBehaviour
{
    [SerializeField] private CubeSimulator cubeSimulator;
    [SerializeField] private Button button;

    private void Start()
    {
        button.onClick.AddListener(() =>
        {
            var method = cubeSimulator.GetType().GetMethod("_TriggerCollision",
                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            if (method != null)
            {
                method.Invoke(cubeSimulator, null);
            }
        });
    }
}
```

# おわりに
## 開発中のゲームのシミュレータ接続ビルド
toioコアキューブお持ちでない方もぜひお試しください。
シミュレータ画面をワイプ表示している部分については、また別で記事書きます。

https://twitter.com/zurachu/status/1422206243901370370

## 通常のリアルtoioコアキューブ接続ビルド
遊ぶには、最近のtoio購入でついてくるor[スイッチサイエンスさんで購入する](https://www.switch-science.com/catalog/6650/)簡易プレイマットも必要です。

https://twitter.com/zurachu/status/1362744934382465030

## プレイ動画

https://youtu.be/O7bDxfnBNYo