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

# はじめに
　とある事情があり、スマートロックほしい。スマートロック超便利。作ろう。となったので作ったのですが。色々な罠を踏み抜いたのでそれを書いていきます。なお、大量に罠を踏み抜いた理由は以下のような変な構成にしたからです。<font color="gray">(この構成にした理由は、上からの「早く作りなさい」という圧力と、私のスキル)</font>
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338159/5344ff27-a7bb-6818-67b4-58a8af3e3d83.jpeg)

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

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

### 罠1 : NCMBSetting.csをアタッチするGameObject
　[NCMBでの公式ドキュメント](https://mbaas.nifcloud.com/doc/current/index.html)では以下のようになっています。
> - 空のGame Objectを作成します
 - わかりやすいように、作成したGame Objectをここでは「NCMBSettings」という名前に変更します。
 - インポートした「NCMB」のフォルダ内にある「NCMBSettings.cs」を、先ほど作成した「NCMBSettings」にドラッグ＆ドロップでアタッチします

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

```
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)
```

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

```csharp: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をアタッチしたオブジェクトの名前が<font color="red">**NCMBSetting**</font>じゃないとだめじゃん。（もしくはこのコードを変えるか。）もう少し強い言い方をしてほしかった。

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

```csharp: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等が使えない
　症状とか解決法とかがすべて[こちらの記事](https://qiita.com/1024chon/items/eb3d4b1bcf3e101f24ef)にのっていました。なのでほぼ省略します。ただ、コードの該当範囲がわかりづらかったので行数だけ書いときます。``772・773行目``付近です。

# The next is...
　
　さて、どんどん次へ行きます。次は[Unity WebGL編](https://qiita.com/kumaS-kumachan/items/8be3bf4e3bad31f5cb12)です。

# シリーズ一覧

* NCMB編　←いまここ
* [Unity WebGL編](https://qiita.com/kumaS-kumachan/items/8be3bf4e3bad31f5cb12)
* [WebHook編](https://qiita.com/kumaS-kumachan/items/af1d87e75d534360984a)
* [ラズパイ編](https://qiita.com/kumaS-kumachan/items/d6407d7c9c62f90af9b7)