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

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

【Unity】Unity2019.1.5f1でAndroid Buildをしようとしたら、「gradle build failed」と出てしまったときの対処方法

複合的な問題でした。
まずUnity2019では、Android SDK & NDK Toolsを一緒にインストールしている。そのため、Preferencesより、インストールしたファイルのパス設定を行った。自分が確認したときは、ズレていた。
詳しくは、以下参照。
https://framesynthesis.jp/tech/unity/android/

上記を直しても解決しない。。
ここで致命的だったのが、プロジェクト名に日本語を入れていたこと。。「タップRPG」にしていた。
プロジェクトを作り直し、そのときのプロジェクト名を「TapRPG」にしたら無事ビルドできましたー。

【NBA】私たちはまた3ピートの瞬間に立ち会えなかった。

まさか、ウォリアーズが負けるとは微塵も思ってなかったから、Game6が終わった直後はちょっと信じられなかった。
KDが怪我で出られないという強烈なアクシデントは合ったものの、KD抜きのウォリアーズも十二分に強い。最初の優勝は、KDいなかったし、シーズン73勝したときもKDはいなかった。そう、スプラッシュブラザーズに、グリーン、イグダーラがいれば、ウォリアーズの強さを発揮できる。

だが、トンプソンの怪我は致命的すぎた。

 特にこのGame6では絶好調だっただけに、トンプソンが怪我さえしなければGame 7があったのでは?と考えずにいられない。
しかもトンプソンは、左前十字靭帯断裂という大怪我だ。この怪我をきいて、まず思い出すのはデリック・ローズ。彼も同じ怪我をおい、大きくキャリアが狂ってしまった。
ローズとトンプソンではタイプが違う選手だが、カットインも多様するトンプソンだけに、万全な形で復帰できるのかが気になってしまう。

しかし、3ピートがなかなか見れない。以前はマイアミ・ヒートが達成しそうだったが、この時はスパーズに阻まれた。いや、正確にいうと当時のファイナルで覚醒したレナードに阻まれた。この時のレナードは、まだまだスター選手ではなかったが、ファイナルに突入するとまさに覚醒状態に入り、ヒートを、レブロンの夢を打ち砕いた。
今度は史上最強チームとの呼び声もあるウォリアーズの3ピートを、またもやレナードがストップしてしまった。

3ピートって、ホント難しいんすね。俺が生きているうちに、3ピートを達成するチーム出てくるかな。

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

趣味で、Unityでゲームを作っているが、C#についてちゃんと勉強したことがない。
そのため、ここらでC#について基礎から学ぼうと思い、以下の技術書を読んだ。
uuc1h.hatenablog.jp
入門としては、最適な良書だと思う。
そこで、次に入門書の一歩先の技術書を読もうと思い、この本を選択した。

まだまだ序盤しか読んでないが、かなりの良書の予感。。
文法を説明するだけでなく、どういったときにこういう書き方をしなければならないのかという、一歩踏み込んだところまで書いてくれている。
ていうことで、読んだだけでは頭に残らないので、読んだ内容をブログにまとめていきます。

プロパティ

プロパティとは、Javaでいうセッター、ゲッターメソッドの代わりだと認識していた。
ただ、C#3.0で導入された自動実装プロパティのことは知らなかった。こっちの方が凄い簡単。

// 自動実装プロパティを使った書き方
public int Code { get; set; }

// 自動実装プロパティを使わない書き方
private int code;
public int Code 
{ 
    get { return this.code; }
    set { this.code = value; }
}

これまで6行で書いていたところを、たった1行で済んでしまう。。

※ここでちょっとした参考になったこと。
なぜ値型と参照型が必要なのか。
参照型と値型の違いは分かっているのだが、使い分けが分からなかった。
よく入門書では、大きなオブジェクトをコピーする際、値型だったらコピー処理が大変だが、参照型だったらアドレスをコピーするだけですむ。と書いてあるが、これは分かる。
けど、この本には小さなオブジェクトの場合、参照型だとオブジェクトを格納する領域と、アドレスを格納する領域と2つ必要になってしまう。値型なら、変数の領域そのものにオブジェクトを格納できる利点があると書いてあり、腹落ちした。

静的クラスについて

静的クラスの定義方法などは分かっているので、ここでは静的クラスを使う理由について。
インスタンスは、1つのクラスから複数を生成できるので、たとえば以下のようなクラスがあったとする。

class Product
    {
        public int Price { get; set; }

        public double getTaxPrice()
        {
            return this.Price * 1.08;
        }

    }

1つのクラスから複数のインスタンスを生成できるので、車オブジェクトやバイクオブジェクトなどを生成でき、それぞれ個別の値を変数Priceに設定できる。
そのため、Productクラスを静的クラスにしてしまうと、上記利点が消えてしまう。
そのため、静的クラスは特定の値に左右されない場合に適用する。代表的なのが、DateTime.Todayなど。

継承について

// 基底クラス
class Person
    {
        // 名前
        public string Name { get; set; }
        // 誕生日
        public DateTime Birthday { get; set; }

        // 年齢を返却
        public int GetAge()
        {
            DateTime today = DateTime.Today;
            int age = today.Year - Birthday.Year;
            if(today < Birthday.AddYears(age))
            {
                age--;
            }
            return age;
        }
    }
// 派生クラス
class Employee : Person
    {
        // 社員ID
        public int Id { get; set; }
        // 部署名
        public string DivisionName { get; set; }
    }
class Program
    {
        public static void Main(string[] args)
        {
            Employee em = new Employee
            {
                Id = 100,
                Name = "山田",
                Birthday = new DateTime(1980, 1, 1),
                DivisionName = "プログラミング1課",

            };

            Console.WriteLine("{0}({1})は、{2}に所属しています", em.Name, em.GetAge(), em.DivisionName);
        }
    }

継承については、文法的にはJavaとほぼ一緒の印象。なお、基底クラスの変数に派生クラスのインスタンスを代入可能だが、その場合基底クラスのプロパティやメソッドしか使用できない。(これもJavaと一緒)
ちなみにis a 関係というものを知らなかったのでメモ。
継承は「〇〇は△△である」という関係が成り立つときに使用する。上の例でいえば、「社員は人である」という関係が成り立つので、継承を使用して可。
逆に、「人は社員である」という関係は成り立たないので、継承を使ってはいけないとのこと。

【技術書メモ】確かな力が身につくC#「超」入門

Unityをメインにアプリ開発をしているが、Unityで使用する言語はC#だ。
自分は仕事でJavaを使っているからC#も何となく理解できるが、ここらで一度C#を学んでおきたいと思う。
そこで手に取ったのが、この「確かな力が身につく」シリーズだ。

確かな力が身につくC#「超」入門 (Informatics&IDEA)

確かな力が身につくC#「超」入門 (Informatics&IDEA)

イラスト、図が多めで、初心者にとって非常に分かりやすいと思う。
この本から学んだことを、ブログにまとめていく。

プロジェクトの作成

Visual Studioを立ち上げて、新規作成 / プロジェクト を選択する。
そこでプロジェクトの種類が色々出てくるが、ただC#の文法を確認するだけなら「コンソールアプリ」を選べば十分だ。
なお、プログラムの実行はデバッグ / デバッグなしで開始 を選ぶ。

変数の書き方

基本はJavaと同じなので割愛。
定数の書き方も一緒。

const int a = 3;

if文、for文、switch文、while文

これらも基本はJavaと一緒。
ただし、foreach文だけはメモしておこう。Javaの拡張for文とちょっと違うので。

float[] weights = { 41.2f, 42.5f, 44.9f, 43.0f, 29.2f };

    foreach (float f in weights)
    {
            Console.WriteLine(f);
    }

コレクション

まずはList型から。
List型

List<float> weights = new List<float>();

Dictionary
次はDictionary型。Map型に近い印象。

Dictionary<string, float> weights = new Dictionary<string, float>();

weights.Add("2019/12/10", 41.2f);

Console.WriteLine(weights["2019/12/10"]);

LINQラムダ式

ラムダ式とは
戻り値を返す短いメソッドを、より簡潔に書く方法のこと。
(引数) => 戻り値の計算式

int Add(int n)
{
    return n + 5;
}

// これをラムダ式で書くと
n => n + 5

とかなり簡潔に書ける。

LINQとは
統合言語クエリ。配列やコレクションの中から条件を満たす値だけ取り出せる。まさにクエリです。

Whereメソッド

int[] hp = { 420, 120, 600, 0, 1200 };

// 600, 1200が取得できる
var newHP = hp.Where(n => n >= 500);

※var型とは
代入された値によってコンパイラが自動的に型を判断。LINQのメソッドの戻り値は基本var型。


Selectメソッド

int[] hp = { 420, 120, 600, 0, 1200 };

// すべての要素の値を100減らす
var newHp = hp.Select(n => n - 100);


Countメソッド

int[] hp = { 420, 120, 600, 0, 1200 };

// HPが0の要素を取り出し、その数をカウントする
var newHp = hp.Where(n => n == 0).Count();

慣れたら、かなり使いやすそう。

プロパティ

通常、他クラスのメンバー変数にアクセスする場合、そのクラスのセッター、ゲッターメソッドを使用しなければならない。
だが、プロパティを使うと、直接メンバー変数にアクセスするような感覚でできる。

private int hp;

// プロパティ
public int Hp
{
    set
    {
        this.hp = value;
    }
    get
    {
        return this.hp;
    }
}

Player player = new Player("たかし", 500);
// Hpプロパティに代入
player.Hp -= 2000;    // セッター
player.Hp;                 // ゲッター

※ちょっと番外編。staticキーワードについて
いつも忘れてしまうので、ちょっとメモ。
staticをつけると、インスタンスではなくクラス自体に属するようになり、インスタンス間で共有される値になる。「クラス名.メンバ変数」で値を代入、取得できる。また、メソッドでも「Player.GetTeamName()」のように、「クラス名.メソッド名」でも使用できる。

継承について

C#の継承の書き方は、Javaとちょっと違う。

class 派生クラス名 : 基本クラス名
{
}

<b>※またまた番外編。ポリモーフィズムについて</b>
派生クラスのインスタンスを、基本クラスの変数に入れることができる性質。変数の型がすっきりするやつね。

と、ざっとまとめました。ただ、あくまで初歩の初歩の内容なので、次は中級クラスの技術書を読もう。
けど、この確かな力が身につくC#「超」入門は、超良書です。

アプリ開発初心者が作ったアプリは、本当に売れるのか?③_アプリを作る場合、自分ができる範囲を自覚することが重要

まさに表題の通りです。GWが終わり仕事が始まると、そもそも家で開発できる時間がなかなか確保できない。
けど、ここでやめてしまうとせっかく勉強を始めたのに勿体ないので、何とか少しずつでも開発を行っていました。
ちなみに完成したアプリは、こんな感じ。
f:id:uuc1h:20190519011200p:plain
いわゆるジャンケンゲームです。
この画面で自分のジャンケンの手を選ぶと、次画面に遷移します。
f:id:uuc1h:20190519011314p:plain
そこでジャンケンの結果が表示され、戻るボタンを押すともう一度ジャンケンができるというゲームです。
このアプリって、「はじめてのANDROIDプログラミング第4版」のサンプルアプリとほぼ一緒なんやけど、自分で工夫したのが、連勝回数をトップ画面に表示させるようにしたこと。
アプリを作る場合、「自分ができる範囲内」だけでやることが重要だと思っている。

これで、画面遷移と共有プリファレンスの使い方はなんとなくわかった気がする。

はじめてのAndroidプログラミング 第4版

はじめてのAndroidプログラミング 第4版

アプリ開発初心者が作ったアプリは、本当に売れるのか?②_さっそくアプリを1つ作り、Google Play Storeへ公開した

前回の記事がこちら。

uuc1h.hatenablog.jp

 さて、Androidを買ったし、PCはWindowsだし、Javaならちょっと分かるしということで、Android Studioアプリ開発をやっていこうと、前回のブログで決意表明しました。
そこで、さっそくAndroid開発の本を購入。それがこちら。

はじめてのAndroidプログラミング 第4版

はじめてのAndroidプログラミング 第4版

 

 サンプルとなるアプリがたくさん載っているのが、購入に至った一番の動機だ。
最初から読み進めていくと、ここである事実が一つ。

Android Studio 3.0のリリースとともに新言語Kotlinのサポートが開始されました。Googleは今後KotlinをAndroidの標準プログラミング言語にすることを明言していますので、将来的には完全に置き換わるかもしれません。

引用元:はじめてのAndroidプログラミング 第4版

 えーJavaじゃないの!!ってのが第一の感想。ただ、Javaとは100%互換性があるみたいで、Java開発経験は無駄になるわけではないとのこと。しかも、Kotlinの方がなにかと簡潔にすむらしい。
よし、では自分もKotlinで開発していこう。というか、この本がKotlinで開発しているから、Kotlinで開発するしかないのだが。。

この本は、8つのサンプルアプリが収録されている。ということで、1つのサンプルアプリをまず本の通りに作ってみて、そこで得た知識をもとに自分のアプリを作り、リリースまでやってしまおうと思う。今日はその第一弾。

得た知識

・プロジェクトの作成時、Use AndroidX artifactsにチェックを入れる。(AndroidXライブラリを使用するため)
・画像を使用する場合は、res/drawableに保存する。
Androidは画面をレイアウトする方法として、「ContraintLayout」がある。ビューに対して、制約を設定する。
・リソースの設定方法
 Resources画面を開き、Add new resources / New string valueより行う。
 または、Translations Editorから行う
・アクティビティの追加
 appを右クリックし、New / Activity / Empty Activityより追加する。ktファイルとxmlファイルが作成される。
・Intentを使った画面遷移方法
・インポートのショートカット(Alt + Enter)
インテントにデータを格納し、遷移先でデータを取得する方法
・finishメソッドを使った、前のアクティビティに戻る動作
・共有プリファレンスの使い方

成果物

f:id:uuc1h:20190506213344p:plain

f:id:uuc1h:20190506213354p:plain

Randomメソッドを使って、ただ単に「大吉」、「中吉」、「凶」のいづれかを画面上に表示するだけの単純なアプリです。

ただ、今回の一番の目的はAndroid Studioで作ったものを、リリースすること。一度Google Playにリリースしたことはあるが、そのときはUnityで作ったものだ。
Android Studioから、apkファイルの作成は以下記事の通りにやったら無事にできた。
https://akira-watson.com/android/apk.html

つづいて、Google Play Consoleからのリリースだが、以下記事を参考にした。
https://qiita.com/android_develop_hunt/items/c57319dc3012cb310c6c

 そうして、公開したアプリがこちら。
https://play.google.com/store/apps/details?id=jp.uuch1.fortune_telling

うん、このサイクルを続けていけば、いい感じになりそうな気がする。



 

アプリ開発初心者が作ったアプリは、本当に売れるのか?①

もう何度も本ブログで書いているが、自分は30歳からプログラミングを始めた。始めたきっかけは、IT会社に転職したからだ。
せっかくプログラミングを覚えたから、プライベートでも何か作ってみたいと挑戦中なのが、Unityを使ったゲーム製作だ。素人なりにいろいろ考えて、Applo Storeにも何本かリリースした。

uuc1h.hatenablog.jp

uuc1h.hatenablog.jp

uuc1h.hatenablog.jp

 ただ、ゲーム作りはプログラミングだけでなく、プログラミング以外にも色々な要素が必要になってくる。例えば絵だったり、音楽だったり、アニメーションだったりと。いや、たしかにゲーム作りは楽しいんだけど、自分はもっとサクッと作って、リリースまでしたい。
あと、iOSアプリを作っていてしんどいのが、Appleの審査。なかなか通らず、リジェクトされまくりの日々がこれまたストレスになってくる。

そこで今度はAndroidについて調べると、なんとAndroidはかなり審査がゆるいという。また、リリースも結構簡単にできるとのこと。
これはと思い、生粋のiPhoneユーザーだった自分は生まれて初めてAndroid買いました。テスト機としてね。それが、これ。

なんと、1万円ちょっとでスマホが買える。Androidやっぱりすげーっと、妙な興奮を覚えながら、さっそくリリースしたアプリがこちら。

 ちなみにこのアプリは、Unityで作りました。たしかに、developer登録からリリースまで、かなり簡単にできた。うぉーついにリリースした!って感動してたのだが、ここで問題がひとつ。
まったくダウンロードされない。
このアプリ、ブロック崩しシューティングゲームを混ぜたようなゲームで、自分の中ではかなり頑張って作った。しかし、マジで誰もダウンロードされない。ダウンロード数は、自分がテスト機にダウンロードした1回だけだ。

もちろん自分はアプリ開発で食べていこうなんて思ってないのだが、やはり何の反応もないと、モチベーションが保てない。アプリ開発レッドオーシャンと呼ばれているが、本当に初心者が個人開発したアプリなんて、まったく見向きもされないのだろうか。

と、後ろ向きになりつつあったが、冷静に考えると自分が作ったアプリのクオリティーはかなり低い。これじゃあ使ってもらえないし、またダウンロードされる工夫もしていない。まずは絶対的に、アプリを作った数が少ないと思う。

ということで、これからしばらくはAndroidアプリ開発に集中しようと思う。また、ダウンロードされることを目標にしているので、Unityを使ったゲーム開発ではなく、Android Studioでのツール系アプリ開発に挑戦していく。
100万ダウンロードくらいされないかなー。