目的
本記事は私が学んだことについての備忘録です。
toio sdk for unityを使用してtoioの開発を行いました。
開発環境にUnityを使用して開発を行うため、開発言語はC#になります。
これまでJavaやkotlinをメインに業務を行ってきたことと、
Unityでの開発経験がなかったため、不慣れなところが多くありました。
今回は私が開発を行うにあたり苦労した点、引っかかった点をまとめていきます。
C#と共通している点
using
プログラム内で用いるネームスペースを宣言する際に使用します。
javaでいうところのimport文と同様の役割になります。
using toio;
using UnityEngine;
using System;
public class Hoge {
// any code
}
変数の型
C#とjavaの違いとしては、論理型の書き方はC#では「bool」となります。
文字列型は「String」もしくは「string」と書きます。
また、C#にはkotlinのようにnullを許容するnullable型があり「int?」や「bool?」のように記述します。
var型の記述も可能です。
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でのデバッグログの出力方法は異なります。
それぞれ以下のようになります。
public class Hoge {
int value = 15;
// 一般的なC#のデバッグログの出力方法
Console.WriteLine($"DEBUG: value = {value}");
}
public class HogeUnity : MonoBehaviour {
int value = 15;
// 一般的なUnityのデバッグログの出力方法
Debug.Log($"DEBUG: value = {value}");
}
コルーチンについて
C#とUnityではコルーチンの開始についても差があります。
Unityで使用しているコルーチン開始処理はメインスレッドで動作するため、
重い処理を記載してしまうとメインスレッドを拘束してしまいます。
そのためUnityで非同期I/O処理などを行う際はC#標準の非同期処理機能を用いる必要があります。
UnityでC#標準の非同期処理機能を用いる場合は、
その処理の中でUnityオブジェクトに触れないよう注意
public class Hoge {
// C#のコルーチン開始処理
await start();
public async Task start()
{
Console.WriteLine("Start");
await Task.Delay(1000); // 1秒待機
Console.WriteLine("End");
}
}
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つに分岐させることが可能です。
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
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が返ります。
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実機か切り替える |
public class HogeUnity : MonoBehaviour {
// Unityのインスペクターから設定値を取得する方法
// 以下の書き方をするとUnityのインスペクターで設定した値を取得することが可能
public ConnectType connectType;
CubeManager cm;
async void Start()
{
// Unityのインスペクターから取得した値を設定
cm = new CubeManager(connectType);
}
}
public class HogeUnity : MonoBehaviour {
// コード上からタイプを直接指定して設定する方法
CubeManager cm;
async void Start()
{
// コード上からConnectType.Realを直接指定して設定する
cm = new CubeManager(ConnectType.Real);
}
}
Move
toioのモーターを制御するcubeクラスのメソッドです。
両輪のモーター速度を揃えれば直進、片側のモーター速度を落とせば落としたモーター側にカーブしながら進みます。速度をマイナスにするとバックも可能です。
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);
}
}
}
参考サイト
・MiniJsonとJsonNodeを使用したJsonへのアクセスについて その1