toio 入門 (2) - キューブの操作
見出し画像

toio 入門 (2) - キューブの操作

npaka

「toio SDK for Unity v1.4.0」をベースに、toioキューブを操作する方法をまとめました。

・Unity 2020.3
・toio SDK for Unity v1.4.0

前回

1. キューブの操作

toio 入門 (1) - 事始め」のキューブを回転させるコードを、キューブのキー操作とXY座標表示を行うコードに変更します。

(1) Hierarchyウィンドウで「RotateCube」を削除。
(2) Hierarchyウィンドウの「+ → UI → Text」で「Text」を追加し、「Label」という名前を指定。
白文字で左上に配置して、初期値「(0, 0)」にしています。

(3) Hierarchyウィンドウで、「+ → Create → Empty Object」で空のオブジェクトを生成し、「ControlCube」という名前を指定。
(4) Hierarchyウィンドウで「ControlCube」を選択し、Inspectorウィンドウで「ControlCube」を追加し、以下のように編集。

・ControlCube.cs

using UnityEngine;
using UnityEngine.UI;
using toio;

// キューブの操作
public class ControlCube : MonoBehaviour
{
    public ConnectType connectType; // 接続種別
    public Text label; // ラベル

    CubeManager cm; // キューブマネージャ

    // スタート時に呼ばれる
    async void Start()
    {
        // キューブの接続
        cm = new CubeManager(connectType);
        await cm.MultiConnect(1);
    }

    // フレーム毎に呼ばれる
    void Update()
    {
        // キューブのキー操作
        foreach (var cube in cm.syncCubes)
        {
            if (Input.GetKey(KeyCode.LeftArrow)) {
                cube.Move(-20, 20, 50);
            } else if (Input.GetKey(KeyCode.RightArrow)) {
                cube.Move(20, -20, 50);
            } else if (Input.GetKey(KeyCode.UpArrow)) {
                cube.Move(50, 50, 50);
            } else if (Input.GetKey(KeyCode.DownArrow)) {
                cube.Move(-50, -50, 50);
            }
        }

        // キューブのXY座標表示
        string text = "";
        foreach (var cube in cm.syncCubes)
        {
            text += "(" + cube.x + "," + cube.y + ")\n";
        }
        if (text != "") this.label.text = text;
    }
}

(5) Hierarchyウィンドウで「ControlCube」を選択し、Hierarchyウィンドウの「Label」を「ControlCube」の「Label」にドラッグ&ドロップ。

(7) Playボタンで実行。
上下左右キーでキューブを操作できます。左上にXY座標が表示されます。

2. CubeManagerクラス

キューブの接続と、操作対象となるキューブの取得は、「CobeManagerクラス」で行います。

◎ キューブの接続
キューブの接続を行うには、CobeManagerクラスのMultiConnect()を使います。引数には、接続するキューブの台数を指定します。

// キューブの接続
cm = new CubeManager(connectType);
await cm.MultiConnect(1);

◎ キューブの操作と情報取得
キューブの操作と情報取得するには、以下のプロパティでCube群、またはCubeHandle群を取得します。

・cm.cubes : 非同期にCube群を取得。
・cm.syncCubes : 同期にCube群を取得。
・cm.handles  : 非同期にCubeHandle群を取得。
・cm.syncHandles : 同期にCubeHandle群を取得。

Cubeは左右モーター速度でキューブを操作する基本API、CubeHandleは前進量と回転量などでキューブを操作する高レベルAPIです。

キューブには操作可能なタイミングと不可能なタイミングがあり、syncXXXは操作可能なタイミングでのみオブジェクト群を返します。

foreach (var cube in cm.cubes)
{
    <キューブの情報取得>
}
foreach (var cube in cm.syncCubes)
{
    <キューブの情報取得 or キューブの操作>
}
foreach (var handle in cm.handles)
{
    <キューブの情報取得>
}
foreach (var handle in cm.syncHandles)
{
    <キューブの情報取得 or キューブの操作>
}

3. Cubeクラス

「Cubeクラス」は、左右モーター速度でキューブを操作する基本APIです。

◎ キューブの操作
キューブの操作は、以下のメソッドを使います。

・cube.MoveRaw()
左右モーター速度によるキューブの操作を行います。

cube.Move(int left, int right, int durationMs=1000,
ORDER_TYPE order=ORDER_TYPE.Weak)

・left : 左モーター速度 (0 ~ 115)
・right : 右モーター速度 (0 ~ 115)
・durationMs : 持続時間 (ms)
・order : 優先度 (ORDER_TYPE.Week, ORDER_TYPE.Strong)

◎ キューブの情報取得
キューブの情報取得は、以下のプロパティを使います。

・int x : プレイマット上のX座標
・int y : プレイマット上のY座標
・int angle : プレイマット上の角度

4. CubeHandleクラス

「CubeHandleクラス」は、前進量と回転量などでキューブを操作する高レベルAPIです。

◎ キューブの操作
キューブの操作は、以下のメソッドを使います。

・handle.MoveRaw()
左右モーター速度によるキューブの操作を行います。cube.Move()と同等のメソッドになります。

handle.MoveRaw(int left, int right, int durationMs=1000, 
    ORDER_TYPE order=ORDER_TYPE.Weak)
・left : 左モーター速度 (0 ~ 115)
・right : 右モーター速度 (0 ~ 115)
・durationMs : 持続時間 (ms)
・order : 優先度 (Week, Strong)

・handle.Move()
前進量と回転量によるキューブの操作を行います。

handle.Move(double translate, double rotate, int durationMs = 1000,
    bool border = true, Cube.ORDER_TYPE order = Cube.ORDER_TYPE.Weak)
・translate : 前進量 (-115+Abs(rotate)/2 ~ 115-Abs(rotate)/2)
・rotate : 回転量 (-115+Abs(rotate)/2 ~ 115-Abs(rotate)/2)
・durationMs : 持続時間 (ms)
・border = true : ボーダー制限の有効・無効
・order : 優先度 (Week, Strong)
・戻り値 : Movement

他にも、以下のようなメソッドを提供しています。

・handle.Move2Target() : 目標座標によるキューブの移動。
・handle.Rotate2Target() : 目標座標によるキューブの移動。
・handle.Rotate2Deg() : 目標絶対角度(度)によるキューブの回転。
・handle.Rotate2Rad() : 目標絶対角度(ラジアン)によるキューブの回転。

◎ キューブ情報の取得
キューブ情報の取得は、以下のプロパティを使います。

・double x : プレイマット上のX座標
・double y : プレイマット上のY座標
・double rad : プレイマット上の角度 (ラジアン)
・double deg : プレイマット上の角度 (度)

5. マットの座標

キューブのXY座標はマットに印刷されている座標になります。
「簡易プレイマット」の場合は、左上が(98,142)、右下が(402,358)になります。

他のマットについては、以下で確認できます。

6. 複数のキューブの操作

複数のキューブを操作する手順は、次のとおりです。

(1) Hierarchyウィンドウに配置するCube数を増す。

(2) CubeManagerクラスのMultiConnect()の引数にそのCube数を指定。

        // キューブの接続
        cm = new CubeManager(connectType);
        await cm.MultiConnect(3);

(3) 実行。
3台を同時にキーで操作できます。

【おまけ】 toio SDK for UnityのAPIリファレンス

「toio SDK for Unity」のAPIリファレンスは、次のとおりです。

Cubeクラス
CubeHandleクラス
Navigatorクラス
CubeSimulatorクラス

プレイマットの仕様は、以下で確認できます。

公式のプレイマットの仕様
開発用プレイマットの仕様

次回



この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
npaka
プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / Jetson / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン/カラオケ / ギター twitter : @npaka123