Skip to the content.

技術ドキュメント - 使い方 - シミュレータ

目次

1. 概説

Simulator は、toio™コア キューブ (以降、キューブ) と通信するスマートデバイスのアプリを開発していく際、Unity Editor 上で手軽に動作チェックができるように作られたテスト用の仮想環境です。

Simulator は Assets/toio-sdk/Scripts/Simulator/Prefabs/ の下にある、以下の 4 つの prefab から構成されています。

Simulator に実装されたクラスは全て toio.Simulator 名前空間に属しています。

2. Mat Prefab

Mat Prefab は各種プレイマットを模したゲームオブジェクトです。

Cube Prefab は Mat Prefab に置くと、 Mat の座標位置と方向を取得することが出来ます。

Mat Prefab はシーンの中に複数枚、水平であれば位置と角度任意で置けます。

2.1. インスペクター

Mat タイプ

Unity のインスペクターで、スクリプト Mat.cs の「タイプ」リストに、

のいずれかを選択すると、マットの見た目と座標を変えられます。

Unity Editor 上での表記 正式名称
トイコレ付属マット(土俵面) トイオ・コレクション付属のプレイマット(土俵の面)
トイコレ付属マット(色タイル面) トイオ・コレクション付属のプレイマット(色付きタイルの面)
簡易マット toio™コア キューブ(単体)付属の簡易プレイマット
開発用マット toio™開発用プレイマット(仮称)
ゲズンロイド 工作生物 ゲズンロイド付属のプレイマット

※ toio™開発用プレイマット(仮称)#1 ~ #6 の表面は、toio™コア キューブ(単体)付属の簡易プレイマットと同じ仕様なので、一つのタイプ「簡易マット・開発用マット(表面)1~6」にまとめています。

各タイプの仕様は、toio™コア キューブ 技術仕様『開発者向けマット(仮称)』 を参考にしてください。

カスタマイズ

「タイプ」が「カスタマイズ」に設定された場合、以下のようにマット座標の範囲を自分で設定することが可能です。 マットの(Unityにおいての)サイズはこの範囲によって換算され、自動的に設定されます。

MatAssetLoader コンポネントで、マットのテクスチャ(画像)を変更することも可能です。(ただし「カスタム」以外のものを変更することはおすすめしません。) 「カスタム」の画像変更は以下のように行います。

  1. 画像ファイルをプロジェクトにインポートする
  2. 対象の画像の「インスペクター」上で「テキスチャタイプ」を「スプライト(2DとUI)」に設定し、「適用する」ボタンをクリックする
  1. Mat Prefabの「カスタム」の画像対象一覧に上記の画像が表示されるようになるため、選択する

(「カスタム」に画像が設定されていない場合は、空白のマットが表示されます。)

2.2. 定数

// マット単位とメートルの比例
public static readonly float DotPerM = 411f/0.560f; // (410+1)/0.560 dot/m

2.3. 列挙型

MatType

マットのタイプ

toio_collection_front = 0,  // トイコレ付属マット(土俵面)
toio_collection_back = 1,   // トイコレ付属マット(色タイル面)
simple_playmat = 2,         // キューブ(単体)付属簡易マット
developer = 3,              // 開発用マット
gesundroid = 4,             // ゲズンロイド
custom = 5                  // 座標範囲をカスタマイズ

DeveloperMatType

開発用マットの番号

_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12

2.4. メソッド

GetRectForMatType

public static RectInt GetRectForMatType(MatType matType, DeveloperMatType devMatType=default);

指定タイプのマットの座標範囲を持つ RectInt を取得します。

UnityDeg2MatDeg

public int UnityDeg2MatDeg(double deg);

Unity 上の角度を本マット上の角度に変換します。

MatDeg2UnityDeg

public float MatDeg2UnityDeg(double deg);

本マット上の角度を Unity 上の角度に変換します。

UnityCoord2MatCoord

public Vector2Int UnityCoord2MatCoord(Vector3 unityCoord);

Unity の 3D 空間座標から、本マットにおけるマット座標に変換します。

MatCoord2UnityCoord

public Vector3 MatCoord2UnityCoord(double x, double y);

本マットにおけるマット座標から、Unity の 3D 空間座標に変換します。

3. StandardID Prefab

StandardID Prefab は Standard ID を読み取れる各種のカード・シートを模したゲームオブジェクトです。

Cube Prefab を StandardID Prefab の上に載せると、Standard ID と方向を取得することが出来ます。

StandardID Prefab はシーンの中に複数枚、位置と角度任意で置けます。

3.1. インスペクター

StandardID タイプ

Unity のインスペクターで、スクリプト Mat.cs の「タイトル」を選択してから、特定の「タイプ」のカード・シートを選択して、StandardID を切り替えることが出来ます。

対応できる「タイトル」は以下になります。

「タイプ」については、toio™コア キューブ 技術仕様を参照してください。

3.2. メソッド

UnityDeg2MatDeg

public int UnityDeg2MatDeg(double deg);

Unity 上の角度を本 StandardID 上の角度に変換します。

MatDeg2UnityDeg

public float MatDeg2UnityDeg(double deg);

本 StandardID 上の角度を Unity 上の角度に変換します。

4. Cube Prefab

Cube Prefab は toio™コア キューブ を模したゲームオブジェクトです。

Cube Prefab は二つのスクリプトを持っています。

実際のキューブとは一部機能差があります。
詳細については、機能の対応状況をご確認下さい。

Cube Prefab はシーンの中に複数台配置することが出来ます。 ( Cube Prefab が他のオブジェクトと重ならないように配置してください。)

4.1. CubeSimulator のインスペクター

【シミュレータの設定】と【手動でキューブの状態を変更】との二つの部分に分けられています。

シミュレータの設定(非実行時)

シミュレータの情報(実行時)

手動でキューブの状態を変更(実行時)

接続された状態のみに表示されます。

シミュレータ上でリアルに再現するのが難しい、或いは操作しにくい場合、インスペクターでキューブの状態を変更し、対応イベントを起こすことが出来ます。

4.2. CubeSimulator の定数

// 左右タイヤの間隔(メートル)
public static readonly float TireWidthM = 0.0266f;
// 左右タイヤの間隔(ドット(マット座標))
public static readonly float TireWidthDot= 0.0266f * Mat.DotPerM;
// キューブのサイズ
public static readonly float WidthM= 0.0318f;
// 速度(ドット毎秒)と指示値の比例
public static readonly float VDotOverU =  4.3f*Mathf.PI*0.0125f/60 * Mat.DotPerM; // about 2.06

4.3. CubeSimulator のプロパティ

public bool power { get; set; }                 // 電源
public bool isRunning { get; private set; }     // 稼働中か否か
public int maxMotor { get; }                    // モーター指令最大値
public int deadzone { get; }                    // モーター指令デッドゾーン
public int x { get; internal set; }             // マット上のx座標
public int y { get; internal set; }             // マット上のy座標
public int deg { get; internal set; }           // マット上の角度(度)
public int xSensor { get; internal set; }       // 読み取りセンサーのマット上のx座標
public int ySensor { get; internal set; }       // 読み取りセンサーのマット上のy座標
public uint standardID { get; internal set; }   // 読み取った Standard ID
public bool onMat { get; internal set; }        // Mat 上にあるか
public bool onStandardID { get; internal set; }   // StandardID 上にあるか
public bool isGrounded { get {return onMat || onStandardID; } } // Mat 又は StandardID 上にあるか
public bool button { get; internal set; }       // ボタン
public bool sloped { get; internal set; }       // 傾斜状態
// 2.1.0
public Cube.PoseType pose { get; internal set; } // 姿勢
// 2.2.0
public int shakeLevel { get; internal set; }    // シェイクされたか
public int leftMotorSpeed { get; internal set; }  // 左タイヤの速度
public int rightMotorSpeed { get; internal set; } // 右タイヤの速度
// 2.3.0
public Cube.MagnetState magnetState { get; internal set; } // 磁石の状態
public Vector3 magneticForce { get; internal set; }        // 磁場
public Vector3 eulers { get; internal set; }               // オイラー角
public Quaternion quaternion { get; internal set; }        // クォータニオン

4.4. CubeSimulator のメソッド

Cube クラスから利用するためのメソッドなので、エンドユーザーが直接使用する必要はありません。

4.5. Cube オブジェクトの操作 (CubeInteraction)

CubeInteraction クラスは、Unity の EventSystem をベースに、Cube オブジェクトを押したりつかんだりする操作を実装したクラスです。

使用方法

Stage Prefab を使う場合は、既に操作できるようになっていますのでスキップしてください。

Cube オブジェクトを左クリックで押す

Cube オブジェクトを左クリックすると、対象の Cube オブジェクトの底面のボタンを押すことができます。

マウスの左ボタンを押し続けている間、Cube オブジェクトの底面ボタンは押され続けます。

Cube オブジェクトを右クリックで持ち上げる/おろす

Cube オブジェクトを右クリックすることで対象の Cube オブジェクトをマットから持ち上げ、その状態で場所や角度を変えることが出来ます。

Cube オブジェクトを右ドラッグで引っ張る

対象の Cube オブジェクトを 右ドラッグ することで、Cube オブジェクトを引っ張って動かすことが出来ます。
右ドラッグを開始すると、マウスカーソルと Cube オブジェクトの間に黒いベクトルが表示され、そのベクトルに比例した力が Cube オブジェクトに加わります。

5. Stage Prefab

Stage Prefab は、

をセットにしたものです。

また、Stage Prefab は以下の 2 つの便利なツールを備えています。

視野がマットにフィットするカメラとライトを内包するため、新規にシーンを作成した場合は、シーンに既にあるカメラとライトを削除してから、Stage Prefab を追加するのをお勧めします。

※本 Prefab に実装された操作機能は、CubeInteraction に基づいてあります。

5.1. ターゲットポール

ターゲットポールは、 ピンク色の棒です。(設置する前には見えない状態にしています。)

Ctrl キーを押したままに、任意のオブジェクトにマウスの右ボタンを押すことで、ターゲットポールを設置することができます。
オブジェクトの無い所に同じ操作を行うと、ターゲットポールが消えます。

開発者はターゲットポールの位置を取得してキューブの制御に利用することが出来ます。

public bool targetPoleActive { get; }      // ターゲットポールが設置されたか?
public Vector2Int targetPoleCoord { get; } // ターゲットポールのマット座標を取得

ターゲットポールを使ってキューブを操作する具体的な方法については チュートリアル で紹介しています。

5.2. キューブをフォーカス

Ctrl キーを押したままに、キューブを左クリックすると、フォーカスされます。
キューブ以外に同じ操作を行うと、フォーカスが外されます。

フォーカスの対象を取得することで、特定のキューブの操作やデバッグが容易になります。

プロパティ

// フォーカス対象の名前(Unityヒエラルキーでの名前)
public string focusName { get; }

SetFocus

public void SetFocus(Transform transform);

手動でフォーカス対象を設定します。

SetNoFocus

public void SetNoFocus();

フォーカスをキャンセルします。


6. Magnet Prefab

Magnet Prefab は仕様書に規定された標準の磁石を模したゲームオブジェクトです。

Magnet Prefab を Cube Prefab の付近に置くことで、磁気センサーをリアルのように作動させることが出来ます。

6.1. インスペクターでのパラメーター

Magnet Prefab 自身(一番上の親オブジェクト)には磁荷が定義されておらず、複数の子オブジェクトに Magnet.cs がアタッチされ磁荷が定義されています。それらの磁荷によって、四角い磁石の磁場が擬似されています。

6.2. メソッド

GetSelfH

public Vector3 GetSelfH(Vector3 pos);

定義された磁荷が指定位置に生成した磁場ベクトルを計算します。 自オブジェクトとの距離が Max Distance より大きい場合、直接に 0 を戻します。

SumUpH

public Vector3 SumUpH(Vector3 pos);

自オブジェクト及び子オブジェクトに含まれるすべての磁荷が指定位置に生成した合成磁場ベクトルを計算します。 自オブジェクトとの距離が Max Distance より大きい場合、直接に 0 を戻します。

6.3. 磁石を自作

以下の手順で Magnet Prefab を自作できます。