dnekblog

スマホのアプリを作ってる。

運ゲー排除マインスイーパーをiOSにも対応させた話とか

この記事は KMC Advent Calendar 2016 - Adventar 6日目(12/6)の記事です。

www.adventar.org

5日目の記事は、id:tyageさんの嘘つきPHP ZipArchive::addGlobと壊れたファイルパス – 弱いでした。

blog.tyage.net

はじめに

過去にKMCで会長をしていたのか今となっては怪しいdama*1です。 今は4回生なので一応卒論を書いているのですが、一緒にKMCに入った仲間たちがほとんど留年してしまっていて寂しい感じです。

1年経ってみて

ちょうど1年前の12/6に同じくKMCのAdventCalendarでこんな記事を書きました。

dnek.hatenablog.com

このアプリについて書いています(iOS版は後述)。

play.google.com

長ったるいまともなブログ記事を書いたのは確か初めてだったのですが、予想よりもかなり多くの方々に閲覧・反応していただけたようで良かったです。 それから1年経つ間に色々とやったことややっていないことがあるので適当にその辺の話をしようと思います。

KMC効果

実はこのアプリを初めてリリースしたのは1年前に記事を書いた日の数週間前だったのですが、記事を書いてからDL数が桁違い*2に増えた記憶があります。

総DL数は数百程度だったものの、おかげさまで新着無料ゲーム総合で200位以内に入ることができました。

KMCの知名度のおかげだと思います。感謝。

「五億円ゲット」

正月早々2本目のアプリをリリースしました。

「五億円」という経済指標は、日本人の平均生涯賃金とされる2億円の2倍を超えており、手に入れれば一生余裕を持って過ごすことができる額となっています。 2015年の京都大学11月祭では京都大学五億円同好会のブースも出展され、その人気は今も揺らぐことはありません。

そんな中、年末に唐突に思い立ち大晦日まで作業をし2016年元日にリリースしてしまったものがこちらです。

play.google.com

1円玉から500円玉までの硬貨が並んでおり、タップする毎に溜まっていくというクソゲーです。

同じくクソゲーでありながら何故か大ヒットした「100万の○〇〇」*3というアプリがあるのですが、500円玉を100万回タップすればぴったり5億円だし難易度的に丁度良いだろうと思い、作ってしまいました。

1硬貨あたり3種類の硬貨効果音を心を込めて録音したので、その音を聴いて楽しむのがオススメです。

当然流行ることはなく未だにDL数は2桁しかありません。 それでも何故かずっと続けている知人が二人も居りしかも電車内で無音でプレイしているらしく、正直意味が分からないです(遊び方は自由です)。

当然全く期待していないので一度もアプデしていないしiOSに対応する気も無いですが、もし万が一流行ることがあったら考えてみようと思います。

ユニバーサルアプリキャンペーン

良いものを作りたいと思ってUnambiSweeperを作ったのは本当で、特に手を抜いたつもりもありません。 それでもお金が欲しいという気持ちは割りとあるので、アプリ内に広告を表示させていただいており、多少の宣伝もしています。

最初はお金をかけずに宣伝したいと考えてレビューサイトにお願いしまくったのですが、案の定全く載せてもらえませんでした。 Twitterでは主にKMCの力によりそれなりの宣伝ができたのですが、やはり限度があるといった感じです。

結局3月にユニバーサルアプリキャンペーンを使ってみることにしました。 ユニバーサル(ryというのは、簡単な設定をするだけで、Googleさんがアプリ内広告とかYouTubeとかGoogle検索の検索結果とかで良い感じに宣伝してくれるやつです。 課金方式はCPC(クリック毎)になっています。

とりあえず\11,000くらい突っ込んでみたのですが、割とすぐに400DLくらい行きました。 インストール単価は27円くらい。

それで広告収入がどうなったかというと、全く増えませんでした。むしろ減った。アイエエェ……

理由を考えて見るに、主に以下の3つかなと思います。

  • 主に海外のクリック単価の低い地域に向けて宣伝していたため当然収益も低い
  • Twitterやストア内検索経由でDLしたユーザーに比べてすぐにアンインストールする人が多い
  • 自然減

貧乏学生なのでインストール単価数百円の先進国に向けて宣伝するのは多少気が引けるのですが、また余裕ができたら試してみようかなと思っています。

Unity再び

去年の記事にも書いたのですが、最初のUnambiSweeperは1回生のときにWindows向けに作りました。 その後なんとなくUnityに移植し、去年になってAndroid版を作ったという感じです。

Android版はJava & AndroidStudioで開発していたのですが、ちょっと問題がありました。 何故か電力消費が激しく、また一部端末(どうも機種依存では無さそう)で動作が著しく重くなるというものです。 恐らくSurfaceViewが原因なのですが、去年の記事が完全なブーメランとなっている気がします。

何とかしようと色々考えたのですがよく分からず、面倒なのでいっそUnityに移植してついでにiOSにも対応しようという結論に至りました。

そもそも1回生のときにUnityに移植したのではと思われるかもしれないですが、当時はPCで遊ぶことしか考えていなかったため、タッチ操作・画面移動・GooglePlayゲーム・広告対応などやらないといけないことが色々あった訳です。 また、当時のUnityで作ったスマホアプリはかなり重く、最近IL2CPP*4に対応してやっとまともになったので使う気になったというのもあります。

iOS対応

Unityはマルチプラットフォーム対応ゲームエンジンでほとんどのコードを共通化できるすごいやつなのですが、多少はAndroidiOSで個別に対応しないといけないこともあります。

というのも、Android版ではランキングや実績のためにGooglePlayGamesServicesを使っていたわけですが、折角iOSにも対応しているのに実装してもAppStoreでリジェクトされてしまうらしく、iOSでは泣く泣くGamecenterを使うことにしました。 まあ個別に書くだけでそれぞれの実装は大して難しくないのですが。

ちなみにPlayGamesの方は以下のプラグインを使い、iOSはUnity標準のusing UnityEngine.SocialPlatforms;すればいけます。

github.com

もう一つ、ヴァイブレーションはHandheld.Vibrate();で鳴らせるのですが、Androidで任意の時間鳴らすにはネイティブコードを書く必要あります。 適当なプラグインを入れても良いですが、大した実装ではないのでこの辺を参考に自分で書けば良いと思います。

ameblo.jp

一方でAdMob広告やSNSでの共有、ネイティブダイアログなんかはプラグインで簡単にいけます。

GoogleMobileAdsは割りと頻繁に更新されていて、丁度今朝Version 3.1.3がリリースされていました。

github.com

SNS共有はこれが一番使い勝手が良いと思います。

github.com

ネイティブダイアログはこちら。 ただ、3つ以上の選択肢が出せないので他に良いプラグインがあれば教えて欲しいです。

github.com

Android版のバージョン管理

通常UnityでAndroid向けにビルドするとARM/x86両方のアーキテクチャに対応するapkが出力されますが、これが結構重いので、Player SettingsのDevice Filterで設定してそれぞれ専用のapkをビルドした方が良いです。Bundle Version Codeも分けておくようにしましょう。

そうすると複数のapkを同じアプリとして公開する必要が出てくるので、Developer Console上で設定をします。 当該アプリページのAPKタブ内右上にある「アドバンスモードに切り替える」ボタンを押すと、複数apkを端末によって振り分けられるようになります。

ちなみにUnambiSweeperはAndroid2.3.3以降に対応していたのですが、Google Play Games plugin for UnityがAndroid4.0以降対応だったため、今後更新はしないものの前バージョンのapkも残し、4.0未満でもインストール出来るようにしています。

HP

プレイスコアをSNSで共有するとき、末尾にハッシュタグ#UnambiSweeperとアプリURLを付けさせてもらっています。 Android版ではPlayストアのURLをGoogle URL Shortenerで短縮したものを使っていたのですが、 iOSにも対応するにあたり片方のOSのURLだけ共有されても困るので、HP内にアプリ紹介ページを作りそこから各ストアへ飛んでもらうことにしました。 ただ、当時使っていた忍者ホームページ*5だと微妙に長い上に広告も表示されてなんか嫌だったので、新しく作り直すことにしました。

最近(?)は便利なもので、Freenomというサービスで、.tk/.ml/.ga/.cf/.gqといった主にアフリカのトップレベルドメインが無料で取得できるようになっています。

Freenom - 誰でも利用できる名前

辞書登録されているようなものでなければ、最短4文字のドメインを取得することができます。 私はdnek.cfを取得しました。 今の所、最低年1回の契約更新を忘れなければ使い続けられるはずです。

後はホームページサービスですが、ウェブクロウという無料・広告無し・商用可・独自ドメイン対応の良い感じのやつがあります。

www.webcrow.jp

これらを登録したら後はネームサーバーを設定してあげれば簡単に広告無しで短いドメインのHPが手に入ります。

.htaccessもちゃんと使える*6のでリネームして.htmlを消すようにし、http://dnek.cf/unambiという短いURLが出来ました。 めでたい。

Metal

試行錯誤とサボりを繰り返しつつなんとか10月末にリリースすることができました。

しかしすぐにとある知人からバグ報告がありスクショを見せてもらったのですが、スタート画面がうまく表示されずまともに使えない状況でした。

ググってみるとこんな記事が見つかりました。

answers.unity3d.com

要はiPhone5s(他の機種もあるかも)だとUGUI*7がMetal*8で上手く描画出来ないらしいので、使わないように設定したら直りました。 一安心。バグ報告感謝。

現状&まとめ

以上のような感じで色々とやってきたわけですが、現在は総インストール数が4,400+、評価が☆4.259(総評価数: 81)といった感じです。

更にぶっちゃけてしまうと、最近の広告収入は百数十円/日、約5千円/月、総計で5万円弱といったところです。 Android : iOS = 3 : 2くらい。 多いと思う方も少ないと思う方もいると思いますが、とりあえずお小遣い程度にはなっています。

アプリの完成度はゲームとしてちゃんと遊べるくらいになっていると思いますが、まだまだ改善の余地があるので今後もアプデを続けていきたいと思います。 あとこの記事を書いている途中で気付いたのですが、Unity5.5の安定版が11/30にリリースされていたらしいので、GoogleMobileAdsの更新も兼ねて後で試してみようと思います。

他にもアプリのアイデア自体はいくつかあるのでどんどん作っていきたいです。また、こういうの作って欲しい等ありましたらTwitterとかで教えて下さい。

twitter.com

あとこちらもインストールよろしくお願いします。

play.google.com

また、宣伝していただける場合は以下の紹介ページをご利用下さい。

UnambiSweeper|DNEK

終わりに

今年も長文駄文失礼致しました。

さて、明日はid:yu3marsさんです!

KMC Advent Calendar 2016 - Adventarの他の記事はこちらからどうぞ。

www.adventar.org

*1:damaはKMC内でのID、DNEKは主にTwitterとかで使っている名前

*2:1桁/日→2桁/日

*3:筆者による伏せ字

*4:中間言語からC++に変換して良い感じにしてくれるやつ

*5:実はUnambiSweeperのパッケージ名にその名残がある

*6:忍者ホームページでは使えなかった

*7:Unity標準のGUI

*8:一部のApple製品で使われているCGAPI

運ゲー排除マインスイーパーをAndroidアプリにした話と市場に対する雑感

(2016/12/18追記) 続きです。

dnek.hatenablog.com


この記事は KMC Advent Calendar 2015 - Adventar 6日目(12/6)の記事です。

www.adventar.org

5日目の記事は、id:Pasta-KさんのWebExtension現状確認してみた - Pastalablog in はてなでした。

はじめに

最近KMCで代表*1の任期が満了となり、晴れて平部員に昇格した*2dama*3です。

github.com

ちょっと前にPietのIDEのようなものを作っていました(宣伝)が、最近Androidアプリを作ってリリースしてみた(宣伝)ので、その辺で色々思ったことを書こうと思います。 ちょっとだけ開発上の知見っぽいものも書きます(マインスイーパー以外でも役に立ちそう?)。

マインスイーパーの欠陥

さて、ある程度マインスイーパーで遊んだことがある人であればご存知だと思いますが、マインスイーパーには運ゲーという致命的欠陥(偏見?)があります。

f:id:dnek:20151202050012p:plain

例えば↑の画像では、右下の2マスのうちどちらに地雷が埋まっているのかは完全に五分五分です。 このような単純な例を含め、特に上級においては頻繁に運ゲーが発生します。

頑張って考えて解いていたゲームがいきなり非論理的要素によって中断されてしまうのは非常に理不尽なことです。 ですが私はこの運ゲーの存在によって元々論理的に解けるはずの盤面がきちんと解かれなくなることの方が問題であると思います。

つまりどういうことかというと、とても複雑であるが論理的に解ける盤面でも、絶対に運ゲーが無いという保証が無い故にその検証にかける時間を惜しまれ運任せにされてしまう場合があるのです。

ある程度プレイしている人にとってこの運ゲーの存在は当たり前のことかと思いますが、そもそも運ゲーが無いことが保証されていれば、どれだけ論理的思考に時間を使おうとする意識が高まるでしょうか。

UnambiSweeper

この理不尽とオサラバするため、私が1回生の時*4に作ったのがUnambi Sweeper*5です。 Unambiというのは"Unambiguous"*6の略です。

当時はWindows向けにVB.NET書いたり*7、なんとなくUnityに移植したり*8していました。 必ず論理的に解けるようにしたのに加え、私のようなキーボードプレイヤー*9*10のために操作性を改善*11したりしました。

そしてAndroid

実はUnambiSweeperを作った頃、Androidを触ろうとしたがEclipseでの開発に手間取って頓挫した記憶があります*12

それから時は流れてKMC春合宿2015

このAdvent Calenderの作成者でもあるid:nonyleneさんのスライド発表を見ました。

www.slideshare.net

実はそこでAndroid Studioの存在を知ったのです。 Eclipseはダメだったけどこれならイケそう、と思い、しばらく触れていなかった*13UnambiSweeperをAndroidに移植してみようと思い立ったのです。

そして半年ほど勉強しつつ頑張ってリリースしたものがこちら。

運ゲー排除マインスイーパ - UnambiSweeper - Google Play の Android アプリ

是非遊んでみてください!!!

で終わるわけではない。

UnambiSweeperの良い所

とりあえず運ゲーにならないというだけでも他のマインスイーパアプリではなくUnambiSweeperを選んでいただけることと思いますが、そもそもマインスイーパーとしての完成度が他とは違います(多分)。

UnambiSweeperの良い所

類似アプリの良くない所

というわけでここから今までよりも自信過剰な発言をしていきます。

現状、PlayStoreにて「マインスイーパー」で検索してみると、有象無象のマインスイーパーアプリが出て来ます。

gyazo.com

リリース時期にもよるでしょうが、初めの方に表示されるアプリには10万、100万DLレベルのものがいくつもあります。

ですが、これらの人気アプリでも(評価が高いものでも)実際に遊んでみると特に遊ぶ価値はない気がしますが色々と不完全な部分が見つかります。

以下、気付いたものを挙げていきます(すべて5万DL以上のアプリで確認できるものです)

  • ボタンがフィールド上に重ねて置いてあってミスタッチし易い

おそらく現状で一番まともだと思われる類似アプリ(100万DL)でほぼ唯一気になった点です。 UnambiSweeperでは、画面の上下端に半透明のカバーをしてその上にボタンなどのUIを設置しています。

  • プレイ画面が表示された瞬間にタイマーがスタートする

これはなかなか致命的な問題だと思うのですが、100万DLのものを含めいくつかのアプリで確認できます。

  • 最初に開けたマスの周囲に地雷が存在する

普通に考えれば分かることですが、最初に開いたマスの周囲8マスのいずれかに地雷が存在すれば、そこは数字マスとなり周囲のマスは自動的に開かれません。 つまり初めから運ゲー状態となるわけです。 これはおそらく半分以上の類似アプリで確認できる問題です。 由々しき状況です。 ちなみにWindows付属のマインスイーパーではVistaから改善がなされています。 特に実装上難しいものではないですし、マインスイーパーを実装する上で最低限のマナーだと私は思っています。

  • 最初に開けたマスに地雷が存在する

最初に開けたマスに地雷が存在するものもあります。論外です。

  • 周囲一気消しが出来ない

マインスイーパーでは、数字マスの周囲にその数字と同数のフラグが立っている場合、そのマスに旗立てと同等の操作*14を行うことでそれ以外のマスを一気に開けることが出来ます。 フラグを使うプレイヤー*15にとっては必須と言えるこの機能を有していないアプリも数多くあります。

  • 地雷/フラグ切り替えが出来ない

多くのアプリでは、デフォルトで「タップ = マスを開く」、「ロングタップ = 旗を立てる」という仕様になっています。 ですが、フラグを使うプレイヤーは上記の周囲一気消しを用いるため旗立ての操作をすることの方が多いし、単純に一々ロングタップするよりも操作を入れ替えてタップで旗を立てる方が速いです。 そのため、切り替えボタンがあると便利なのですが実装されていないアプリもいくらか存在します。

  • 動作が重い

SurfaceViewGLSurfaceViewで実装しましょう。あるいは画像をあらかじめcreateScaledBitmap)などでScaleしてから描画しましょう。とかそんな所だと思います。

  • タップしにくい

触れてから少し指を動かしただけでスクロールと見做されてしまい中々タップできないという問題です。 これはおそらくMotionEventのACTION_MOVEをそのまま使ってしまっているのが原因だと思われます。 特に複雑な実装をしようと思わないのであれば、GestureDetector.SimpleOnGestureListenerのonSingleTapUpやonScrollなどを使えば良いと思います。

但し一度タップしてからすぐに近くの場所をタップした場合これはダブルタップと見做され、onSingleTapUpでは2回目のタップを検出することが出来ません。 一応GestureDetector.OnDoubleTapListenerというものが存在するのですが、これでも何故か2回目のタップをスクロールと分けて検出することが出来ません。 そのため、私はACTION_MOVEで初期タップ位置からの距離を計算してスクロールになるかどうかを判定しています。 この距離は

ViewConfiguration.get(getContext()).getScaledTouchSlop()

などで取得することが出来ます。 ViewConfigurationでは他にも色々な値が取得できるので一度確認してみると良いと思います。

  • ピンチイン/アウトが変

いくらかのアプリではピンチ(二指ズーム)が出来ます。 しかしその多くはフィールドの中心を基準に拡縮しているため、フィールドの端の方で拡大した状態からピンチアウトしようとすると、中心に吸い寄せられるように縮小されてしまいます。 これは、ピンチ時にタッチしている2点間の中心を取得することで改善することが出来ます。

  • よく分からないUI

ズームが出来ない代わりに、タッチ位置の周囲を拡大して表示するようなUIを実装しているもの(10万DL)がありますが、正直かなり操作しにくいです。 もう少し素直なズーム機能を実装してほしいものです。

  • よく分からない盤面デザイン

フィールドのサイズは画面一杯で固定、マスのサイズを設定するとそれに応じて画面に入るだけのマスが詰められる、難易度を変えると地雷の密度が変わる、というちょっと不思議な盤面のデザインをしているものがあります(50万DL)。 これに関しては好みによるのかもしれませんが、同じ難易度でマスの数が変わりまくるというのは良くないのでは、と思います。

UnambiSweeperの良い所(再)

さて、だいぶ長々と文句を言って来ましたが、上記の問題点をすべてクリアしているのはおそらくUnambiSweeperだと思います。割りとマジで。 もしそうでないAndroidアプリがあれば教えていただけると幸いです。

さて、実は今までありそうでなかった、おそらくUnambiSweeper独自の機能があります。

  • 残りの安全なマスの数が分かる

普通は左上か左下に、「地雷の数 - 旗の数」が表示されているものと思います。 これは旗を使うプレイヤーにとっては有用なのですが、私のような旗を使わないプレイヤーにとってはあまり役に立つものではありません。 そこで、まだ開かれていない安全なマスの数を併記するようにしました。

  • ゲームオーバー時にどこが安全だったか分かる

ゲームオーバー時、論理的に考えて次に開いても問題がなかったマスをチェックマークで表示する機能を実装しています。 これは、論理的に必ず解けることが保証されているUnambiSweeperだからこそ出来るものです。

数々の問題点をクリアしている上に、上記の機能を有し運ゲーも発生しないUnambiSweeperって結構スゴイのでは?、と勝手に思ってしまいます。

お願い

これを書いている現在、UnambiSweeperのインストール数は20ちょっとしかありません。 もっとインストールして欲しいと云うのもありますが、正直他の類似アプリがこんなにDLされてしかもそれなりの高評価を得ている状況は非常にマズイと思います。

単純にプロモーションの差なのかなと思っています。

もしも私の主張に同意してくださる方がいらっしゃれば、是非とも他のアプリを駆逐してUnambiSweeperを台頭させることに協力していただければと思います。

というわけで、↓DL&レビューよろしくお願いします!!!

運ゲー排除マインスイーパ - UnambiSweeper - Google Play の Android アプリ

twitterはこちら。 DNEK@アプリ製作他色々 (@dnek_) | Twitter

(2016/12/18追記) 続きです(再掲)。

dnek.hatenablog.com

終わりに

長文駄文失礼致しました。

さて、明日の記事は、id:asRagiさんの神主講演に行った話 - らぎメモです!

KMC Advent Calendar 2015 - Adventarの他の記事はこちらからどうぞ。

www.adventar.org

*1:KMCでは前年の会長が自動的に代表に繰り上がる

*2:KMCのカースト最底辺が会長、次点が代表(要出典)

*3:damaはKMC内でのID、DNEKは主にAndroid Developerとして使っている名前

*4:2015年度現在は3回生なので2年前

*5:現状"Unambi Sweeper"と離して書いてしまうと検索にかからないので、ここだけ"Unambi Sweeper"書いておく(2015/12/10)

*6:両義的でない、の意

*7:NF2013とC85で出展した

*8:UnityなのでUnimbiSweeperと名付けた

*9:キーボードプレイは速さと正確さを兼ね備えた最強のプレイスタイル

*10:特に中級以上でオススメ

*11:Fキーで旗を立てられるようにしたりマスを開くタイミングをKeyUpからKeyDownにしたり

*12:当時、UnityからAndroid向けに出力するのもなんか嫌だと思ってた気がする、なんでかな?

*13:実はUnambiSweeperを作ってハマり過ぎたため自ら封印していた

*14:PCで云う右クリックなど

*15:ちなみに私はNF(non-flagging)プレイヤーです

初めまして。

初めまして。DNEKです。

最近Androidアプリを作っています。

とりあえず現在UnambiSweeperというものを公開しているのでよろしければ遊んで見て下さい。

簡単に云うと、運ゲーにならないマインスイーパー」です。操作性もいい感じだと思うのでよろしくお願いします。

Get it on Google Play

 

それから少し前にPietのエディタも作ったのでこちらもよろしくお願いします。

github.com