はじめに
とある事情があり、スマートロックほしい。スマートロック超便利。作ろう。となったので作ったのですが。色々な罠を踏み抜いたのでそれを書いていきます。なお、大量に罠を踏み抜いた理由は以下のような変な構成にしたからです。(この構成にした理由は、上からの「早く作りなさい」という圧力と、私のスキル)
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)
ということで該当のコードを見ると以下のようになっていました。
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エンコードされて送信・受信するみたい)
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編です。
シリーズ一覧
- NCMB編 ←いまここ
- Unity WebGL編
- WebHook編
-
ラズパイ編