2014年9月28日日曜日

【Unity, NCMB】nifty cloud mobile backendを使ってみた。けどWebPlayerでConnectFailureする。

今日参加したLT大会で「ニフティクラウド Mobile Backend」というものの存在を知った。
機能の詳細については公式をみて。
公式サイト → http://mb.cloud.nifty.com/

正式名は「NIFTY Cloud mobile backend」略して「NCMB」
呼びづらい、覚えづらい、書きづらい…どうにかならんもんか。

簡単に言うと
・プッシュ通知やユーザー管理、データストレージなどが使える
 ・プラットフォームに依存しないランキング実装とかに使える
・国内サーバー
 ・海外サーバーに比べレスポンスが速い
・無料でもかなり使える
 ・最大でも月3万円
こんな感じ。

かなり便利そうなので試してみる事にした。

ここのクイックスタートを見ながら試してみたんだけど
http://mb.cloud.nifty.com/doc/quickstart_unity.html

下記エラーが出た。
Error occurred: Error: ConnectFailure (Unexpected error while trying to call method_GetSecurityPolicyBlocking : System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Net.WebException: The remote server returned an error: (404) Not Found.
  at System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult result) [0x00000] in <filename unknown>:0 
  at System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data) [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x000eb] in /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:232 
  at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115 
  at UnityEngine.UnityCrossDomainHelper+WebRequestPolicyProvider.GetPolicy (System.String policy_url) [0x00000] in <filename unknown>:0 
  at UnityEngine.UnityCrossDomainHelper.GetSecurityPolicy (System.String requesturi_string, IPolicyProvider policyProvider) [0x00000] in <filename unknown>:0 
  at UnityEngine.UnityCrossDomainHelper.GetSecurityPolicyForDotNetWebRequest (System.String requesturi_string, System.Reflection.MethodInfo policyProvidingMethod) [0x00000] in <filename unknown>:0 
  at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x000d0] in /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222 
  --- End of inner exception stack trace ---
  at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x000eb] in /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:232 
  at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115 
  at System.Net.WebConnection.CheckUnityWebSecurity (System.Net.HttpWebRequest request) [0x00000] in <filename unknown>:0 ) 
 with: System.Collections.Hashtable ; 
   at System.Net.HttpWebRequest.EndGetRequestStream (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
  at System.Net.HttpWebRequest.GetRequestStream () [0x00000] in <filename unknown>:0 
  at NCMB.Internal.NCMBConnection._sendRequest (System.Net.HttpWebRequest req, NCMB.NCMBException& error) [0x00000] in <filename unknown>:0 
まさかの404エラー。
でも「method_GetSecurityPolicyBlocking」みたいに書かれてる。
WebPlayer向けに設定してるしもしやと思ってAndroid向けに変えてみたらこのエラーは消えて通信成功した。

案の定WebPlayerのセキュリティポリシーによるものみたいやなぁ…
http://docs-jp.unity3d.com/Documentation/Manual/SecuritySandbox.html

ランキングロジックとかをWebPlayer、iOS、Androidで全て統一できないかと考えたんだけどなぁ。うーむ。

Unity系記事まとめ

発表してきました。【アセットまみれのLT大会 in 大阪 】

はじめに

今日はこれに参加し、初めてLTしてきました。

【9/27】【Unity】アセットまみれのLT大会 in 大阪 【関西】
http://unityassetjp.doorkeeper.jp/events/13003

※LT : Lightning Talk (3~5分の短いプレゼン)

・スケジュール通りのLTが6件(上記URL参照)
・飛び入りLTが4件
・そして少し時間が余ったのでポケット・クエリーズ佐々木様による発表が1件
計2時間ちょいでした。

全体の感想

Unityさんやゼンリンさん、ポケットクエリーズさんなど企業として来ている方の発表は聞きやすかったなぁ。話し手が落ち着いているので聞く側もとても楽だった。

今回メモは全く取ってないので他の方の発表内容に関するコメントはできません〜。
はじめて発表したのでここからは感想でも書いておこうと思います。

自分の発表の感想

自分は下記資料で発表しました。



資料作りで気をつけた点
・初LTだし緊張するから読むだけでいい資料にした
 →結果的に良かったと思う。自分はこれぐらいが楽。
・文字いっぱい書いても後ろの人読めないしMAX5行ぐらいにした
 →細かくても読まないし。
・5分から逆算して30枚程度(1枚10秒)ぐらいにした。
 →ちょうどよかったと思う。

話してるとき考えてた事
・いつも早口になっちゃうのでとにかくゆっくり話す
 →懇親会で聞いたら大丈夫でしたよって言ってもらえた。よかった。

しゃべってる最中は結構緊張しててあんまり覚えてません。
緊張に関してはあと2〜3回こういう機会があれば余裕も出てくるかな。
終わってみると5分はあっという間だったので
言いたい事をもっと絞らないとあかんなーと感じた。
特に今回の資料はアセットにこじつけたので少し話しづらかった。

そいえばMacの外部出力が快適でひじょーにやりやすかった。
プロジェクターにプレゼン再生中は手元のMacに次スライドも表示されてる。
原稿も書いておけば表示されるらしい。

おみやげ

  • UnityさんからUnityちゃんタオル
  • UnityさんからUnityPro90日トライアルライセンス
    なぜか発表を褒めていただけた…!うに部屋もっとやれってことっぽい。
  • ポケット・クエリーズさんよりクエリちゃんステッカー×2
いただきもの
ライセンスは真夏のアドベントカレンダーの参加賞でもいただいたので180日分になりました!イヤッホウUnityProで遊ぶぜ!

おわりに

とにかくやってよかった。
LTはプレゼンの練習にいいなー。
5分ぐらいならミスっても許されそうだし。
またやりたい。

2014年8月29日金曜日

【Unity、UniRx】クリック回数をトースト表示する


@Baiteen

ReactiveExtensionsがUnityでも使えるってのを今更知ったので、今更ながら使ってみた。その6。

やりたいこと

ReactiveExtensionsを使ってクリック回数をトースト表示する。

やったこと

(UniRxはインポート済み)
まずは、クリックするためのSphereを追加(Sphereじゃなくてもいい)
前回のなごりでPlaneを追加(Planeじゃなくてもいい)
トースト表示するためのText追加(せっかくなのでuGUI使いました)
それからC#Scriptを作成してコードを以下のように変更(今回もTestScriptにしました)
そしてTestScriptをSphereにドラッグ&ドロップしたら出来上がり
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UniRx;

static class ColorExt
{
  /// 
  /// Textのアルファ値をセットする拡張メソッド
  /// 
  /// uGUIのText
  /// アルファ値
  public static void setA (this UnityEngine.UI.Text text, float a)
  {
    text.color = new Color(text.color.r, text.color.g, text.color.b, a);
  }
}

public class test1script : ObservableMonoBehaviour
{
  /// トースト表示用オブジェクト
  public GameObject Toast;

  /// Scanで匿名クラス使うとなぜかエラーするので、クラス定義
  private class Delta
  {
    public float time{ get; set; }
    public float offset{ get; set; }
    public Delta(float t, float o){ time = t; offset = o; }
  }

  /// 
  /// 指定秒間だけEveryUpdateを発行する
  /// 
  /// 
  /// 秒
  private IObservable TakeSec (double value)
  {
    //0秒〜経過秒が値として発行される
    return Observable.EveryUpdate().Scan(
        new Delta( 0, Time.time)
        , (a, t)=>new Delta( Time.time - a.offset, a.offset)
      ).Select(delta => delta.time)
      .TakeUntil(Observable.Timer(System.TimeSpan.FromSeconds(value)));
  }

  ///  RXのサンプルがAwakeだったので、ここに書きました。 
  public override void Awake ()
  {
    //参考サイト:http://neue.cc/2010/07/28_269.html

    //トースト用オブジェクトからuGUIのTextを取り出して、透明にする
    var text = Toast.GetComponent ();
    text.setA(0);

    //nueuccさんのアドカレ記事をパクりました
    //クリック回数をトースト表示
    OnMouseDownAsObservable ()
      .Buffer (OnMouseDownAsObservable ().Throttle (System.TimeSpan.FromMilliseconds (250)))
      .Select (xs => xs.Count)
      .Do(cnt => text.text = string.Format ("{0} clicks", cnt))
      .SelectMany(cnt => 
        //1秒かけて0→1、また1秒かけて1→0ってなってほしいんだけど、0→1、1→2ってなる。意味不明。
        Observable.Concat(TakeSec(1).Do(t=>text.setA(t)), TakeSec(1).Do(t=>text.setA(2-t)))
      ).Subscribe (t=>Debug.Log(t));

    // If you use ObservableMonoBehaviour, must call base method ← サンプルにこう書いてますので、そのまま。
    base.Awake ();
  }

}

こんな感じ。
Hosted by UnityRoom.com

どうにか思ったとおりの動きになったんだけど、理解できない部分がいくつか。
・Scanのseedを匿名クラスにすると、なぜかCannot implicitly convert type `anonymous type' to `anonymous type'って怒られる
・1秒で終わるObservableをConcatで2つ繋げると、なぜか単体で動かすのと違う動きになる、気がする、、、

追記

neueccさんからアドバイス頂いてScanの理解できない件解決しました。
timeの型がintとfloatになってるだけでした。
seedをnew {time=0f, offset=Time.time}にしたらOKでした。はずかし。

Concatの件もいろいろ試してたら思った感じの動きになりました。
Observable.Concat(TakeSec(1).Do(t=>text.setA(t)), TakeSec(1).Do(t=>text.setA(2-t)))

TakeSec(1).Do(t=>text.setA(t)).Last().SelectMany(_=>TakeSec(1).Do(t=>text.setA(1-t)))
てしたらそれっぽくなりました。全然わからん。



Related Posts Plugin for WordPress, Blogger...