めーぷるのおもちゃばこ

- アイドルになりたいエンジニア女子の制作日記 -

【Unity】UnityでNFCのタグを読み取る

作ったもの

こちらの動画をみつけて、Unityでnfcタグを読み取れることを知り、興味を持ったので試してみました🐼

【DEMO】Unity + NFC Figure recognition



こちら作ったものです。とても簡単に見えるモックなのですが。


NFCタグをUnityで読み取る


 

箱の底にタグをいれておいて、少しわかりずらいですが水色の箱を置くと水色のプレゼントが出て、赤色の箱を置くと赤色のプレゼントが出てくるというものです。
簡単なのかと思いきやいろいろ手こずりました。やった方法をまとめておきます。

 

Unityで交通系ICカードを読み取る

 最終的に作ったのは市販のnfcタグ(下のほうにリンク貼ります)をUnityで読み取るものなんですが、いくら調べても出てこず、交通系ICカードの読み取りばっかりでてくるのでまずそちらを試してみることにしました。交通系ICカードもnfcなので、それ読み取れたらなんでもいけるやろ!という感じです。

 
交通系ICカードの読み取りは完全に以下のブログを丸っとコピペさせていただきました。一発でうまくいきました。PASUMO読み取れました、素晴らしい記事をありがとうございます。ここ重要なのですが、Windowsじゃないとできないみたいです。
marunouchi-tech.i-studio.co.jp


 

読み取りにはこちらのカードリーダーを購入しました!

ソニー SONY 非接触ICカードリーダー/ライター PaSoRi RC-S380

ソニー SONY 非接触ICカードリーダー/ライター PaSoRi RC-S380

  • 発売日: 2012/10/10
  • メディア: Personal Computers

 

市販のnfcタグを読み取る

タグの購入と種類について

PASUMOが読み取れたということで、続いては市販のタグです!

タグは以下のものを購入しました。
store.shopping.yahoo.co.jp



こちらでうまくいったのですが、ほかにもカード型や金属面おkのものなど、他のを買いたい人がいると思います。そこで一つ、私が失敗してしまった注意してほしい点があります。

nfcタグにはReader/Writer Mode(多分通信方式のこと?)が4種類あるようで、Type-1、Type-2、Type-3、Type-4と呼ばれるものがあります。

今回参考にさせていただいた丸の内テックブログさんのブログのものはType-3タグ(代表的なのはSuicaやPASUMOなど)を読み取るためのものだったので最初に何も知らずType-2のタグを購入してしまった私はそれに気づかず1週間くらい悩みました。

なので、タグを購入するときはそこだけ注意です。Type-3のタグです。


タグを通信可能にする

Type-3のタグを購入したら、そのままではまだ使えません。

そのままでUnityを実行してタグをリーダーに載せると、ピコピコピコピコン...みたいな音が鳴って読み込んでくれないです。

NFCタグにIDなどのデータを書き込む必要があります。

NFCタグにデータを書き込む方法は以下の記事にまとめたのでこちらを↓↓↓↓
www.wwwmaplesyrup-cs6.work


↑この時に初めてのPythonをしました。環境構築が大変だったりバージョンが2.7を使わないといけなかったりなどで死にました。

Python初めての人はここから↓
www.wwwmaplesyrup-cs6.work


タグごとに挙動を切り替える

これでUnityでもタグが読み込めるようになりました。
複数を使用してタグごとに挙動を切り替えたいです。
タグにはそれぞれ別々のIDがついているので、それを使用してタグごとに挙動を分けました。
タグのIDはPythonでタグに書き込んだ時にも出てくるのと、Unityだと参考にした丸の内テックブログさんのを丸っとコピペしていればリーダーにタグを置いた時にIDを見ることができます。
以下の写真でいうと、012E44.....となっているものがタグのIDです。

f:id:maplesyrup-cs6:20191209201546p:plain
タグの情報

タグのIDに番号をふって番号で挙動を変えるようにしました。

    using NfcPcSc;  //これを追加

    public Dictionary<string, int> tags = new Dictionary<string, int>
    {
        //ディクショナリーにタグのIDとValueを登録
        { "012E44A8814E4F5D", 1},
        { "012E44A83C08953D", 1},
        { "012E44A8814E3B50", 2},
        { "012E44A8814E4D93", 3},
    };
        
    public int TagNumber()
    {
        //ReadResultからタグのidを読み込む
        string id = ReadResult.cardId;

        if (!tags.ContainsKey(id))
        {
            return 1;
        }

        //呼ばれたIDのValueを返す
        return tags[id];
    }

    private void CheckReaderResult()
    {
        Debug.Log(ReadResult.readerSerialNumber);//リーダーの製造番号
        Debug.Log(ReadResult.cardId);//カードのID
        Debug.Log(ReadResult.cardBalance);//カードの残高
    }


これで1つの挙動に対して違うIDのタグを使うこともできます。
以上です。