toio SDK for Unity ~Standard IDでIKZO~


toio SDK for Unity ~StandardでIKZO~

toio SDK for Unity が公開されて早数ヶ月、触る触ると言いながら実際あまり触れていない状況だったりします。さて、今回は定番中の定番である、Standard IDを公式のサンプルを見ながら進める甘口編です。

お品書きはこんな感じ。
- toio SDK for Unityの環境設定
- Standard IDの使い方のしらべ
- 出来たもの

toio SDK for Unity の環境設定

toio SDK for Unityの環境設定はかなり丁寧に解説されています、心折れない。
ただバージョンだけは合わせた方が良いのでしっかりその通りに仕掛けよう!
環境設定についてはこちら
SDKバージョン(2020.11.30時点)
toio SDK for Unity ver.1.0.2
推奨バージョン(2020.11.30時点)
iOS端末(iOS ver.12以上)
Unity(2019.4 LTS)

ちなみにMacの人は若干楽だったりします。下記の順番で進めていきます。
事前準備
インストールとサンプルの実行
チュートリアル等

はじめにこれは理解しておかないとダメなものがいくつかあります。
シミュレータの操作方法
それぞれのPrefabの内容や構成図、やったらアカンことも書かれています。マットは「トイコレ付属マット」や「開発用マット」なども細かく選択できて、このシュミレータが以下に細部まで作られていてすごいのかを理解します。

スクリプトの依存関係
初心者からすると何のことかさっぱりなアセンブリ定義についてが書かれています。
忙しい人は下記を意識すればOkです。

そのため、toio-sdk/Scripts にソースコードを置いてしまうと、ユーザースクリプトを参照出来ずにコンパイルエラーになる場合があります。

このような不具合を未然に防ぐために、Assets フォルダの下に開発用フォルダを作成して、そのフォルダ内に新しいファイルを追加していく事をオススメします。

絶対にtoio-sdk/Scriptsには置いてはいけません。大事な事なので(仕様変わるかもしれませんけど。)

シーン作成

基礎環境を構築するアレコレが書かれています。こちらを進めていけば開発の準備はOKです!

Standard IDの使い方のしらべ

さて本題のStandard IDについてです。
toio™コア キューブ 技術仕様2.2.0にある通り色々なマットや各種カード・シートの情報を読取る事が出来ます。

ちなみにサンプルはこちらから参照可能です(Webで実行されます)
toio_idのサンプル

※6. toio IDの読み取り(Position ID & Standard ID)より転載

手元にあるマットを用意して見ましょう!
Assets/toio-sdk/Tutorials/1.Basic/4.toioID/

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using toio;

namespace toio.tutorial
{
    public class toioIDScene : MonoBehaviour
    {
        float intervalTime = 0.1f;
        float elapsedTime = 0;
        Cube cube;
        bool started = false;

        async void Start()
        {
            var peripheral = await new NearestScanner().Scan();
            cube = await new CubeConnecter().Connect(peripheral);
            started = true;
        }

        void Update()
        {
            if (!started) return;

            elapsedTime += Time.deltaTime;

            if (intervalTime < elapsedTime) // 0.1秒ごとに実行
            {
                elapsedTime = 0.0f;

                // 手法A: y 座標で発光の強度を決める
                var strength = (510 - cube.y)/2;
                // 手法B: x 座標で発光の強度を決める
                // var strength = (510 - cube.x)/2;
                // 手法C: pos と中央の距離で発光の強度を決める
                // var strength = (int)(255 - (cube.pos-new Vector2(255,255)).magnitude);

                // Standard ID によって発光の色を決める (初期値は0)
                if (cube.standardId == 3670337) // Simple Card "A"
                    cube.TurnLedOn(strength, 0, 0, 0);
                else if (cube.standardId == 3670080) // toio collection skunk yellow
                    cube.TurnLedOn(0, strength, 0, 0);
                else if (cube.standardId == 3670016) // toio collection card typhoon
                    cube.TurnLedOn(0, 0, strength, 0);
                else cube.TurnLedOff();
            }
        }
    }
}

出来たもの

今回は色を変えるだけじゃなく音を鳴らしてみましょう。音といえば音楽。音楽といえば演歌、演歌と言えばIKZOです(大分飛んだ)怪しいライセンスのIKZOを今回は使用します。
ニコニコモンズ~IKZO~

Unityで音を鳴らすのはいくつか方法がありますが今回はあまり複雑でない方法で行きます。
AudioSourceコンポーネントをつけ、Audio Clipを再生する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using toio;

namespace toio.tutorial
{
    public class IKZOsample : MonoBehaviour
    {
        public AudioClip sound1;
        public AudioClip sound2;
        public AudioClip sound3;
        public AudioClip sound4;
        public AudioClip sound5;
        AudioSource audioSource;
        float intervalTime = 3.0f; //ここは少し長めに3秒へ。0.1だと非常にダメ幾三
        float elapsedTime = 0;
        Cube cube;
        bool started = false;
        async void Start()
        {
            audioSource = GetComponent<AudioSource>();
            var peripheral = await new NearestScanner().Scan();
            cube = await new CubeConnecter().Connect(peripheral);
            started = true;
        }

        void Update()
        {
            if (!started) return;

                elapsedTime += Time.deltaTime;

            if (intervalTime < elapsedTime) // 
            {
                elapsedTime = 0.0f;
                if (cube.standardId == 3670320) // 開発者用マット "0"
                    audioSource.PlayOneShot(sound1);
                   else if (cube.standardId == 3670321)  // 開発者用マット "1"
                    audioSource.PlayOneShot(sound2);
                   else if (cube.standardId == 3670322)  // 開発者用マット "2"
                    audioSource.PlayOneShot(sound3);
                   else if (cube.standardId == 3670323) // 開発者用マット "3"
                    audioSource.PlayOneShot(sound4);
                   else if (cube.standardId == 3670324) // 開発者用マット "4"
                    audioSource.PlayOneShot(sound5);
                   else if (cube.standardId == 3670325) // 開発者用マット "5"
                    audioSource.Stop();
            }
        }
    }
}

出来たものいざ。

今日が良い一日になりますように…