会社を辞めたソフトウェアエンジニアがUnityでゲームを作って稼げるのか?

会社を辞めたソフトウェアエンジニアがUnityでゲームを作ってお金を稼ごうとしているブログです。

Appleは神。なのか??

今回、タピタピタピオカってゲームを作ったんですが、そのバージョンアップをAppStoreに申請した時にリジェクトされた話をしたいと思います。

 

 

f:id:netadi:20191003070349p:plain

タピタピタピオカ

https://uphydn.net/tapioca/

 

結論から言えばGoogleAppleのレビュー体制がちょっと高圧過ぎない?という話です。

 

計2回リジェクトを食らったんですが、1回目は提出したバイナリは大丈夫らしく、AppStoreに掲載するメタデータ、サブタイトルのキャプションに問題があるとのコトでした。

 

【リジェクト理由(1回目)】

  • 2. 3 Performance: Accurate Metadata

Guideline 2.3.7 - Performance - Accurate Metadata



Your app subtitle to be displayed on the App Store include references to the price of your app or the service it provides, which is not considered a part of these metadata items.

Next Steps

To resolve this issue, please remove any references to pricing from your app’s subtitle, including any references to your app or service being free or discounted. If you would like to advertise changes to your app’s price, consider including this information in the app description. Changes to your app’s price can be made in the Pricing and Availability section of App Store Connect.

 

どうやら、「無料でタピ活!世界初(※)タピゲー!」という「無料」というキャッチフレーズをサブタイトルに使ってたのが原因のようでした。

 

これは修正して、「世界初(※)タピゲー!」だけにして再度提出しました。

 

したら...

 

 

Guideline 1.1.6 - Safety - Objectionable Content



Your app's metadata contains misleading content or content that is intended to deceive users.

Specifically, in your app subtitle.

Please note that adding a disclaimer to the app description is not sufficient if the rest of the metadata and the app are misleading.

The next submission of this app may require a longer review time, and this app will not be eligible for an expedited review until this issue is resolved.

Next Steps

- Review the Objectionable Content section of the App Store Review Guidelines.
- Ensure your app is compliant with all sections of the App Store Review Guidelines and the Terms & Conditions of the Apple Developer Program.
- Once your app is fully compliant, resubmit your app for review.

Submitting apps designed to mislead or harm customers or evade the review process may result in the termination of your Apple Developer Program account. Review the Terms & Conditions of the Apple Developer Program to learn more about our policies regarding termination. 

 

 

ユーザーを騙すようなキャプションはアカンぞ!?

 

というような理由でリジェクトされました...。

 

リジェクトされた理由は「世界初(※)タピゲー!」という今度は「世界初」に引っ掛かったと思われるんですが、タピゲーとして登録したゲームは世界初のつもりなんですが...。

 

ていうか、それなら最初のリジェクトの時にこの件についてもフィードバックくれよ!ていう感じですがね。

 

しかも同じサブタイトルがアカンという理由でレビュワーを怒らせてしまったのか、「次のレビューは長い時間が掛かるからな」とか「こんなユーザーを騙すようなタイトル付けてたらアカウント凍結するよ!?」とか言われる始末...。

 

 

何やねん、このデベロッパーをゴミのように見下したような扱いは!!

 

 

2回目のレビューの時は1回目の指摘が「無料」とか料金的なところを修正したらいいよ、としか言ってなくて、他はOKなんやー♪と思ってたからそこしか修正してないんですが...。

 

理不尽極まりない。

 

 

レビュワーは絶対神ですか?

 

というワケで、今のところ再審査に出してから3日経ちましたが、まだ審査待ち状態です。

 

 

ちょっと言いたいコト言ったった!

というコトで本日は以上です。

 

ワールドスコアランキング機能をつけたった(タピタピタピオカ)

Unityで制作してるタピタピタピオカの次期バージョンでは世界中の人にプレイしてもらって、自分の出したハイスコアがどれくらいの位置にランキングされてるのか見れたらいいな、と思ってワールドスコアランキング機能を追加しました。

 

タピタピタピオカ(iOSandroid用)

 https://uphydn.net/tapioca/

 

ちなみに以前はサーバーがなかったんで、Goggleのスプレッドシートを使ってワールドスコアランキングを実装してフィジビリティを確認したんですが、今回はレンタルサーバーがあるので、まあいい機会かなと思ってサーバーサイドのソフトウェアもイチから作ってみました。

 

【やり方】

①UnityでHttpリクエストのGETメソッドでスコア、名前をサーバーに送る。

例えば

https://uphydn.net/tapioca/php/xxxxx.php?score=100&name=hogehoge

みたいな。

 

②サーバー上のプログラム(xxxx.php)はリクエストを受信して、スコアと名前を受け取って、ファイルに保存する。

この時にデータはスコア順にソートしておく。

 

③サーバーはレスポンスとしてランキング200位までのスコアと名前のリスト(ていうか文字列のストリーム(独自))をクライアント(Unity側の端末)に送り返す。

 

④Unityがサーバーからのレスポンスを受け取ったら、それをリストにして画面に表示する。

 

 

とまあ、かいつまんで言うとこんな感じです。

 

結論として上手く実装出来て、動作確認も出来ました。

 

 

f:id:netadi:20191101221326p:plain

 

 

今回はサーバーサイドで手っ取り早くPHPを使ったんですが、PHPは超初心者なのでちょっとマナーとか検証とかいろいろと時間が掛かったワケなんですが...。

 

あとデータベースも使用してないので、世界中から同時にリクエストがあった場合の排他制御が上手く出来てるのかどうかも心配です。

(一応ファイルアクセス時にはロックを掛けるようにして、2台同時アクセスは検証しました)

 

ゲーム自体はそれほどダウンロードされてないのでそんなアクセスを気にする必要はないんじゃないかって?

 

うっさいわ!!!

 

まあ、ちょっと自己満足的な仕様ですが、これでワールドスコアランキング機能をつけたバージョンを実際にリリースして、データが壊れないかどうかを運用して確認してみたいと思います。

 

データが破壊されてもすぐにまたバージョンアップしたらいいかな、と気楽に考えてます!

FMEA診断上では致命的な欠陥にはならないですし♪

 

またソースコードGitHubにでも上げようと思います。

 

 

 

Unity Tips

------------------------------------------------------------------------------

 【問題点】

androidアプリをunityで作成していて、今回android版の64bitに対応するようにオプション設定し、1回目の公開リリース送信時はエラーなくアップロード出来たんですが、それ以降のリリースのアップロード時には「このリリースは Google Play の 64 ビット要件に準拠していません」とエラーが表示される。

 

 【解決方法】
Player Settingでx86のコードを含めたビルドだと上手くアップロードできない。

 

------------------------------------------------------------------------------

 【問題点】

Unity2018以降でプレファブのインスタンスのプロパティを書き換える(オーバーライドする)とずっと太字になってオーバーライドしたままになってしまい、プレファブで元のプロパティを変更してもオーバーライドされたままになってしまう。

 

【解決方法】

インスタンスの太字になったプロパティをインスペクターで右クリックしたらポップアップメニューが出るのでプレファブ設定のデフォルト値に戻せる。

 

------------------------------------------------------------------------------

 【問題点】

XcodeでArm7、Armv7を除くArm64のアーキテクチャのみでコンパイルしてAppStoreにアップロードしようとしたらエラーが吐き出される。

 

【解決方法】

bitcodeを生成しないようにアップロード時チェックを外す。(未確定情報)

 

------------------------------------------------------------------------------

 【問題点】
iTweenを使っている時にオブジェクトがSetActive(false)でアクティブでない時にそのオブジェクトに対してiTweenを使うとメモリ(ガベージ)が増えていく。

 

【解決方法】

SetActive(true)にするとメモリが解放される。

 

------------------------------------------------------------------------------

【問題点】

Unityで作成したプロジェクトをAndroid の実機で走らせると特定機種で画面が乱れる。(カメラのRect範囲外の余白部分)

 

【解決方法】

カメラを2台にしてサブのrectを0, 1, 0, 1の範囲でバックグラウンドをsolid colorかskyboxを設定する。(メインカメラのrectが0, 1, 0, 1より小さい場合)

サブのカメラのdepthはメインより小さな数にする必要がある。(でないとサブカメラが前にきてしまう)

カメラのY軸を180度とかローテーションして実際の画面と逆方向にするのがおすすめ。

サブのカメラを配置したらAudio Listenerが2つになってしまうので、一つコンポーネントを取り除く。

SetActive()について

===================================
「ひつじさん、かぞえてゲットン!」というアプリを作りました!
是非遊んでみてください!
android
https://play.google.com/store/apps/details?id=com.uphydn.straysheep
iOS
https://itunes.apple.com/jp/app/straysheep/id1442473289?mt=8
===================================

 

 

Unityのヒエラルキー上でオブジェクトが静的に生成されたとしてもSetActive()がfalse状態の時はそのオブジェクトにアタッチされているスクリプトのStart()は走りません。

Awake()も走りません。

 

ちょっと躓いたのでメモ。

 

 

iTweenでRotateToが動かない!

===================================
「ひつじさん、かぞえてゲットン!」というアプリを作りました!
是非遊んでみてください!
android
https://play.google.com/store/apps/details?id=com.uphydn.straysheep
iOS
https://itunes.apple.com/jp/app/straysheep/id1442473289?mt=8
===================================

 

 

iTweenは便利ですがちょっと挙動があやしいコトがあります。

 

RotateTo()でオブジェクトを回転させようとした時に回転しない場合は、角度指定を+360度余分に指定すると回転するコトがあります。

 


iTween.RotateTo(RightEar,
iTween.Hash(
"z", (float) (360f + 90f),
"time", 0.05f,
"easetype", iTween.EaseType.easeOutBounce
));

iTween.RotateTo(LeftEar,
iTween.Hash(
"z", (float) (-360f + -90f),
"time", 0.05f,
"easetype", iTween.EaseType.easeOutBounce
));

 

こんな感じ。

 

ちょっとハマったのでメモ。

 

コルーチンが止まらない!

===================================
「ひつじさん、かぞえてゲットン!」というアプリを作りました!
是非遊んでみてください!
android
https://play.google.com/store/apps/details?id=com.uphydn.straysheep
iOS
https://itunes.apple.com/jp/app/straysheep/id1442473289?mt=8
===================================

 

 

コルーチンを使っていて

StopCoroutine(AnimationRoutine());

などで止めようと思っても止まらない時があります。

 

その場合、一番簡単な方法は

StartCoroutine("AnimationRoutine");

StopCoroutine("AnimationRoutine");

 とコルーチン名をstringで渡すようにすると上手くいきます。

 

ていうか何やねんこの仕様。

 

ハマったのでメモ。