28
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

toio sdk for unityで開発して学んだこと

Last updated at Posted at 2025-12-10

目的

本記事は私が学んだことについての備忘録です。
toio sdk for unityを使用してtoioの開発を行いました。
開発環境にUnityを使用して開発を行うため、開発言語はC#になります。
これまでJavaやkotlinをメインに業務を行ってきたことと、
Unityでの開発経験がなかったため、不慣れなところが多くありました。
今回は私が開発を行うにあたり苦労した点、引っかかった点をまとめていきます。

C#と共通している点

using

プログラム内で用いるネームスペースを宣言する際に使用します。
javaでいうところのimport文と同様の役割になります。

Hoge.cs
using toio;
using UnityEngine;
using System;

public class Hoge {
    // any code
}

変数の型

C#とjavaの違いとしては、論理型の書き方はC#では「bool」となります。
文字列型は「String」もしくは「string」と書きます。
また、C#にはkotlinのようにnullを許容するnullable型があり「int?」や「bool?」のように記述します。
var型の記述も可能です。

Hoge.cs
public class Hoge {
    bool flag = false;
    string text = "こんにちは";
    int? number = null;
    var people = new Dictionary<string, List<string>>
    {
        { "Japan", new List<string> { "Taro", "Hanako" } },
        { "USA", new List<string> { "John", "Emily" } }
    };
}

Unity独自の処理、C#と異なる点

デバッグログの出力

C#とUnityでのデバッグログの出力方法は異なります。
それぞれ以下のようになります。

Hoge.cs
public class Hoge {
    int value = 15;
    // 一般的なC#のデバッグログの出力方法
    Console.WriteLine($"DEBUG: value = {value}");
}
HogeUnity.cs
public class HogeUnity : MonoBehaviour {
    int value = 15;
    // 一般的なUnityのデバッグログの出力方法
    Debug.Log($"DEBUG: value = {value}");
}

コルーチンについて

C#とUnityではコルーチンの開始についても差があります。
Unityで使用しているコルーチン開始処理はメインスレッドで動作するため、
重い処理を記載してしまうとメインスレッドを拘束してしまいます。
そのためUnityで非同期I/O処理などを行う際はC#標準の非同期処理機能を用いる必要があります。

UnityでC#標準の非同期処理機能を用いる場合は、
その処理の中でUnityオブジェクトに触れないよう注意

Hoge.cs
public class Hoge {
    // C#のコルーチン開始処理
    await start();

    public async Task start()
    {
        Console.WriteLine("Start");
        await Task.Delay(1000); // 1秒待機
        Console.WriteLine("End");
    }
}
HogeUnity.cs
public class HogeUnity : MonoBehaviour {
    // Unityのコルーチン開始処理
    StartCoroutine(start());

    IEnumerator start()
    {
        Debug.Log("Start");
        yield return new WaitForSeconds(1f); // 1秒待機
        Debug.Log("End");
    }
}

APIリクエストについて

UnityではC#で用いられる「HttpWebRequest」以外にも選択肢があります。
今回の開発では「UnityWebRequest」を使用して開発を行いました。

通信方法 概要
HttpWebRequest C#標準で提供されているAPI
WWW 古くからのUnityで提供されているAPI
UnityWebRequest Unity 5.4系より正式提供されているAPI
ネイティブプラグインを利用 通信処理を独自実装する

「UnityWebRequest」では大まかなエラー内容で結果を5つに分岐させることが可能です。

HogeUnity.cs
public class HogeUnity : MonoBehaviour {
    IEnumerator getApi() {
        string url = "<接続先のurlを記載する>";
        UnityWebRequest request = UnityWebRequest.Get(url);
        switch (request.result) {
            case UnityWebRequest.Result.InProgress:
                // リクエスト中であればこの分岐に入る
                break;

            case UnityWebRequest.Result.Success:
                // リクエストが成功していればこの分岐に入る
                break;

            case UnityWebRequest.Result.ConnectionError:
                // リクエストが接続できなかった場合や、
                // セキュリティで保護されたチャネルを確立できなかった場合などにこの分岐に入る
                break;

            case UnityWebRequest.Result.ProtocolError:
                // サーバがエラー応答を返した場合などにこの分岐に入る
                break;

            case UnityWebRequest.Result.DataProcessingError:
                // データの処理中にエラーが発生した場合などにこの分岐に入る
                break;

            default: throw new ArgumentOutOfRangeException();
        }
    }
}

UnityでのJsonの扱い方

今回の開発ではそこまで複雑なJsonを扱う予定がなかったことと、
手軽に開発を行いたかったためMiniJsonに加えてJsonNodeを用いた状態でJsonを扱いました。
(後々調べたところ今ではあまり用いられていない扱い方だった模様です...)
以下のファイルをAssets配下に置くだけで扱えるので導入も楽でした。
MiniJson.cs
JsonNode.cs

HogeUnity.cs
public class HogeUnity : MonoBehaviour {
    void JsonText()
    {
        // JsonNodeへ変換
        JsonNode json = JsonNode.Parse(jsonText);
        Debug.Log("json title:" + json["metadata"]["title"].Get<string>());
        Debug.Log("json content:" + json["results"][0]["content"].Get<string>());
    }
}

Unityオブジェクトへのアクセスの仕方

Unityオブジェクトを検索して取得するには「GameObject.Find()」を使用します。
検索対象が取得できなかった場合はnullが返ります。

HogeUnity.cs
public class HogeUnity : MonoBehaviour {
    async void Start()
    {
        // InfoTextというGameObjectをシーン内から検索して取得
        GameObject infoTextObj = GameObject.Find("InfoText");
    }
}

toio sdk for unity特有のもの

ConnectType

接続するtoioがシミュレーター上のものなのか実機なのかによって接続先を切り替えることができるため、
同一のソースコードでも使い分けることが可能になるものです。
Unityのインスペクターから変更したり、ソースコードに直接書き込むことで値の指定ができます。

設定値 接続先
Simulation シミュレータ
Real toio実機
Auto 実行環境によって自動的にシミュレータかtoio実機か切り替える
HogeUnity.cs
public class HogeUnity : MonoBehaviour {
    // Unityのインスペクターから設定値を取得する方法
    // 以下の書き方をするとUnityのインスペクターで設定した値を取得することが可能
    public ConnectType connectType;
    CubeManager cm;
    async void Start()
    {
        // Unityのインスペクターから取得した値を設定
        cm = new CubeManager(connectType);
    }
}
HogeUnity.cs
public class HogeUnity : MonoBehaviour {
    // コード上からタイプを直接指定して設定する方法
    CubeManager cm;
    async void Start()
    {
        // コード上からConnectType.Realを直接指定して設定する
        cm = new CubeManager(ConnectType.Real);
    }
}

Move

toioのモーターを制御するcubeクラスのメソッドです。
両輪のモーター速度を揃えれば直進、片側のモーター速度を落とせば落としたモーター側にカーブしながら進みます。速度をマイナスにするとバックも可能です。

HogeUnity.cs
public class HogeUnity : MonoBehaviour {
    CubeManager cm;
    async void Start() {
        cm = new CubeManager(ConnectType.Real);
        await cm.MultiConnect(1);
    }
    
    void Update()
    {
        foreach (var cube in cm.syncCubes) {
            // 引数:左モーター速度,右モーター速度,継続時間
            cube.Move(50, -50, 100);
        }
    }
}

参考サイト

usingについて

boolについて

デバッグログについて(Unity)

デバッグログについて(C#)

C#とUnityのコルーチンについて

APIリクエストについて

UnityWebRequestのエラー分岐について

MiniJsonとJsonNodeを使用したJsonへのアクセスについて その1

MiniJsonとJsonNodeを使用したJsonへのアクセスについて その2

Unityオブジェクトへのアクセスについて

ConnectTypeについて

Moveメソッドについて

28
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?