Unity WebGL x IoT ~スマートロックをつくったよ~ NCMB編


はじめに

 とある事情があり、スマートロックほしい。スマートロック超便利。作ろう。となったので作ったのですが。色々な罠を踏み抜いたのでそれを書いていきます。なお、大量に罠を踏み抜いた理由は以下のような変な構成にしたからです。(この構成にした理由は、上からの「早く作りなさい」という圧力と、私のスキル)

in Unity WebGL (on Editor)

 まず、私はUnity上で動くように作りました。そこでデバックをすると、ニフティクラウドモバイルバックエンド(NCMB)で罠を踏み抜きました。なお、NCMBはデータベース機能しか使っておりません。

NCMBでの罠

 基本的にはNCMBは優秀です。使いやすくて、日本語でのサンプルや資料も豊富で、無料枠も十分あります。しかも、Unity向けアセットの中でも珍しくWebGLでも使えます。しかし、多少の罠もありました。

罠1 : NCMBSetting.csをアタッチするGameObject

 NCMBでの公式ドキュメントでは以下のようになっています。

  • 空のGame Objectを作成します
    • わかりやすいように、作成したGame Objectをここでは「NCMBSettings」という名前に変更します。
    • インポートした「NCMB」のフォルダ内にある「NCMBSettings.cs」を、先ほど作成した「NCMBSettings」にドラッグ&ドロップでアタッチします

 ということで私は「名前をわかりやすいように変える…?だったら長いしNCMBでいいよね。」と判断しました。これが間違いでした。
 なんか動かなかったのでログを見てみると、以下のようなエラーが出てました。

NullReferenceException: Object reference not set to an instance of an object
NCMB.Internal.NCMBConnection+<_Connection>d__29.MoveNext () (at Assets/NCMB/Script/NCMBConnection.cs:136)

ということで該当のコードを見ると以下のようになっていました。

Assets/NCMB/Script/NCMBConnection.cs
133    private void _Connection(object callback)
134    {
135        GameObject gameObj = GameObject.Find("NCMBSetting");
136        NCMBSettings settings = gameObj.GetComponent<NCMBSettings>();
137        settings.ConnectionAsync(this, callback);
138    }

 だめじゃん。NCMBSetting.csをアタッチしたオブジェクトの名前がNCMBSettingじゃないとだめじゃん。(もしくはこのコードを変えるか。)もう少し強い言い方をしてほしかった。

罠2 : 保存する文字列

 NCMBのデータストアに情報を保存しようと思ったら、一部のデータがエラーを返される…。何回も試すうちに、文字列の中に=が共通して含まれているのに気づきました。確かに怪しい。と思ったので、エンコードをしてるところを改良しました。
 何をしたかというと、a~z、A~Zのみそのまま送り、他の文字はエスケープするようにしています。改良前はz~Aもそのまま送っていたみたい。(データはURLエンコードされて送信・受信するみたい)

Assets/NCMB/Script/MiniJSON.cs
505     void SerializeString (string str)
506     {
507             builder.Append ('\"');
508             
509             char[] charArray = str.ToCharArray ();
510             foreach (var c in charArray) {
511                 switch (c) {
512                 case '"':
513                     builder.Append ("\\\"");
514                     break;
515                 case '\\':
516                     builder.Append ("\\\\");
517                     break;
518                 case '\b':
519                     builder.Append ("\\b");
520                     break;
521                 case '\f':
522                     builder.Append ("\\f");
523                     break;
524                 case '\n':
525                     builder.Append ("\\n");
526                     break;
527                 case '\r':
528                     builder.Append ("\\r");
529                     break;
530                 case '\t':
531                     builder.Append ("\\t");
532                     break;
533                 default:
534                     int codepoint = Convert.ToInt32 (c);
----------------------------------------------------------------------------
535 --                  if ((codepoint >= 32) && (codepoint <= 126)) {
535 ++                  if (((codepoint >= 65) && (codepoint <= 90)) || ((codepoint >= 97) && (codepoint <= 122)))
----------------------------------------------------------------------------
536                         builder.Append (c);
537                     } else {
538                         builder.Append ("\\u");
539                         builder.Append (codepoint.ToString ("x4"));
540                     }
541                     break;
542                 }
543             }
544             
545             builder.Append ('\"');
546         }

罠3 : WhereContainedIn等が使えない

 症状とか解決法とかがすべてこちらの記事にのっていました。なのでほぼ省略します。ただ、コードの該当範囲がわかりづらかったので行数だけ書いときます。772・773行目付近です。

The next is...

 
 さて、どんどん次へ行きます。次はUnity WebGL編です。

シリーズ一覧