anz blog

UnityでNCMBScriptをつかって現在時刻を取得する

2019-08-30 #Unity #NCMB

ざっくりまとめ。

  • NCMBScript を使って現在時刻を取得する
    • NCMBScript の js を書いて設置
    • Unity から NCMB SDK を使って実行して結果を得る

です。

環境

  • Unity v2019.1.5f1
  • NCMB SDK v4.0.1

やりたいこと

NCMBScript を使って現在時刻を取得する

そもそもなぜこういう話がでてきたかっていうと、
9月から NCMBScript の無料プランでの使用制限が大幅に緩和されるらしいのです。

月100回だったら正直お試しで触ってみる以外の使いみちがないので、
NCMB使いでも無料プランで主に使ってる人はあまり触ったことがないはずだけれど、
今後は結構いろいろなシーンで使えそうなんで、折角だから紹介がてら遊ぼうと思い立ちまして(笑)

以前も似たようなテーマで「[Unity]正しい現在時刻を取得して不正を防ぎたい」というのを書いてはいるんですが、
まぁ人様が善意で公開しているサーバに対してがっつりアクセスぶちかますのはいかがなものかっていう話があるかもなので、
自分で用意できるものに越したことはないだろうという思いまり、このテーマを採用です。

大まかな手順

NCMBScript が実行するためのスクリプトを Javascript で書きます。
書いたら、それを NCMB の管理画面からアップロードします。
これでNCMB側に用意するものはおkです。
あとは、Unity側から設置した NCMBScript を実行するようなコードを書いて実行すれば得たいものが得られます。
お手軽ですね!

NCMBScript 本体を書くぞ

まずは実行するスクリプト本体を書きます。
とはいっても今回は現在時刻を返すだけっていう至ってシンプルな内容なのでサクッと書けます。
(これが、ガチャを実行するとかってなると、NCMBのデータにアクセスしたりなんとかしたり複雑になっていくでしょうけど。)

本当に単純に現在時刻を返すだけだと寂しいので、指定したフォーマットで返すかどうかっていうのも少し加えてみました(笑)
これでスクリプト本体自体はおkで、あとはNCMBにこれを設置するだけです。

設置の方法は。。。公式docがスクショ付きで書いてるのでそれで(笑)

スクリプト (Unity) : 基本的な使い方 | ニフクラ mobile backend

NCMBScript を Unity から実行する

先程設置したスクリプトを Unity 側から実行して結果を得れば今回やりたいことは完成です!

見りゃわかると思うので何も。。。

結果

NCMBScript実行結果

良い感じです。

解決出来なかったこと

上記までで全てうまく行っているようにみえますが、どうも1つだけ出来なかったことがありまして。
format を指定するときにスペースが入っているとエラーになるという問題です。

Dictionary<string, object> query = null;
// フォーマットされたものが欲しい場合は query を渡す
query = new Dictionary<string, object>{
    {"format", "YYYY/MM/DD HH:mm"}  // こういう感じでスペース区切りで時間と分を指定してみる
};

これで query を指定して実行すると

CurrentUser is found, sessionToken info error, delete localdata
UnityEngine.Debug:Log(Object)
NCMB.Internal.NCMBDebug:Log(String) (at Assets/NCMB/Script/NCMBDebug.cs:44)
NCMB.Internal.NCMBConnection:_checkInvalidSessionToken(String) (at Assets/NCMB/Script/NCMBConnection.cs:356)
NCMB.Internal.<SendRequest>d__37:MoveNext() (at Assets/NCMB/Script/NCMBConnection.cs:439)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

これは NCMB SDK が勝手に出してくるやつ

NCMB.NCMBException: Authentication error by header incorrect.
UnityEngine.Debug:LogError(Object)
c:<RunDateScript>b__1_0(Byte[], NCMBException) (at Assets/Scripts/ScriptRunner.cs:35)
NCMB.Internal.<SendRequest>d__37:MoveNext() (at Assets/NCMB/Script/NCMBConnection.cs:456)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

こっちは、callback でエラーを Debug.LogError() 出だしているやつ。

なんか全然関係ないエラーになって返ってくるんですよね。
エンコードが必要なのかな?とかも思ったのですけど、それだとエラーにはならないですが、フォーマットが意味をなさなくなるという結果になるし。そもそもエラーログてきにエンコード云々ではなさそう。
なんでしょうね?🤔

なんか分かる人は教えて下さい。

参考