1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-29

はじめに

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

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編です。

シリーズ一覧

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?