ゲーミングtoio - toio SDK for UnityでLEDを操る


概要

toio SDK for UnityでLEDを操ります。フルカラーLEDといえばレインボー(ゲーミングPC風)

GitHub repository

WebGL sample

toioキューブが必要です。
https://zurachu.github.io/toio-rainbow-led/

動画(Twitter)

技術情報

UnityEngine.Colorをtoioランプ制御で使うカラー値に変換するUtility

前回のかるたでもそうでしたが、キューブの接続順(どのキューブがプレイヤー1か?2か?)を認識するために画面表示とLEDの色を合わせるのは、良くある手な気がします。

ToioLedUtility.cs
using UnityEngine;
using toio;

public static class ToioLedUtility
{
    public static void TurnLedOn(Cube cube, Color color, int durationMs, Cube.ORDER_TYPE order = Cube.ORDER_TYPE.Strong)
    {
        cube.TurnLedOn(ColorByteValue(color.r), ColorByteValue(color.g), ColorByteValue(color.b), durationMs, order);
    }

    public static Cube.LightOperation LightOperationOf(Color color, int durationMs)
    {
        return new Cube.LightOperation(durationMs, ColorByteValue(color.r), ColorByteValue(color.g), ColorByteValue(color.b));
    }

    public static byte ColorByteValue(float value)
    {
        return (byte)Mathf.Clamp(value * 255, 0, 255);
    }
}

レインボーグラデーション

#ff0000#ffff00#00ff00#00ffff#0000ff#ff00ff#ff0000のグラデーションするUnityEngine.Color配列を作ってから、先ほどのCube.LightOperationに変換して、キューブに送信します。
Cube.TurnOnLightWithScenarioに一度に送れるLightOperationの上限が29
https://toio.github.io/toio-spec/docs/ble_light#operation-%E3%81%AE%E6%95%B0
なので、4<(29÷6)<5より、1色のグラデーションを4段階かけて行います。

SampleScene.cs
    public async void OnClickConnect()
    {
        var cube = await cubeManager.SingleConnect();
        if (cube == null)
        {
            return;
        }

        var colors = new List<Color>();
        colors.AddRange(Gradation(Color.red, Color.yellow, 4));
        colors.AddRange(Gradation(Color.yellow, Color.green, 4));
        colors.AddRange(Gradation(Color.green, Color.cyan, 4));
        colors.AddRange(Gradation(Color.cyan, Color.blue, 4));
        colors.AddRange(Gradation(Color.blue, Color.magenta, 4));
        colors.AddRange(Gradation(Color.magenta, Color.red, 4));

        cube.TurnOnLightWithScenario(0, colors.ConvertAll(_color => ToioLedUtility.LightOperationOf(_color, 100)).ToArray());
    }

    private List<Color> Gradation(Color fromColor, Color toColor, int division)
    {
        var colors = new List<Color>();
        for (var i = 0; i < division; i++)
        {
            colors.Add(Color.Lerp(fromColor, toColor, (float)i / division));
        }

        return colors;
    }