🐸
ZigSimを使ってスマートフォンの側の開発をせずに傾きをUnityで取得する
スマートフォンってセンサーの塊っていうけど、実際あんまし使わないですよね
ZigSimとは
アプリ画面
左の画面で送信するセンサー値を選んで、真ん中の画面で実行、右はIPやPortの設定
スマートフォンのセンサー値を取得する方法
- Webブラウザで開発
- JavaScriptでWebsocketを使って送り、サーバ側で受け取って、Unityは値を取得しにいく
- もしくは、JavaScriptから直接Unityに送信する
- スマートフォン向けアプリを開発する
- KotlinとかSwiftとかで
- Flutterとかでクロスプラットフォームで
- むしろUnityでアプリ開発
ZigSimを使うよさみ
先程出したスマートフォン側の開発が一切いらないこと
やってみる
- スマートフォンにZigSimアプリのインストール
- Unityプロジェクト(今回試したバージョン:2019.4.18)作成
- Unity上でスクリプト作成し、後述のコードをコピペ
- GameObjectのCubeを作ってスクリプトを追加、Cubeをアタッチ
- Unity側のコードでポート番号(LOCA_LPORT)をZigSimアプリに合わせる(デフォルト50000番だから特に操作しなくてもよい)
- PCのIPアドレスを調べてZigSimアプリの設定から編集
- アプリでQuaternionにチェックし、スタート
- Unityエディター上でスタート
ソースコード
using UnityEngine;
using System.Net.Sockets;
using System.Net;
using System.Text;
public class UDPReceive : MonoBehaviour
{
[System.Serializable]
public class ZigSimData
{
public Sensordata sensordata;
public string timestamp;
}
[System.Serializable]
public class Sensordata
{
public Quaternion quaternion;
}
public GameObject cube;
public int LOCA_LPORT = 50000;
private UdpClient udp;
private readonly string testText = "{ \"device\": { \"name\": \"unknown device (iPhone10,1)\", \"displayheight\": 1334, \"uuid\": \"zbmjCQARSd9oFVJ8\", \"os\": \"ios\", \"osversion\": \"14.7.1\", \"displaywidth\": 750 }, \"timestamp\": \"2021_10_21_10:43:24.409\", \"sensordata\": { \"gyro\": { \"y\": -0.29756850004196167, \"x\": -0.014113557524979115, \"z\": -0.27333009243011475 }}}";
void Start()
{
udp = new UdpClient(LOCA_LPORT);
}
void Update()
{
IPEndPoint remoteEP = null;
byte[] data = udp.Receive(ref remoteEP);
string text = Encoding.ASCII.GetString(data);
//Debug.Log(text);
ZigSimData zigSimData = JsonUtility.FromJson<ZigSimData>(text);
Debug.Log(zigSimData.sensordata.quaternion);
cube.transform.rotation = zigSimData.sensordata.quaternion;
}
}
所感
すごく簡単だった
スマートフォン側のコードはJavaScriptとかでは一応簡単だと思うけども、まったく書かないってなるのは全然印象が違うと感じました!いい感じ!
似たようなアプリで tramontana というのもあるので要チェックやで
OscJack も気になる
Discussion