転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【Unity】30才からプログラミングを始めたサラリーマンが、AndroidアプリをGoogle Playへリリースした。

少し時間が空いたけど、Androidアプリを新たにリリースしました。それがこちら。

play.google.com

30秒間に画面をタップした回数を記録するゲーム。スマホアプリにはよくあるゲームだ。
Unityでゲームは作っているが、これまで作ったゲームはUnityの技術書のサンプルアプリを自分なりに改変して作っていたが、このゲームのプログラムは自分で考えて作った。
仕様としてはかなりシンプルだが、自分としては成長を感じれるゲームになった。
次もカジュアルゲームを作りつつ、ノンフィールドRPGを完成させたい。

あと、このゲームを作ったことで、Google Playへのリリース手順はある程度まとめることができた。ゲーム自体、早めにできたけど、Google Playへのリリースでだいぶ手こずったので、手順をまとめれたのは大きい。

uuc1h.hatenablog.jp

【Unity】Unityで作ったゲームをビルドして、Google Playへ公開する方法

これまで、Google Playへ3つのAndroidアプリをリリースしました。
当時の記事がこちら。

uuc1h.hatenablog.jp

けど、ちょっと間が空くと、かならずやり方を忘れてしまう。
そのため、ここで自分用の完璧な手順書を作っておく。

UnityでAndroidビルドをする方法

以下の説明は、Unityでゲームが完成したことを前提とする。
まず、Edit / Project Settings / Playerを開く。
PlayerのCompany Name、Product Name、Versionをそれぞれ入力する。

f:id:uuc1h:20191005130754p:plain

次に、Other Settingsを開き、Package Nameを編集した。

f:id:uuc1h:20191005131318p:plain

ここまで終われば、Build Settingsを開き、Buildボタンを押す。

f:id:uuc1h:20191005131423p:plain

ファイル名を決めて、保存場所を聞かれる。自分は、プロジェクトフォルダ配下にそのまま置いた。

f:id:uuc1h:20191005131610p:plain

そうすると、ファイル名.apkファイルができあがる。
次に、このapkファイルをAndroidに転送する。自分の場合は、Google Drive経由でapkファイルを転送している。ここで、実機確認を行う。

Google Playへのリリース手順

続いて、ここからが本番。Google Playへのリリースだ。
前提として、Google Developerアカウントはすでに作成済みとする。

まずはGoogle Play Consoleへログインする。
ログインが完了したら、右上のアプリの作成ボタンより、アプリのタイトルを入力する。

f:id:uuc1h:20191005133414p:plain

続いて、簡単な説明(80字)、詳細な説明(4000字)を入力する。
両者の違いとしては、Google Playストア上で、表示されるページがそれぞれ異なる。簡単な説明は、アプリ内のトップページに、詳細な説明は「このゲームについて」をタップした先のページで表示される。

■画像および映像
次に、画像のアップロードです。アイコン、スクリーンショット、フィーチャーグラフィックを用意する必要があります。
・アイコン
 512 * 512のPNGファイル

スクリーンショット
 2つのスクリーンショットが必要。1辺の長さが、最小320px、最大3840pxのJPGまたはPNGファイル。

・フィーチャーグラフィック
 1024 * 500のJPGまたはPNGファイル。どこに使われるか謎。

■分類
画像の設定が終われば、次は分類をそれぞれ指定する。基本的に選択式なので、迷わず設定可能。ただし、コンテンツのレーティングは別。ここは、後ほど手順に記す。

■連絡先情報・プライバシーポリシー
その後は連絡先情報にメールと、プライバシーポリシーのURLを指定する。
ここまでで、ストアの掲載情報を記載したことになる。

f:id:uuc1h:20191006152554p:plain


■製品版トラック
続いて、アプリのリリース / 製品版トラックのリリースを編集をクリックする。

f:id:uuc1h:20191006153634p:plain

以下画面が表示されるため、次へをクリック。

f:id:uuc1h:20191006153823p:plain

作成したAPKファイルを選択する。
と、ここでエラー発生。そういえば、ビルドする際、何かの署名が必要だった気がする。

f:id:uuc1h:20191006154054p:plain

署名ありビルド

Unityに戻り、Publishing Settingsタブを開く。

f:id:uuc1h:20191006154939p:plain

Keystore Manager / Keystore... / Create New / Anywhere... を選択し、keystoreファイルを作成する。
具体的な値などは、以下を参考にした。
https://www.clrmemory.com/unity/android-get-keystore/

その後、Publishing Settings / Project Key / Aliasに先ほど作成したkeyを指定する。

アプリのリリース

上記手順を踏まえ、再度APKファイルを作成し、アップロードしたら今度は無事に成功した。
■リリース名・このリリースの新機能
リリース名は、ビルドバージョンもわかるようにアプリ名_ビルドバージョンとした。
このリリースの新機能は、初回リリース時には「アプリをリリースしました。」とだけ記載している。アップデート時は、アップデートの内容を記載する。

 コンテンツのレーティング

次は、コンテンツのレーティング。
有効なメールアドレスを記載し、アンケートに答えていく。

f:id:uuc1h:20191006161557p:plain

アプリのカテゴリを選択し、表示されるアンケートに答えるだけ。
その後、「レーティングを算定」をクリックすると、コンテンツのレーティングが算出される。問題なければ、「レーティングを適用」をクリックする。

価格と配布

■アプリの価格の設定
有料、無料をセットする。

■国
このアプリが利用できる国を指定する。
また、アプリに広告を含むかどうかも指定する。

■同意事項
*がついている事項は必須なので、チェックする。

アプリのコンテンツ

対象年齢層を指定する。指定した年齢によって、その後の質問が変わってくる。

ここまで完了すると、ダッシュボードが以下のようになる。

f:id:uuc1h:20191006163018p:plain

最後の仕上げ

あとはリリースするだけと思ったが、またもやエラーが。。。

f:id:uuc1h:20191006163157p:plain

なんか、2019年8月からいろいろ変わったって見た気が。。
もう一度、Unityに戻り、Other Settingを開く。
Scripting BackendをIL2CPPに、ARM64にチェックを入れる。※x86にはチェックを入れない。

f:id:uuc1h:20191006163853p:plain
Build SettingsでBuild App Bundle(Google Play)にチェックを入れて、Buildボタンを押したら、またエラーが。本当に忌々しい。
Scripting BackendをmonoにしたらBuildできるので、ここが問題みたい。

エラーメッセージ:
Exception: /Applications/Unity/Hub/Editor/2019.1.7f1/Unity.app/Contents/il2cpp/build/il2cppcore/il2cppcore.dll did not run properly!

色々調べまくったけど、原因不明。結局、Unityのバージョンを2019から2018.4.10f1に落としたら、64bit対応のBuild成功。。

ここまできたら、「製品版として公開を開始」ボタンをクリック!

f:id:uuc1h:20191010063845p:plain

これで、無事にGoogle Playへ公開されました!

【モンスターハンターワールド】モンハン初心者がモンスターハンターワールドを始めてみた。

これまでこのブログは、プログラミングとゲーム作りについて書いてきた。ほぼ、自分のための勉強ブログだ。
で、今はUnityを使ったゲーム作りをメインでやってるが、面白いゲームを作るには、面白いゲームをやらなければいけない。もちろん、これまでもゲームはやっているが、ただ何となくやっていただけだった。
だから、色々意識してゲームをやるために、ゲームのプレイ記録をつけることにした。
それの第一回目として、最近拡張パックが発売された「モンスターハンターワールド」を選んだ。

f:id:uuc1h:20190916225400j:plain
ちなみに、これまでモンハンはやったことなくて、このモンスターハンターワールドが初モンハンだ。ということで、今後のゲーム作りに役立てるように、プレイ日記をつけていく。

キャラク

まずは、キャラクリ。色々細かく選べるが、性別まで選べる。性別によって、装備できる武器が違うようだが、ここは女性を選択。最終的にはこんな感じになりました。

f:id:uuc1h:20190916225556j:plain

いざ、本編へ

続いて、さっそく本編へ。主人公を含めた調査団が船でとある島へ向かうシーンから始まる。そこで、よくティザー映像で見る女の子が出てきた。

f:id:uuc1h:20190916225955j:plain

しかしそこで、波が大きく荒れて、船が沈没する。海からいきなり山がでてきたと思ったら、どうやらモンスターだったみたい。

f:id:uuc1h:20190916230209j:plain

なんとか目的の島にたどり着き、本来船が到着するはずだった調査拠点へ向かう。

f:id:uuc1h:20190916230437j:plain

色々あるも、無事に調査拠点アステラに到着。ここまでは、結構あっさりつけた。

f:id:uuc1h:20190916230559j:plain

そして、調査団の総司令に会い、この調査の目的が古龍渡りを解明することだという。
この古龍渡りとは、古龍が現大陸から新大陸へ向けて、大移動する現象を指すらしい。

f:id:uuc1h:20190916230929j:plain

このゾラ・マグダラオスが、さっき船を沈没させたモンスターのことなのかな?
ちょっとまだそこらへんは分からないが、さっそく主人公に対してクエストが与えられた。

f:id:uuc1h:20190916231126j:plain

うーん、ジャグラスって何や?何も分からんけど、まずは装備をしろということで、装備を行うマイハウスへ。

マイハウスでの装備

f:id:uuc1h:20190916231840j:plain

武器は全部で14種類。選ぶ武器によって、アクションが異なるとのこと。
防具は全5つのパーツで構成されており、装備スキルもある。これら組み合わせを、マイセットとして登録しておくことも可。

f:id:uuc1h:20190916232353j:plain

武器を選ぶときに便利だなと思ったのが、その武器でできるプレビューが動画で見れることと、初心者おすすめ度が見れること。このおすすめ度、自分みたいに何も分からない人からすると、武器を選ぶときの大きな指針になる。

f:id:uuc1h:20190916232536j:plain

あと、武器を変更する際、こうやって武器の各ステータスが比較できるのもいい。

f:id:uuc1h:20190916232824j:plain

で、防具のスキルもここで確認できる。
次に、選んだ武器の練習の実施。

f:id:uuc1h:20190916233905p:plain

武器のアクションって、こんなにあるのか。。これ、連携も含め操作を覚えて、実際の戦闘でやろうと思うとかなり大変な気が。
今日は、この練習をちょっとやったとこで終わりです。次回は、実際のクエストをできるかな。




MacBook Pro(13-inch, Mid 2010)をSSDに換装した。

少し前に、MacBook Proのメモリーを16GBに増設し、多少動作に改善が見られた。ただ、メモリーを増やしたところで、「本体の起動が遅い」、「アプリケーションの起動が遅い」、「Unity、Visual Studioが重い」といった事象は解消されなかった。

uuc1h.hatenablog.jpやはり、SSDの換装が必要だなと思い、Amazon Prime Dayを利用し、SSDを購入した。事前に色々調べていて、SSD換装に必要な物は、ここで一気に購入した。

 ちなみに、MacBook Proの裏ふたを開ける精密ドライバーはすでに持っていたので、ここでは購入していない。

で、実際のSSD換装手順は、以下の手順通りそのままにうまくいった。本当に詳しく、分かりやすく手順を載せてくれているので、マジでありがたいです。
https://rikei-danshi.work/entry/2018-08-10-ssd

1点だけ注意が必要なのが、MacBook Pro 13-inchは、macOS mojavaには非対応で、macOS High Sierraをインストールする必要がある。
ただApp Storeを普通に検索してもmacOS High Sierraが検索でヒットしない。
いろいろ調べたら、ここからmacOS High Sierraインストーラーをゲットできた。
https://support.apple.com/ja-jp/HT208969

f:id:uuc1h:20190728092455p:plain

上記画像の「こちらのリンク」をクリックすると、App Storeが開き、macOS High Sierraをダウンロードできた。あとは、手順通りにスムーズにできた。

で、無事にSSDに換装でき、MacBook Proを起動すると、たしかに早い。これまでの起動時間の半分くらいになっていると思う。あと、アプリケーションの起動も早くなっている。
「おーこれはSSDに換装した甲斐があったなー」とUnity、Visual Studioを起動し、いろいろ使っていくと、各アプリケーションが重い事象は改善されていない。
また、アプリケーションの実行時に、本体が熱を持ち、ファンが凄まじく回転する事象もそのままである。
いくらSSDに換装したといえ、CPUがCore2Duoではキツイのか。。。
こればっかりは仕方ないような気がするので、MacBook Proの改造はここまでとします。

スペックだけみると、メモリー16GB、SSD500GBと高スペックになったな。しかも、金額的にはちょうど2万円くらいでできるし、手順もそれほど複雑ではないのでかなりオススメできる作業だ。
けど、最新のmacOSに対応していないし、CPUが非力なままなので、早く新しいパソコン買いたいなー。

もう自分も年なんだなと感じた今日この頃。

f:id:uuc1h:20190724185841j:plain

よくCMで、「日本人の8割は歯周病にかかっている」とかって見ても、「ふーん」ぐらいにしか感じたことがなかったし、むしろ「ふーん」とも思わないことが多かった。
だがしかし、最近銀歯が取れたので、かれこれ4年振りぐらいに歯医者に行ったら、かなりショックな診断が。。

 

「かなり進行している虫歯があります。あと、歯周病が進んでいて、このままいくと歯がぐらついてきます。」

「えっ、治るんですよね?」

「治療は行えますが、これ以上病状が進まないようにする現状維持しかできません。」

「えっ、じゃあもう歯が抜けちゃいます?」

「いえ、今から治療すればこの先も自分の歯は守れますよ」

あぶねえ、ギリセーフ。。ということで、しばらく歯医者に通うハメになりました。
けど、自分は、歯ブラシだけでなく、デンタルフロスも毎日使って、結構気を使ってた方なんだけどなぁ。タバコも吸わないし、歯周病なんて自分には全くの無関係だと思ってただけに、かなり落ち込む。

まぁ、このタイミングで見つかったことを幸運として、これからは定期的に歯医者に通うことにします。

今日は久しぶりにブログらしいブログを書こうと思う。

継続は力なりとはよく言うけども、それは確かに本当なんじゃないかという気がしてきた。
このブログ、立ち上げてから2年以上たっている。当初は、ブログでお小遣いを稼げたらなーと思っていたが、全く稼げない。そもそもアクセスが無いのだ。
けど、考えてみたら当たり前で、何の特徴も無いただのサラリーマンのブログなんか、誰も読もうと思わない。だから、最近はアクセス数はそんなに気にしないで、自分のアウトプット用として、このブログを使っている。例えば、こんな風にだ。

uuc1h.hatenablog.jp

こういうことを続けていたら、1日10アクセスもなかったのが、1日50アクセスぐらいに増えてきた。1ヶ月で1000アクセスを超えるまでになってきた。
なんどもなんどもブログやめようとしたけど、このまま続けてみるか。 

 

【技術書メモ】C#プログラミングのイディオム / 定石&パターン⑧

今回は、日付、時刻の操作方法。

DateTime構造体

DateTime構造体のインスタンス生成の主な方法と、よく使われるTodayプロパティとNowプロパティ。

// インスタンス生成
var dt1 = new DateTime(2016, 2, 15);
var dt2 = new DateTime(2016, 2, 15, 8, 45, 20);

// TodayとNowプロパティ
var today = DateTime.Today;
var now = DateTime.Now;


また、DateTime構造体には、年、月、日など、様々な日付および時刻の情報を、プロパティから参照することができる。
※ここでは割愛。


指定した日付の曜日の求め方。

var today = DateTime.Today;
DayOfWeek dayOfWeek = today.DayOfWeek;
if(dayOfWeek == DayOfWeek.Sunday)

// DayOfWeekプロパティの型はDayOfWeek列挙型
public enum DayOfWeek {
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6


DayTime構造体を使用すれば、閏年の判定も可能。

var isLeapYear = DateTime.IsLeapYear(2016);


日付形式のもう字列をDateTimeオブジェクトに変換する方法。

DateTime dt1;
if(DateTime.TryParse("2017/6/21", out dt1))
    // 2017/06/21 0:00:00
    Console.WriteLine(dt1);
DateTime dt2;
if(DateTime.TryParse("2017/6/21 10:41:38", out dt2))
    // 2017/06/21 10:41:38
    Console.WriteLine(dt2);

日時のフォーマット

日時を文字列に変換するには、ToStringメソッドを使用する。
ToStringの引数に、あらゆる書式を指定すると、結果の値も変わってくる。

var date = new DateTime(2016, 4, 7, 21, 6, 47);
var s1 = date.ToString("d"); // 2016/04/07


日付を和暦で表示するには、DateTimeクラスを使用する。

var date = new DateTime(2016, 8, 15);
var culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
var str = date.ToString("ggyy年M月d日", culture);


指定した日付の元号を得るには、DateTimeFormatInfoクラスのGetEraNameメソッドを使用する。

var date = new DateTime(1995, 8, 24);
var culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
// 元号コードの取得
var era = culture.DateTimeFormat.Calendar.GetEra(date);
// 元号コードから元号名を得る
var eraName = culture.DateTimeFormat.GetEraName(era);


指定した日付の曜日を得るには、DateTimeFormatInfoクラスのGetDayNameメソッドを使用する。

var date = new DateTime(1998, 6, 25);
var culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
// 曜日の取得
var dayOfWeek = culture.DateTimeFormat.GetDayName(date.DayOfWeek);

DateTimeの比較

日時を比較するには、比較演算子をそのまま利用できる。

var dt1 = new DateTime(2006, 10, 18, 1, 30, 21);
var dt2 = new DateTime(2006, 11, 2, 18, 5, 28);
if (dt1 < dt2)
else if (dt1 == dt2)


時刻情報を含まない日付だけを比較する場合は、Dateプロパティを使う。

var dt1 = new DateTime(2001, 10, 25, 1, 30, 21);
var dt2 = new DateTime(2001, 10, 25, 18, 5, 28);
if (dt1.Date < dt2.Date)
else if (dt1.Date == dt2.Date)

日時の計算

指定した時分秒後を求めるには、TimeSpan構造体を使用する。

var now = DateTime.Now;
// TimeSpanオブジェクトを加える
var future = now + now TimeSpan(1, 30, 0);


n日後、n日前の日付を求めるには、AddYears、AddMonthsメソッドを利用する。

var date = new DateTime(2009, 10, 22);
var future = date.AddYears(2).AddMonths(5);


2つの日時の差を求める。

var date1 = new DateTime(2009, 10, 22, 1, 30, 20);
var date2 = new DateTime(2009, 10, 22, 2, 40, 56);
TimeSpan diff = date2 - date1;
Console.WriteLine("差は、{0}日間{1}時間{2}分{3}秒です", diff.Days, diff.Hours, diff.Minutes, diff.Seconds);
Console.WriteLine("トータルで{0}秒です", diff.TotalSeconds);


2つの日付の日数差を求める。

var date1 = new DateTime(2009, 10, 22, 1, 30, 20);
var date2 = new DateTime(2009, 10, 22, 2, 40, 56);
TimeSpan diff = date2.Date - date1.Date;
Console.WriteLine("{0}日間", diff.Days);


DaysInMonth静的メソッドを使えば、月末日を求めれる。

var today = DateTime.Today;
int day = DateTime.DaysInMonth(today.Year, today.Month);
var endOfMonth = new DateTime(today.Year, today.Month, day);


DayOfYearプロパティを使って、1月1日からの通算日を求める。

var today = DateTime.Today;
int dayOfYear = today.DayOfYear;