デブサミ2014に行ってきた(1日目)

デブサミ2014に行ってきました。
参加するのは今年で3回目ですが、年々企業の宣伝イベントになってきている気が。。

資料は下記ページに随時アップされるみたいです。

デブサミ2014、講演関連資料まとめ:CodeZine

以下、メモです。

【13-A-1】「クラウドがもたらした多様な破壊と創造」

クラウドによって、今後どのような仕事やサービスが破壊され、創造されるのかというテーマの講演。
途中から、色んな会社の自社サービス宣伝大会みたいな感じに。。

【13-D-3】「フロントエンドエンジニア(仮)~え、ちょっとフロントやること多すぎじゃない!?~」

講演者:サイバーエージェント、2008-2011:ウェブデザイナー→2011-2012:ウェブディレクター→2012-:ウェブディベロッパー

  • CAで作ったアプリ:GIRL’S TALK、GF
  • GRUNT:いろんなツールの機能をもつコマンドラインツール
  • WEBPAGETEST:ウェブページのパフォーマンスを計測してくれる

資料に、ミサワなどのネタが散りばめられていて面白かった

【13-C-4】「iOSにAndroid、百花繚乱モバイル開発環境を比較する」

講演者:シリアルゲームズ

  • HTML5は、Web アプリ(Facebookなど)にオススメ。中でも「Sencha Touch」がオススメ
  • Script(LL言語)は、Web API 経由のアプリにオススメ。
  • Mono touch(Xamarin、Unity3D)は、.NET Framework/C#が使える点がオススメ。
    • Unity3Dは、iOSはネイティブで動くが、Androidは.NETのVM上で動く。
    • 一般アプリは、Xamarin。ゲームはUnity3D。
  • Delphi
    • 利点
      • iOS/Androidの両方がネイティブになる。
      • GUIも1ソースで
    • 難点
      • Androidは、ネイティブが弱点
      • Pascal系列の言語
      • NativeUIの見た目を自分で描いている(OSのアップデート時などにStyleを更新しないといけない)
      • IDEがWindowsだけ。iOSアプリを作るときは、Windows+Macが必要
  • 結論
    • 一般アプリ
      • DelphiかXamarin
    • エンタテイメント分野
      • Unity3D

【13-E-5】「Stormで実現するビッグデータのリアルタイム処理プラットフォーム」

ビッグデータ×リアルタイム

  • 1分間のFacebook投稿数やSkypeコール数は、Twitterツイート数の約10倍
  • 今後求められるビッグデータ処理
    • 不正アクセス検知、交通情報や災害情報の分析、緊急災害時の対応など
      →リアルタイム処理(ストリームデータ処理)が必要
  • ビッグデータ処理の3つのタイプ
    • バッチ処理
      • MapReduce、Hadoop
    • ストリームデータ処理
      • Storm
  • ストリームデータ処理とは
    • リアルタイムに、解析・分析の処理を行い続ける

ストリームデータ処理を実現するStorem

  • Twitter社がオープンソースとして公開した分散リアルタイム処理フレームワーク(2011/09/11)
  • コアエンジンはClojure、コンポーネントはJava、PHPなどの多くの言語で開発できる
  • 導入事例
    • Twitter、グルーポンなど

ストリームデータ処理のアーキテクチャ

【13-B-6】「mobile backend活用事例から見る「これからのスマホアプリ開発とクラウドの展望」」

mBaaS

  • サービス
    • Parse(海外でメジャー)
    • Stack Mob
    • Amazon SNS Mobile Push
    • Google
  • 機能
    • データストア、プッシュ通知、ファイルストア、会員管理、SNS連携

所感

  • XamarinとmBaaSは使ってみたい!
  • 全体的に「テーマの概要+自社サービスの宣伝」という印象で、時間の割に新しく得られた知識は少なかったような。。
    →デブサミは、興味のあるテーマより興味のないテーマのセッションを選んだほうが良いのかも

明日も行ってきます!

Unityで簡単かつ無料でアプリ内課金を実装できるライブラリ「SOOMLA」を使ってみた

先日リリースしたiPhoneアプリ「ワンパットゴルフ」では、アプリ内課金をしています。
このアプリはUnityで開発したのですが、Unity本体ではアプリ内課金をサポートしておらず、課金部分はネイティブで自作 or ライブラリを利用しないといけません。

ネイティブで自作はめんどくさそうだし、かといって Asset Store にあるライブラリはどれも有料。。どうしよう。。と悩んで色々ググってたら、SOOMLA というオープンソースライブラリを見つけました。

SOOMLAとは

アプリ内課金を簡単に実装することのできるオープンソースライブラリです。Unity以外にも、iOS、Android、cocos2d-xで利用することが出来ます。
今回は非消費型アイテムしか試していませんが、消費型アイテムにも対応しています。

インストール

下記ページの右側にある[unity3d-store]-[Download]から.unityPackageファイルをダウンロードしてインストールのが楽だと思います。その下にサンプルプロジェクトがあるので、一緒にダウンロードしておきましょう。
http://project.soom.la/

使い方

細かい実装方法に関してはサンプルプロジェクトを見ると分かると思うので、大まかな実装の流れを説明します。今回は非消費型アイテムの使い方になりますが、iOS版でしか実装していません。Android版に関しては別途必要な設定や処理が必要になるため、ドキュメントをご確認ください。

【Soomlaのプレハブをシーンに追加】
課金したいシーンに、Soomlaのプレハブを追加します。
Inspector パネルで、「Custom Secret」「Android Public Key」「Soom Sec」を設定してください。
設定内容は下記を参考にしてください。
https://github.com/soomla/unity3d-store

【課金アイテムクラスの作成】
サンプルプロジェクトの
/Assets/Soomla/Code/MuffinRushAssets.cs
を参考にして課金アイテムクラスを作成します。
プロダクトID、価格、アイテムの種類等を設定します。

【StoreController の初期化】
アプリのロード時に、StoreControllerを初期化します。
StoreController.Initialize(new YourStoreAssetsImplementation());
初期化は1度だけで、Awake()ではなく、Start()で実行しないといけません。
【追記】YourStoreAssetsImplementationの部分は、【課金アイテムクラスの作成】で作成したクラスを指定してください

【イベントの登録】
Events クラスに購入成功時などのイベント処理を登録します。
イベントの種類や具体的な登録方法は、サンプルプロジェクトの
/Assets/Soomla/Code/ExampleEventHandler.cs
を参考にしてください。
今回の実装では、StoreController.Initialize()の直後に登録処理を記述しました。

【購入処理】
StoreController.BuyMarketItem(プロダクトID);
購入に成功した場合や失敗した場合の処理は、Events.OnMarketPurchase や Events.OnUnexpectedErrorInStore に登録したメソッドで行います。

【復元処理】
StoreController.RestoreTransactions();

【(端末の)アプリで非消費型アイテムが購入済になっているか】
StoreInventory.NonConsumableItemExists(プロダクトID)

まとめ

SOOMLAの概要やUnityでの使い方について説明しました。
そんなSOOMLAを使っているアプリ「ワンパットゴルフ」は、App Store や Google Play で絶賛公開中です。
ぜひ遊んでみてください!

iPhone: https://itunes.apple.com/us/app/oneputtgolf/id791400827?l=ja&ls=1&mt=8
Android: https://play.google.com/store/apps/details?id=jp.shunsukeosawa.OnePuttGolf&hl=ja

非活性状態のGameObjectを活性状態にする

編集のために一部のGameObjectを非活性状態(active==false)にしておいて、起動時にすべて活性状態にしたい場合があったとします。

上の例では、Holeの子にHole1,Hole2,Hole3があり、Hole1とHole2は非活性状態です(Hole3を編集するために、不要なHole1,Hole2を非活性状態にしています)。
起動時にHole1,Hole2を活性状態にしたいのですが、GameObject.FindGameObjectWithTag()やGameObject.Find()だと非活性状態のGameObjectができず、SetActiveRecursively()がUnity4非奨励になって使えません。

そんなときは、活性状態にしたいGameObjectの親GameObjectのtransformから子を取得して活性状態にすることができます。

GameObject holeRootObj = GameObject.Find("Hole");
foreach( Transform child in holeRootObj.transform)
{
GameObject childGObj = child.gameObject;
childGObj.SetActive(true);
}

iPhoneやAndroidでGUI Textureがタップされたことを検知する方法

PCでGUI TextureがクリックされたときはOnMouseDown()を使えばよいのですが、iPhoneやAndroidだとそれに相当するイベントがないみたいです。なので、iPhoneやAndroidでGUI Textureがタップされたことを検知するためには自前でコードを書く必要があります。

ググると、Raycastを使う方法やiPhoneInputを使う方法など色々見つかりますが、うまく動かなかったり、Andoroidに対応できないという問題があったりしました。

最終的に、GUI TextureのComponentに以下のコードを追加することでうまく処理することが出来ました。

if (Input.touchCount == 1) {
Touch touch = Input.GetTouch (0);
if (touch.phase == TouchPhase.Ended) {
if (guiTexture.HitTest(touch.position, Camera.main)) {
//タップされた時の処理
}

このコードはタッチが終了したときにタップ処理を実行します。もしタッチの開始から終了までの間ずっと処理を実行したい場合は、
touch.phase == TouchPhase.Ended

touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Ended
に変えるとよいです。

また、このままだとGUI Texture外でタッチを開始し、GUI Texture内でタッチを終了した時もタップ処理が実行されます。自分のアプリだと別にそれでもよいので上記のコードで対応しましたが、もっとちゃんと処理する場合は、以下のサイトを参考にしてください。

Unity3D:GUI Textureでボタンを作成(2)

そういえば、iOS 7 Tech Talks に当選してた

iOS 7 Tech Talks に当選してたので、明日行ってきます!!
https://developer.apple.com/tech-talks/jp/

改めてメールを良く読むと、写真付きID(=免許証やパスポート)が必要らしいです。

あと、”あらゆる形式でのライブブログ活動は明示的に禁止”。
こちらも危うくイベントのレポートを書きまくるところでした。

事前に確認してよかったー。

Apple のイベントってどういう感じなのか、すごく楽しみ!!