こんにちは。海行です。
ポケモンGOに対抗してユニティちゃんGOを作りました。
「ユニティちゃんGO」がGooglePlayで公開されました!これでユニティちゃんを捕まえ放題じゃぞおおおお!!今すぐダウンロード!! https://t.co/umFJCMBPpD pic.twitter.com/ASVqAbPj9c
— 海行(うみゆき) (@_darger) July 28, 2016
ユニティちゃんGO、できたよ pic.twitter.com/zgm4yujMLT
— 海行(うみゆき) (@_darger) July 27, 2016
えっ、家にいるとポケモンを捕まえられなくてつまらない?だったらユニティちゃんを捕まえればいいだろ!という訳で「ユニティちゃんGO」のAndroid用apkを配布します。遊んでどうぞ。 https://t.co/t5L354HWip pic.twitter.com/wRLEy6pxOA
— 海行(うみゆき) (@_darger) July 28, 2016
AndroidがあればGooglePlayからダウンロードできるので、ぜひ遊んでみてください。
https://play.google.com/store/apps/details?id=jp.ne.sakura.soysoftware.unitygo
何故クローンゲームを作るのか
何故私はクローンゲームを作るのか。
その行為にどんな意味があるのでしょうか。
まず、やっぱりそのゲームが好きだからこそ真似したくなるという事があると思います。
次に、そのゲームが話題だからという事。
話題に乗っかりたいという事もあるでしょうし、何より物凄い話題になってる物というのはゲームに限らず歌や漫画などのコンテンツでも、その中に一定の真理が含まれているからこそみんなの心に響いて話題になったのでしょう。(このロジックは蒼天航路からの受け売り)
つまりクローンゲームを作ることはその元ゲーム、ひいては真理を理解するという事なのです。
もちろんゲームを普通にプレイするだけでもそのゲームのルールや攻略法は理解できます。
そのゲームが面白いのか、面白くないのかも触れば自分自身がのめり込むかどうかで判断できます。
でも、そのゲームが何故面白いのか、そもそも何故こういうルールになってるのかなどはプレイしてもハッキリこうだと理解するのは難しいです。
同じようなゲームが一杯出てジャンル化したゲームなら、似たゲームとの差分を比べてこっちはこの要素があるから面白い、など論じる事はできますが、いきなり画期的なゲームがポンと出てしまった場合は比較対象が無い内は分析は困難です。
そんな時、そのゲームの何が面白いのか理解したい時はクローンゲームを作ることが一番手っ取り早いのです。
クローンゲームを作ってみて、原作と同じように作ったのにこっちは全然面白くない、という事であれば、原作の面白さはクローン側でまだ未実装の部分か、あるいは見逃してる秘められたパラメータか何かにあると切り分けができます。
逆に、原作と同じ面白さがある!という所までいけば、後はどこまで要素を削ってその面白さが維持できるか、あるいは何をどこまで変えたらつまらなくなるか、あるいは面白くなるかを調べる事で原作の何が面白いのかが浮き彫りになります。
~のようなゲームを作りたい!と思ったら、まずは原作を完コピして面白さを理解した上でアレンジするという流れが鉄板だと思います。
クローンゲーム制作最速のメソッド
そういう訳で「クローンゲーム制作最速のメソッド」と題して、開発中のツイートの記録を頼りにユニティちゃんGOリリースまでの制作日記を書いてみたいと思います。
■7月22日 ポケモンGO日本リリース
ポケモンGO来たぞおおお!みんな 傘持ったな!!行くぞォ! →RT
— 海行(うみゆき) (@_darger) July 22, 2016
オラッ!ピカチュウ!観念してイけっ!!てか街は早くもトレーナーだらけやぞ…マジ。すでに2人すれ違ったもん pic.twitter.com/Q5oRHU6miG
— 海行(うみゆき) (@_darger) July 22, 2016
この日の10時頃に日本でポケモンGOがリリースされました。
私はポケモンGO発表時からこれは物凄いゲームになると予測して注目していたので、リリース直後に早速ダウンロードして雨の中ピカチュウを捕まえに出撃していますね。
これ(https://t.co/YEjzJx56Am)を使ってingressのポータルデータを抽出しようと試したらエラーが出てしまうんですが、ボット対策がかかって抜けなくなってるらしい。
— 海行プログラム (@kaigyoPG) July 22, 2016
↑12時の時点ですでに不穏な動きが見られます。
早速クローンゲーム制作に着手しようと考え始め、まずはIntel MapからIngressのポータルデータ(これはポケストップのデータに転用されてます)をぶっこ抜こうと考えたようです。
しかし、NIANTICにとってはプレイヤー達と一緒に当然苦労して作り上げたポータルデータは大切な財産でありますし、データぶっこ抜きはサーバーに大きな負荷がかかってしまうなどの理由からか、Intel Mapにはすでにボット対策が仕掛けられており、ぶっこ抜きのスクレイピングスクリプトは動作しなくなってました。
ingressからデータ抜くよりオープンストリートマップから抜いて使う方がリーガル的にも無難やろなあ
— 海行プログラム (@kaigyoPG) July 22, 2016
13時には方針を転換してもう少しリーガルな方法を考えようという事で、オープンストリートマップというオープンソースの地図プロジェクトのデータを利用しようと考えたようです。
ライセンスもクリエイティブコモンズなのでこっちの方が無難でしょう。
オープンストリートマップ、ここ(https://t.co/oBSn8yXwbR)から1GBの日本のデータ落としてこちら(https://t.co/gV4192xxSa)のツールでPOIを抽出したCSV化したら26MBか…。変な改行入ってたから秀丸マクロで整形する必要ありましたが
— 海行プログラム (@kaigyoPG) July 22, 2016
オープンストリートマップから日本の地図データをダウンロードしてスポットのデータを抽出することに成功したようです。
抽出データはIngressのポータルデータの代用として使えそうですね。
■7月23日 仕様把握
この日はたしか仕様把握という名目でポケモンGOで遊びまくってて、とりあえずLVを5にしてジム戦を試してみたりした気がします。
UnityでSQLiteを使うにはSQLiteUnityKitってのがGitHubにあるそうな(https://t.co/CAnh4YQrZO)でもいくつか問題点があるらしい(https://t.co/mFwJy77UY8)
— 海行プログラム (@kaigyoPG) July 23, 2016
オープンストリートマップから抽出したスポットデータはSQLiteに保存してUnityに読み込ませようかななどと画策しています。
なんで前回GPSゲーム作るのやめたんだろと思ったら、そういや地図表示アセットがMapQuestにAPI発行してマップタイル取得するんですが、この取得量のAPI回数制限が結構キツいんだった。ってかもうMapQuestはマップタイル取得サービス停止してるし…
— 海行プログラム (@kaigyoPG) July 23, 2016
昔試したマップ表示アセットを引っ張り出したようです。
ポータルデータの次は地図表示をどうするかについて考えてますね。
この時試したアセットでは内部でMapQuestというサービスを呼んでいるのですが、残念ながらすでにMapQuestのタイルマップ要求APIはクローズしてしまってました。
ActionStreetMapでお散歩。六本木ヒルズ付近、御茶ノ水付近、渋谷付近 http://t.co/OjVDINOqTL #unity pic.twitter.com/xV8MAUWc8Q
— 椿 (@tsubaki_t1) August 20, 2015
ActionStreetMap(https://t.co/FrbTkHleD2)ってのを使ってオープンストリートビューのデータをUnityで表示される方法について考えましたが、通信したくないからローカルに持たせたろと思いましたが、日本だけでも3GBだの6GBとローカルに
— 海行プログラム (@kaigyoPG) July 23, 2016
@kaigyoPG 持っていいサイズじゃないですね。要らんデータを削除すれば容量減るかなと思っても、OSMの編集方法わけわかめだし、あんまり減らない気もする。う~~~む、ってかGoogle Maps APIってAndroid端末で表示する分には無償版なら無料なんですね。う~~~む
— 海行プログラム (@kaigyoPG) July 23, 2016
ActionStreetMapという、オープンストリートマップのデータを読み込んで3Dのマップを表示してくれる無料Unityアセットの使用を検討してますが、使い方がわからず(ドキュメントもない)このあと諦めます。
GoogleMapsAPIの規約を見たら、無償版は基本的には無料で誰でもダウンロードできるって前提が必要なんだけど、GooglePlayとかAppStoreで配布するモバイルデバイスのアプリなら有料でもいいって書いてますね。 https://t.co/wFC5V2KnL0
— 海行プログラム (@kaigyoPG) July 23, 2016
ホントはActionStreetMapってアセット使いたかったけど使い方わかんないしドキュメントも無いので諦めた。昨日はGoogleMap使おうかなと言いましたが、無料のGoogleMapsAPIはGoogleMapのViewを使う感じでUnityから使えないし、Unityから→
— 海行プログラム (@kaigyoPG) July 24, 2016
@kaigyoPG 読み込めるStaticMapsAPIは一日25000枚しか取得できない(一人当たりじゃなくてアプリ全体で)のでボツ。
— 海行プログラム (@kaigyoPG) July 24, 2016
ここではGoogleMapのStaticMapsAPIの使用を検討してますが、まず勘違いしてるのがGoogleMapsAPIが無料というのはAndroidのViewにGoogleMapを表示できるサービスの事で、Unityからは使えない物です。
Unityでテクスチャとして読み込めるタイルマップ画像を取得できるStaticMapsAPIもありますが、こちらも無料枠は1日に2万5千枚までとかなり限定されてるのでボツに。
■7月24日
巷ではポケモンGOが流行ってるらしいので、便乗してUnityちゃんGO作ってみました。 pic.twitter.com/BkZS5FAG8y
— マサキ㌠(おーちゃん) (@Masaki_ponpoko) July 23, 2016
↑そろそろ私以外にもユニティちゃんGO制作に取り掛かる方が現れてます。
クローンゲーム開発競争は熾烈な争いだ。
ポケモンGOがHoloLensに対応したらこうだぞ pic.twitter.com/QkdTTmI0qX
— 海行(うみゆき) (@_darger) July 24, 2016
↑その頃私はこんな漫画を描いていた。
オープンストリートマップの日本地図をUnityで読み込もうとしたらメッチャ大変だったメモ。まず日本のpbfファイルが1GBもあるので余計なデータを消してサイズを小さくしたいので、QGISで読み込みます。そんで道路のレイヤーを選んでメタデータとかを消すために一旦dxfで保存して→
— 海行プログラム (@kaigyoPG) July 24, 2016
@kaigyoPG もう一回インポートして今度はshapefile形式で保存します。次はJOSMってソフトを立ち上げてshapefileを読み込んでosm形式に戻します。この時点で1GBあったファイルを73MBにできてます。データから地名とかは全部消えてるけど。
— 海行プログラム (@kaigyoPG) July 24, 2016
@kaigyoPG それでできたosmをOSMToUnity(https://t.co/GkF87QUJQp)でUnityに持ってこようとしてるんですが、パースし終わるのにあと数時間かかりそうな感じなので待ってます。まあ一度読み込めば後は小分けのプレハブとかにすればいいんで。
— 海行プログラム (@kaigyoPG) July 24, 2016
@kaigyoPG 僕は地図データ界隈は素人ですが、使いやすいデータ形式ですよ~いろんなソフトで変換サポートされてますよ~との事でしたが、実際は罠だらけで解法は多分これしかないかもしれない。散々嵌った。もっと簡単にosm編集する方法知ってらしたら誰か教えてください
— 海行プログラム (@kaigyoPG) July 24, 2016
通信でタイルマップを取得するのは諦めて、またもやオープンストリートマップから道路のデータだけを抜き取ってローカルに持たせようかなという事について画策してますね。
■7月25日
この日には、GPS使って地図表示してポケストップどうこう…って仕様を再現するのは結構手間だから、とりあえずはボールを投げてモンスターを捕獲するところだけ作ってとにかく一番乗りでリリースする事に集中しよう!という事を考え始めました。
え…なんかGalaxyS6でバックカメラがWebCamTextureで取得できないんだけど…とググッたら、どうもGalaxyS6でUnity5.3.5とandroid6.0.1の組み合わせで再現するらしい。これは困りますね https://t.co/bf7e0G4Gv2
— 海行プログラム (@kaigyoPG) July 25, 2016
@kaigyoPG Unity5.4.0f1RC2で試したら直ってました。めでたしめでたし
— 海行プログラム (@kaigyoPG) July 25, 2016
差しあたってまずUnityでジャイロセンサーを使ってARでユニティちゃんを表示しようとしてさっそくトラブってる様子。
Unityでスワイプ検出。一昔前まではこういうの有料アセットしかなかったのに、いい時代だ…naichiさんありがとう。最新版の使い方は記事じゃなくてGitHubの方に書いてる 【Unity】スワイプ、フリック操作を検出してみる。 https://t.co/jsSFVgXwuo
— 海行プログラム (@kaigyoPG) July 25, 2016
寝るまでにスワイプでボールを投げるあたりまでは作ったっぽいです。
■7月26日
3Dキャラに追従してUI表示させたりするのはコチラを参考にしました。3種類のCanvas全パターン載ってます 【Unity】【uGUI】Screenの座標とWorld(3D)座標の変換について – テラシュールブログ https://t.co/Koc1psYfvE
— 海行プログラム (@kaigyoPG) July 26, 2016
キャラの頭の上に名前とCPが表示される奴を作ろうとしてますね。
UGUIの要素の描画順ってどうなってんだっけ?とググッたらヒエラルキーの上から順番なのか…。アッハイ。でもそれだと子要素を親より奥に描画できないですね。たしかに子の方が手前に描画されるのが常識的感覚ではあるのですが
— 海行プログラム (@kaigyoPG) July 26, 2016
こちらで紹介されてるUGUIでTweenができるアセットが便利でまた使わせてもらおうとしたら、uTweenAlphaがfrom,toの値→ uGUIでTweenしたい!! – WonderPlanet DEVELOPER BLOG https://t.co/ohYv6dT7CH
— 海行プログラム (@kaigyoPG) July 26, 2016
UI周りを作っていますね。
Androidでスクショ取る奴やろうとしたらエラー出ますね。こちらを参考に直前にWaitForEndOfFrameを挟んで解決 ReadPixels was called to read pixels from system https://t.co/5zSiDDOF7N
— 海行プログラム (@kaigyoPG) July 26, 2016
撮影ボタンでスクショが撮れる奴を作ってますね。
■7月27日
なんかLoadLevelのタイミングでGalaxyJで落ちますね…GalaxyS6は大丈夫なんだけど。どうもWebCamTextureをPlayしっぱなしでLoadLevelしてるのがマズいらしく、直前でStop入れたら行けた https://t.co/Pv0FRUI2nb
— 海行プログラム (@kaigyoPG) July 27, 2016
クリアしたらLoadLevelで最初に戻してシーケンスを通そうとしてますね。
セーブデータをシリアライズするのにLitJsonを使うべきかJsonUtilityを使うべきか…JsonUtilityの方が速いし省メモリだけどListやDictionaryがシリアライズされなくてめんどい… JsonUtili https://t.co/DA8l1h9nvY
— 海行プログラム (@kaigyoPG) July 27, 2016
セーブ、ロード周りを作ろうとしてますね。
Unityはアセットインポート中も作業させてくれないかな。ヒマぶっこきだわ
— 海行プログラム (@kaigyoPG) July 27, 2016
この4000個サウンドが入ってるっちゅうアセット、一杯あって嬉しいけどインポートクソ長いから胃痛がしてきて嬉し悲しですわ
— 海行プログラム (@kaigyoPG) July 27, 2016
大体完成したのでさっさと効果音を入れて動画を撮ってアップしたいのに効果音集アセットのインポートに時間がかかりすぎてイライラしてますね。
前触れなくGalaxyS6でSDユニティちゃんの表示が崩れだした。GalaxyJだと正常表示。ははは…面白いですね。エディタだと正常だし実機でデバッグするっきゃないなとMonodevelop起動したら起動せず落ちる。一層面白くなってきやがったぜ
— 海行プログラム (@kaigyoPG) July 27, 2016
@kaigyoPG SDユニティちゃんの表示直りました…SDユニティちゃんをインポートした後にボイスも欲しくなってリアルユニティちゃんの方もインポートしたのですが、その際共通で利用してるシェーダが上書きされて表示が崩れたようで、もう一度SDユニティちゃんインポートしたら直りました
— 海行プログラム (@kaigyoPG) July 27, 2016
ここに来て実機での表示バグに遭遇してテンパってますね。
ユニティちゃんGO、できたよ pic.twitter.com/zgm4yujMLT
— 海行(うみゆき) (@_darger) July 27, 2016
また一つ、クローンゲームジャムの戦いが終わった
— 海行(うみゆき) (@_darger) July 27, 2016
結局朝までかかっちゃってますが、とりあえず完成したので動画上げて寝たようです。
寝る前にユニティちゃんの画像アセットを使ってアイコンなどをササッと作って、GooglePlayにアプリ申請も出しておきました。
■7月28日
最初にGooglePlayに提出した時、「このアプリには著作権侵害コンテンツが含まれている!」って却下されましたが(最近はGooglePlayもちゃんと事前審査するのか)気持ちは分かるがセーフなはずだ!と思って証拠ファイルとしてユニティちゃんライセンスpdf送ったら分かってくれた
— 海行プログラム (@kaigyoPG) July 28, 2016
起きて確認したらGooglePlayに提出したアプリは著作権侵害の容疑で却下されてましたが、ここは慌てずにユニティちゃん関係のアセットについては正当な権利を得て使用してる旨を返信しておいて、とにかくさっさとみんなに遊んでもらえるようにアプリ公開したかったので一旦自分のサーバにapkをアップしました。
えっ、家にいるとポケモンを捕まえられなくてつまらない?だったらユニティちゃんを捕まえればいいだろ!という訳で「ユニティちゃんGO」のAndroid用apkを配布します。遊んでどうぞ。 https://t.co/t5L354HWip pic.twitter.com/wRLEy6pxOA
— 海行(うみゆき) (@_darger) July 28, 2016
UnityAdsの導入は実際簡単でした。特に言う事はないくらい簡単 超簡単!動画広告「UnityAds」の実装方法 〜ver. 5.2以降SDKも必要なし!!〜【Unity】 | Unity開発Tips https://t.co/uayGZBJ7Zx
— 海行プログラム (@kaigyoPG) July 28, 2016
今回、せっかくなので新しい試みとしてUnityAdsの導入もやってみました。
動画広告を観るとボールが30個もらえるって奴です。
Excel Importer Maker、WindowsでもMacと同様に、Excelを開きっぱでパラメータ調整しながらエディタで動作確認出来るようになったので、使い勝手が多少良くなったと思う(個人的な感想 pic.twitter.com/Mh0g9Ss1I2
— 椿 (@tsubaki_t1) July 28, 2016
Excel Importer Maker、ちょうど多言語対応のエクセル読み込むのに使うところでした。Excel保存して閉じて反映だったのが閉じずに保存で反映するようになったんですね。便利オブ便利 →RT
— 海行プログラム (@kaigyoPG) July 28, 2016
ExcelImporter、どういう感じで使ってたっけ?って昔のソース見たらゲーム開始時にDictionaryに詰めてたのか…。詰めるならインポート時でよくね?と試してみたけど、そういやDictionaryはシリアライズされないからscriptableObjectに保存できないわ
— 海行プログラム (@kaigyoPG) July 28, 2016
「ユニティちゃんGO」、自鯖(https://t.co/S7M8i3kC0h)のapkの方には端末の設定言語でアプリ内の言語が日本語と英語で切り替わる機能を入れました。GooglePlay側にも提出したのでもうすぐアップデートされると思います。
— 海行プログラム (@kaigyoPG) July 28, 2016
Googleの審査中にとりあえず新機能として日本語と、英語の言語切り替えを実装してます。
「ユニティちゃんGO」がGooglePlayで公開されました!これでユニティちゃんを捕まえ放題じゃぞおおおお!!今すぐダウンロード!! https://t.co/umFJCMBPpD pic.twitter.com/ASVqAbPj9c
— 海行(うみゆき) (@_darger) July 28, 2016
そうこうしてる内に無事に審査が終了してユニティちゃんGOがGooglePlayで公開されました。
めでたしめでたしです。
という訳で以上がユニティちゃんGO制作のあらましとなります。
今後の展望
完成して公開はしたものの、だからと言って最初の方で書いたような、ユニティちゃんGOを作る事でポケモンGOの面白さの謎がわかったのか?というと、まだそこまでは…という感じですね。
話が違うやんと思われるかもしれませんが、今回は要するに再現率がまだ低いせいかなと思います。
誰よりも早く出したい!と焦るあまり、結局ボールを投げて捕獲、の部分しかできてないですからね。
という訳で、今後の展望としては、GPS地図機能周りや捕獲したキャラのコレクション機能などを強化して、より原作に近づける事が一番ではないでしょうか。
その後は独自の機能を入れたりして新たな面白さを付加していける流れに持っていけたらベストですね。
1 Pingback