FreelyApps

個人によるアプリ開発の日記です。アプリの収入だけで生活できるようになるのが目標です。UnityでAndroid向けのゲームアプリを作成しています。


    アプリ『トランプ・ジン・ラミー』を公開しました。
    Android/iOS https://goo.gl/PYKFYG

    2015年12月

      このエントリーをはてなブックマークに追加 Clip to Evernote
    次のアプリはゲスイットというトランプゲームを題材にしたアプリにする予定です。
    ゲスイットはあまり馴染みがない人が多いと思いますが、単純なルールですぐに覚えられます。2人で遊ぶためのゲームで読み合いや騙し合いの駆け引きが面白いゲームです。

    ちょっと紹介すると、A~Kまでのスートの一揃い13枚のカードを使います。6枚ずつ配り、余った1枚のカードが何かを当てるのが目的です。自分の手札がヒントになりますが、それだけだと1/7で当たるだけのゲームになってしまうので、順番に特定の行動ができるようになっています。
    自分の番には質問か解答のいずれかのみができます。質問はA~Kまでのどれか1枚について相手に持っているかを聞くことができ、相手はそれに対し正しいことを教えなければなりません。またあるカードについてした質問は自分も相手もできなくなります。解答は余った1枚のカードが何かを当てることです。当たれば勝ちですが、外れれば負けになります。解答したらゲームは必ず終わります。
    勝つ方法は自分で余った1枚のカードを当てるか、相手に外させるかのいずれかです。
    要は自分の持っていないカードを質問して当てる確率を高めたり、自分の持っているカードをわざと質問して相手を混乱させたりするということになります。

    表情などから駆け引きしたりするのが面白かったりするので、対人が面白いのは言うまでもないです。ただ質問に制限があるので、どの質問がされたかをメモしておくなどが必要です。ちょっとした暇つぶしにはやはりアプリに分があります。手軽さと練習にはアプリがよく、知っている人とは対人戦が面白いというのがトランプの特徴だと思います。

    Unity 5.3.1で作っているのですが、PlayerPrefsのファイルが見当たらなくなったりと色々変わっていて困っていることが多いです。もしかしたらバージョンを下げてUnity 5.2にしてリリースするかもしれません。
    Unity 5.3を使う理由が今のところないので、安定性の方が大事だからです。

    今後はしばらくトランプのアプリを作っていく予定です。
    ゲスイットができたら、ポーカーを作ろうと考えています。ふつうのポーカーと思われている5カードドローも良いですし、他の変わったものも良いです。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    ヒエラルキーにスクリプトをドラッグアンドドロップしたら、そのスクリプトがアタッチされたゲームオブジェクトがヒエラルキーにできると思っていたことがありました。それはプレハブをドラッグアンドドロップするとそのコピーができることからそんな勘違いをしていたのです。
    そうなっていてほしいことがそうなっていないので、Unityを使っていて長い間不満でした。それでどうにかできないかと思っていたので、今回なんとかしてみました。スクリプトはC#のみ対象です。BooやJavaScriptの方は型の情報が取れなかったので、やめました。といってもC#がメインでしょうからあまり関係ありません。


    以上のようにMonoBehaviourを継承していようが、継承していなくても関係なくスクリプトをヒエラルキーにドラッグアンドドロップしても何も起こりません。これはUnityの通常の挙動です。
    MonoBehaviourを継承したクラスはゲームオブジェクトにアタッチできますから、MonoBehaviourを継承したクラスのスクリプトをヒエラルキーにドラッグアンドドロップしたら、新しいゲームオブジェクトをヒエラルキーに作成しそのスクリプトをアタッチするというように変更したいと思います。


    できたものの動作は以下のようになりました。
    MonoBehaviourを継承したスクリプトのみ反応して、ゲームオブジェクトが作られています。(partialを使った場合は、クラス名と一致するスクリプトのときだけ反応します。)



    これをどうやって作ったかは結構難しい話になると思います。まず参考にしたサイトがいくつかあるのでそれを挙げておきます。
    Unity5 HierarchyにC#スクリプトをドラッグ&ドロップできるようにするエディター拡張
    Create GameObjects/Components by Dragging Assets to Hierarchy/Inspector
    の2つです。特に前者の方の目的はやりたかったことそのままと言ってもいいです。じゃあわざわざ作る必要があったのかとなりますが、うまく動かなかったので自分で作ることにしました。

    以下に作ったコードを載せておきます。現在、私が使っているUnityのバージョンは5.3.1f1 Personalです。これで動くことは確認しています。使い方は、UnityのプロジェクトにEditorフォルダを作りそこにこのスクリプトDropScript.csを置けば使えます。
    ログに”DropScript AutoStart”と出れば読み込みが完了しています。

    #if~#endifの部分は手動でこの拡張機能をON/OFFするためのものです。使いたい場合は適当なdefineを入れてください。
    重要なのはリフレクションを使って型の情報を取っている部分です。(Unity4だったら、名前でAddComponentできるので、それにclassNameを渡すだけで良いです。)Types.GetTypeという部分がドキュメントには載っていないので、使い方が正しいか微妙です。
    ドラッグのイベントは何度も呼ばれてしまうので、boolフラグで一度だけ呼び出されるように対処しています。

    完成したものは十分に要件を満たしていますが、いくつかの欠点があります。もう少し改善すると注意せずに誰でも使えるものになりますが、ちょっと無理そうなのでそれはしません。
    • ヒエラルキーにゲームオブジェクトがひとつもないと反応しない
    • スクリプトをドラッグしたままヒエラルキーを横切るとゲームオブジェクトができてしまう
    • スクリプトをドラッグしてゲームオブジェクトにアタッチすると、ついでにゲームオブジェクトができてしまう
    1つ目はEditorApplication.hierarchyWindowItemOnGUIがヒエラルキーにあるゲームオブジェクトから呼ばれているようなので、他の判定方法がないと改善できません。よって、これはどうしようもないと……
    2つ目はドラッグ中にヒエラルキーのウィンドウ外に出ることをドロップと判定されているようなので、おそらくどうよもないです。
    3つ目は個人的に結構大きな問題と考えています。ドラッグでのアタッチをやめてボタンからコンポーネントをつければ競合しないですが、気をつけないと知らずに不要なものができてしまうので問題です。
    まあ何らかの方法で対応できるかもしれませんが、これを使うとこんな感じのこともできるのでこのままの方が使えると思っています。ヒエラルキーをまたぐように行ったり来たりして大量のゲームオブジェクトを作っています。


    これすごく便利だと思うので、Unityの公式の機能としていずれ追加してほしいです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    MVNOを使えばスマートフォンにしても料金が抑えられるということで携帯電話をスマートフォンに変えました。それにあたってSIMフリーのスマートフォンが必要になったのですが、新しく用意することにしました。

    既にAscend G6という端末を買っていたのですが、 処理能力が低く電池の持ちも悪いので良い端末を買おうと思いました。Ascend G6は廉価なのでスペック不足なのはしょうがないのです。むしろ一番気になったのは発熱でした。通話中にこれだけ熱くなったら嫌だなあというのが、電話として使うのにためらわれた理由でした。
    Ascend G6はスマートフォンの便利さを教えてくれましたが、物足りなさがあったのです。

    最終的にはNexus 5Xを買ったわけですが、他にも候補がありました。
    も良さそうな端末だと思いました。これらは大きさが小さめでそれなりの性能の端末です。Androidの更新がされていくなら、これらの端末もアリだと思います。開発機としても使いたいことを考えると、Androidの更新がサポートされないのは大きなデメリットです。Nexus 5はAndroidの更新がサポートされていますが、今だと少し性能が低い感じです。
    値段は新品でXperia J1 Compactが4万円くらい、Xperia Z3 Compactが5万円後半くらい、Nexus 5が4万円くらいです。Xperia Z3 Compactは4万円くらいだったのですが、今は結構高くなってしまいました。

    一番Nexus 5が良さそうだと 思ったのですが、新型のNexus 5Xが既に出ていてどちらにしようか迷いました。性能が優れ新しいAndroidを搭載しているので、Nexus 5Xを買うことにしました。ちょっと値段が円安の影響で高かったのが微妙ですが、それ以外ではかなり満足できる機種だと思います。(最新のAndroidを入れたい人でなければあまり魅力的ではないかもしれませんが……)


    最も便利だと思った機能は端末の背面にある指紋認証機能です。スリープ状態で登録した指を指紋認証部分に当てるとロックが解除されます。
    これはやってみると非常に便利な機能であることがわかります。普通は電源ボタンを押してパスワード認証を経て使えるようになります。パスワード設定しないことはないでしょうから、いちいち認証するのは結構な手間です。指紋認証機能では指を当てるだけなので、ほんの数秒で済みます。たまに通常のパターン認証などを求められますが、ほとんどは指紋で認証されます。
    また指紋認証ができたかが振動でわかるようになっています。成功すると短く1度振動し、失敗したら短く2度振動します。持ってみると違いは明らかなので、手元を見ずに操作ができます。 

    • カテゴリ:
      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity UIにはOutlineというコンポーネントがあります。
    実は影をつけるエフェクトもそうなのですが、単にコピーを下に描いているだけのものです。コピーの数は上下左右で4つです。そのため描画する文字は5倍になります。
    outline
    OutlineコンポーネントのEffect Distanceを大きな値にすると4つのコピーがあることがわかります。

    outline-edge
    「あ」の右下のはらいの部分で縁がいびつにになっているのがわかります。大きな文字だと意外と気になることもあります。
    4つコピーを配置することでも十分なこともあるのですが、もっと多くのコピーが存在している方が文字の縁が綺麗になります。ある文字から等距離にコピーを配置していけばうまくいきます。つまりコピーはオリジナルの文字列から一定距離の円周状に配置します。
    Unite2015 uGUIの拡張と応用」を参考に拡張したOutlineコンポーネントを作ってみました。拡張したOutlineコンポーネントCircleOutlineのソースコードはこの記事の一番下に置いておきます。(Unity 5.2.3では動いていますが、Unity 5.3以降でBaseMeshEffectの使い方が変わっている可能性があります。実際5.2で何回か変わっていて、そのたびに少しずつ変えています。)

    CircleOutlineで縁をつけたものが以下のようになります。10個のコピーを使った例が下の文字になります。縁が丸みを帯びて滑らかになっているのがわかります。
    circleoutline

    これはアウトラインが単なるコピーによってできていることを示す動画です。
    かなり離れたところに出るように設定してあるので、増えていくと円形の模様になっています。
    ol
     
    コピーしているという性質上オリジナルのアルファを下げていくと、コピーが重なっているところが目立ってきてしまいます。不透明にして使うとコピーがオリジナルに隠れて最も見やすいです。
    アウトラインをつけられるのはUIの要素のText以外にもImageも可能だったりします。

    ソースコードを以下に載せておきます。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    知っている人も多いと思いますが、Android6.0でも隠しゲームがやはりありました。
    ゲームの内容がAndroid5.0と変わらなかったのは残念ですが、相変わらず難しいゲームです。

    遊び方は設定画面の一番下にある端末情報を開きます。
    m6settings

    次にAndroidバージョンと表示されている項目を連打します。それなりに早く連打しないと認識しないようにできています。裏技みたいなものなので、偶発的に起こる可能性を低くしているのでしょう。
    m6terminalinfo

    コマンドが認識されると以下のようにマシュマロっぽいドロイド君が現れます。
    m6fb

    このイラストをタップしたりタッチしたりすると反応します。これをいじるとゲームが始まるようになっています。何故こんな風になっているのかは遊び心の結果だと思います。

    ゲームを始めまでが非常に長いです。
    マシュマロをタップしたり、タッチし続けたりしていると突然ゲームが始まります。何を条件にスタートしているかわかりませんが、いじった回数とかもあるんじゃないかと感じます。 

    Android6.0でのゲーム画面は以下のようになります。マシュマロによってプレイヤーが止められます。
    タッチしている間ドロイド君が浮いていきます。障害物を潜り抜けられそうになるタイミングで放すことでゲームは続きます。何回通り抜けられたかを競うゲームです。
    m6fb3

    このゲームは「Flappy Bird」というゲームを元に作られているらしいです。難しくて本家の方も話題になったようです。
    超難しい設定になっているので10回くらいくぐれたらすごいと思います。

    ちなみにAndroid 4.4とかでも同じ手順で隠し機能があります。 いつからあるんでしょうか?

      このエントリーをはてなブックマークに追加 Clip to Evernote
    12/12に「トランプ・ナポレオン」を3.0にアップデートしました。

    大きな変更としてはチュートリアルを作成しました。メニューの項目が増えてしまったので、メニュー画面は以下のように修正をしました。
    ゲームの説明など使用頻度が少ない機能は全てその他にまとめることにしました。
    menu-tutorial

    メニューからチュートリアルを選ぶと
    tutorials
    チュートリアルの一覧が表示されます。1~6までやればナポレオンのルールが理解できるようになっていると思います。1番目からやっていくとわかりやすいです。

    tutorial-explain

    チュートリアルのイメージは上の画像のようになります。
    どうしてもルール説明のために文字は多くなってしまいますが、体験を伴いながら説明をわけて聞いていくので長文を見るよりは楽なはずです。 

    チュートリアル以外の3.0での更新についてはナビゲーションバーを常に出すように変更しました。 どうしてもナビゲーションバーが出たり消えたりするたびに表示の領域がうまく更新されないということが発生しているようだったので、常に出すことで問題ないようにしました。
    リザルト画面でTwitterへの投稿をできるようにしていたのですが、他のSNSでも投稿できるようにしてみました。また、ゲーム終了時にスクリーンショットを撮りそれを投稿に付与するようにしました。(Android 6では駄目かもしれませんが、文字での投稿は可能です。) 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Google Play Developer ConsoleにはクラッシュとANRという項目があります。
    これはアプリのクラッシュ(強制終了)とANR(アプリが応答しなくなる) がどれくらい起こっているかのレポートを見るものです。

    少し前にこのようなレポートが上がっていました。
    タイトルにjava.lang.Error: FATAL EXCEPTION [main]と書かれていて、何が起こっているかわかりませんがまずそうな感じなのはわかりました。
    原因は、
    Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@2bbfaf22: Unmarshalling unknown type code 7274595 at offset 12だと書いてありました。ParcelでUnmarshalling unknown type codeが起こったということです。

    admob-interstitial-error
    Parcelクラスはデータを保存できるオブジェクトを作れるもののようです。オブジェクトも保持できるとのことなので、内部的にはバイト列をもつクラスなのでしょう。(C#でいうとシリアライズ、デシリアライズに対応するのだと思います。)
    このクラスのreadValueが失敗するわけですが、クラスの読み込みがうまくいっていないということです。そこまではわかったのですが、どんなオブジェクトが来ていて、どこで読み込みに失敗するかはまるでわかりません。下の方にある呼び出し元を見るとInterstitialというところから呼ばれているのがわかります。これはインタースティシャル広告の開始のことでコードはライブラリの中です。

    もはやコードを見ることはできないので、検索して調べることにしました。
    同じような問題に遭っている人がいるようでGoogleに質問していました。 議論を見てみると、最後にGoogleがバグを修正したとあります。
    UnityにAdMobで広告を出している場合、Unity向けのパッケージを更新すればいいのか、google_play_servicesライブラリを更新すればいいのか、はたまたどちらも更新が必要なのかはわかりませんでした。
     
    どうもすべての端末で起こるわけではないようでしかも11月頃から発生したことのようです。 それまで発生しなかったことを考えると広告配信のデータの形式が変わり、機種(Android version)によってはそれに対応していないということかもしれません。
    インタースティシャルを使わなければ起きないでしょうが、使えないのは困ります。

    google_play_servicesライブラリを更新するくらいしか手がなさそうです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Google Playの規約について以前記事を書きました。Androidアプリで見かける明らかな違反としてレビューについて説明します。(評価が★のことでレビューはコメントのことのようです。どちらも含めてレビューと呼ばれることが多い気がします。)
    企業のものでも見かけますし、意外と違反しているアプリは身近にあるように感じます。これらは当然通報(アプリの情報欄で不適切なアプリだとGoogleに報告することを指します。)することができますので、開発側としては大きなリスクを取ることになります。通報されて問題ないなら、なんでもありませんが違反ですのでGoogleとしても何かしらの対応をする可能性があります。基本的にはアプリの削除が行われるでしょう。

    評価やレビューを操作しようとしてはいけません。公式による説明はこちらです。
    星5をつけてくださいと書いたり、良い評価をしてくださいと言ったりすることは評価の操作にあたるので禁止されています。曖昧な表現だから許されるわけではありません――むしろ悪意が感じられるのではないでしょうか。
    書きたくなる気持ちはよくわかります。良い評価をされることでアプリをダウンロードする人を増やせるでしょうし、おそらくランキングにも良い影響があるのでしょう。しかしながら、これは評価を不当にゆがめることであり、結果ユーザーを騙すことになります。レビューが当てにならなくなると最終的にストア自体の価値も下がり、長期的には全ての開発者に不利益を与えることになるでしょう。
    違反する人がそんなことまで気を配るとは思えませんが、アプリが削除されるようなことになったら流石に気にするでしょうね。

    評価やレビューをしたら、何らかの報酬をあげることは禁止されています。公式による説明はこちらです。「ユーザーの評価の勧誘」という項目です。
    評価やレビューを求めるダイアログを出すこと自体は規約違反にはなりません。方法に限らず評価やレビューをすることに対して、何らかの報酬をあげてはいけないのです。
    報酬目的で行ったレビューに意味はありませんから、禁止されているのだと思います。

    この記事を読んで違反していることに気づいたらすぐに修正すべきでしょう。
    他にやっている人がいるから自分もやっても良いんだというような人は迷惑なだけです。小さな違反はいずれ大きな違反をもたらします。そして厳しいルールと監視の下で過ごしていくことになるのです。
    アプリの世界の自由さを自分勝手に振舞って良いと勘違いするようなことは、自身の品位を貶めるだけなのだと思います。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    会社員をやるとメリットとデメリットがあります。


    メリット
    1. 決まった日時に給料が支払われる
    2. よほど酷い勤務態度でなければ首にはならない
    3. 社会的に地位がある
    4. 稼ぐということを自分で考える必要はない
    一言でいえば安定しているというところです。地位というのは別に偉いとかそういうのではなく、会社の信用を自分の信用として使えるというだけのことです。ブラック企業だと多くの人に認識されている企業に勤めている場合はむしろ悪影響でしょう。


    デメリット
    1. 基本的に命令に従う必要がある
    2. 会社が起こした不祥事に巻き込まれることがある
    3. 業績次第で給料が増減する
    好きなことができないというのが最大のデメリットです。会社にとって会社員とは言うことを聞いている存在でなければ困るからです。会社が個人の幸せとかをないがしろにすると言われるのは、第一に置くところが利益だからというだけのことです。社員のことを無下にするとまではいかなくても、利益と社員がぶつかれば会社は利益を優先します。だから社員は大事にされていないと思うのです。 
    会社の起こした不祥事によっては倒産以上に酷いこともありえます。というか倒産した方が良いという会社も日本には存在しています。粉飾決算、詐欺、労働基準法の無視、 違法行為などを起こしておきながら、のうのうと存在し続けては社会にとって害です。


    会社員を一言でいえば「ローリスク・ローリターン」ということだと思います。ただこれは今までの日本の社会でそうだったというだけで、これからの日本がそうとは限りません。私はハイリスク・ローリターンになってしまうのではないかと危惧しています。
    長い年数で見た場合、本当にローリスク・ローリターンになるかは疑問があります。しかし、大きな会社であれば10年くらいは大丈夫ではないでしょうか。(きちんと調べるなら、企業の保有している資産を食いつぶして何年もつかを調べれば良いはずです。要は自分のお金をたくさん持っているかどうかです。)

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Android SDKのアップデートは、SDKをインストールしたフォルダにあるSDK Managerを実行してアップデートしたいものを選択していけば良いです。
    asdk-installmenu
     
     上の画像のようにアップデートがあるものについて選択されて開きます。基本的には全てアップデートすれば良いと思うので、右下のInstallボタンを押して進めます。

    ボタンを押すと、アップデートするものについての同意画面が開きます。同意しないと当然進めないので同意してInstallボタンを押します。後は待つだけで勝手にダウンロードとインストールを行ってくれます。
    うまく行く場合はこれで終了です。
    asdk-accept

    私がやったときはエラーが発生しました。アクセスが拒否されたといくつか表示されています。これを何とかしないとアップデートができません。
    asdk-deny

    エラーの原因は管理者として実行していないからでした。管理者として実行したいSDK Managerを選択した状態で右クリックのメニューにある管理者として実行を押します。
    これで実行したところエラーが発生せずパッケージの更新が完了できました。
    asdk-admin

    WindowsでAndroid SDKの更新を行う時は、管理者として実行しなければならないという教訓を得ました。


    【追記 】
    Twitterで原因について教えてもらったので、追記しておきます。 

    上で書いた内容はAndroid SDKがProgram Filesに入っていたから発生するようです。Program Files以下は特別な領域なので、編集するには管理者権限が必要だということです。
    Desktopやユーザーごとのフォルダ等の普通のフォルダにSDKがある場合は特に問題なく実行できると思います。(Desktopで試したところ問題は発生していませんでした。)

    このページのトップヘ