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

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

C#を勉強する③_インターフェイスについて

静的メソッドとインスタンスについて

静的メソッドからは、自分自身のインスタンスを呼び出せない。よく例にあげられるのが、Mainメソッドでのこと。
このように、静的メソッド内では、自分自身のインスタンスメソッドは呼び出せない。

// 静的メソッドとして定義
public static void Main(string[] args) {

    for(int feet=1; feet<=10; feet++) {
        // 静的メソッド内では、自身のインスタンスメソッドは呼び出せない
        double meter = FeetToMeter(feet); 
        Console.WriteLine("{0} f = {1:0.0000}m", feet, meter);
    }
}

static double FeetToMeter(int feet) {
    return feet * 0.3048;
}

インターフェイスの考え方

public class List : IList, ICollection, ,,,,,,, IEnumerable,
Listクラスは、IListインターフェイスが定義しているメソッドやプロパティを持っている⇨Listクラスは、IListインターフェイスを実装していると、この記述から読み取れる。
なお、.NET Frameworkが提供しているインターフェイスには接頭辞Iが付いている。

インターフェイスの基本的な考えとして
・AクラスがIXインターフェイスを実装していると、AオブジェクトはIX型の変数に代入できる。
・IX型の変数は、IXインターフェイスが定義するプロパティ、メソッドが使える。
・プロパティやメソッドの具体的な動作は、IXインターフェイスではなく、Aクラスに実装されている。

上を例で示す。

List<int> list = new List<int>() {1, 2, 3, 4, 5 };

// Listクラスは、IColliction<T>のインターフェイスを持っているので変数に代入できる
ICollection<T> collection = list;

// collection変数は、ICollection<T>型のプロパティやメソッドが使える
var count = collection.Count;
collection.Add(6);

また、別の例として

// これだと、List<T>しか受け付けていない
private List<Sale> _sales;

// インターフェイスに変えると、IEnumerable<T>を実装しているすべてのクラスが使える
private IEnumerable<Sale> _sales;

暗黙の型指定varの使い方

List<Sale> sales = new List<Sale>();

// varを使ってかくと
var sales = new List<Sale>();

エルカミーノ:ブレイキング・バッド THE MOVIE_海外ドラマの王者は、映画になっても面白い

※多少、ネタバレありです。

Breaking Badの後日談が、NETFLIXで映画になって公開された。

f:id:uuc1h:20191014131254j:plain

Breaking Badとは、2008年から始まったアメリカのテレビドラマシリーズで、シーズン5で完璧なラストを迎えた。
いわゆる海外ドラマというジャンルだが、海外ドラマの主流といえば、1話完結物だった。例をあげると、「クリミナル・マインド」、「ボーンズ」などだ。もちろん、これらドラマは素晴らしいのだが、一つ大きな欠点があった。
それは、人気が出ると「長期化」することだ。これは、どんなドラマも駄作に貶める、最悪な流れだと思う。

だが、Breaking Badはなんの蛇足もなく、シーズン5で完璧な終わりを迎えた。だが、完璧すぎて、この「エルカミーノ」でBreaking Badが映画化されると聞いて、拒絶反応を起こした人もいるかもしれない。
しかし、自分は傑作に違いないと信じていた。それは、スピンオフにあたる「ベター・コール・ソウル」を見ているからだ。

ソフトシェル ベター・コール・ソウル SEASON 1 BOX [DVD]

「スピンオフは成功しない」と勝手な法則を持っていた自分だが、このベターコールソウルにいたっては例外だった。Breaking Badのクオリティーを保ったまま、圧倒的に面白い。このベターコールソウルで、エルカミーノに関しても見る前から「絶対に面白いはずだ」と確信していた。

エルカミーノは、限られた人だけが見ることを許された傑作だ

少し前置きが長くなったが、結論を先に。

エルカミーノはおもしろいのか?」と人に聞かれたら、自分はこう答える。

あなたは、Breaking Badをシーズンファイナルまですべて見ましたか?
すべて見たなら大丈夫です。安心して見てください。傑作です。

エルカミーノは、Breaking Badの後日談だ。しかも、Breaking Bad本編で語られていない過去の話や、Breaking Badの登場人物が出てくる。そのため、Breaking Badの内容が頭に入ってないと、色々楽しめない。
Breaking Badを見たことがなく、いきなりこのエルカミーノから見ると、ストーリーは意味不明だろう。だからこそ、「エルカミーノは、ファンムービーだ」と言われているが、少なくとも自分は「いや、これが見たかった」と言いたい。

また、全体的に非常に暗い。ジェシーはトッドたちに監禁されていたトラウマに苦しめられ、心に更なる傷をおってしまっている。そもそもが、見る人を選ぶ映画だ。
だが、そこはBreaking Badクオリティ。終始暗いままではなく、時にポップに、テンポよく進むため、没頭して見れてしまう。

そして、やはり本作を傑作たらしめているのが、主演のアーロン・ポールの存在が大きい。Breaking Badのシーズン1のジェシーとは完全に別人で、色々なことが自分に起きたからこその変化を、完璧に演じきっている。Breaking Bad後半の情緒不安定な状態が、さらに悪化しつつも、人としての凄みが感じられるのが、エルカミーノジェシー・ピンクマンだ。

ただ、少しダメ?というか、気になったことが一つ。
エルカミーノでは、過去のシーンがたびたび登場する。Breaking Badでは語られていないシーンだ。例でいうと、ジェシーが監禁されているとき、実はトッドとこんなことが起こっていたみたいなシーンが多く出てきた。
それらエピソードはどれも最高だが、そこに出てくるトッドが当時と違って、かなり太っている。(Breaking Bad当時のトッドは細身だった)
過去の話のはずなのに、トッドは年齢からくる体重の変化なのか、見た目がかなり違っていた。これは、他のシーンでも度々見られ、その度に気になってしまった。
Breaking Badの終了から6年近くたっているからこれは仕方がないのだが。。

と、最後は少しだけ気になる点をあげたが、エルカミーノはまさに傑作です。面白いドラマは、映画になっても面白い。激しくおすすめです。

C#を勉強する②_値型と参照型を理解する。

分かったつもりになっても、ちょっと時間がたてば混乱するのが値型と参照型の違い。
まず、例となるソースコードを書いてみた。ちなみに、構造体は値型。

public class Program {

        public static void Main(string[] args) {

            MyClass myClass = new MyClass();
            MyStruct myStruct = new MyStruct();

            // それぞれに値を代入
            myClass.X = 80;
            myStruct.X = 40;

            // メソッドでそれぞれの値を出力(結果:MyClassX = 160, MyStructX = 80)
            PrintObjects(myClass, myStruct);

            // 再度、それぞれの値を出力(結果:MyClassX = 160, MyStructX = 40)
            Console.WriteLine("MyClassX:{0}, MyStructX:{1}", myClass.X, myStruct.X);
        }

        static void PrintObjects(MyClass myclass, MyStruct myStruct) {

            // プロパティの値を2倍
            myclass.X *= 2;
            myStruct.X *= 2;

            Console.WriteLine("MyClassX:{0},MyStructX:{1}", myclass.X, myStruct.X);

        }

        
        
    }

    class MyClass {
        public int X { get; set; }
        public int Y { get; set; }
    }

    struct MyStruct {
        public int X { get; set; }
        public int Y { get; set; }
    }

ここで2回目のConsoleへの出力結果を見てみると、MyStruct(値型)の値は2倍されていないのに、MyClass(参照型)の値は2倍されている。
PrintObjectsメソッド内でMyClass.Xの値を更新しているが、参照型の場合、文字通り参照先の値を更新するため、2回目にMyClass.Xの値を参照した場合、2倍に更新された値を参照しているからである。
では、値型はなぜ2倍になっていないかというと、PrintObjectsメソッドにMyStructを渡しているが、これはオブジェクトそのものをコピーして、メソッドに渡しているからだ。
よって、メソッド内で2倍しても、2回目の出力時にMyStruct.Xの値は2倍になっていない。PrintObjectsメソッドに渡したMyStructと、Mainクラス内で宣言したMyStructは別物である。

参照型はわかるが、値型をメソッドに渡すとき、オブジェクトをコピーして渡しているという概念を自分は忘れがちなので、ここで復習しておく。

C#を勉強する①_継承の基礎を理解する。

自分はUnityでゲームを作っている。つい先日も、新しいゲームをリリースした。 uuc1h.hatenablog.jp UnityではC#の言語が採用されているので、必然的にC#の知識が必要になってくる。 普段の業務ではJavaを使っているので、なんとなくC#も書けるがやはり1から学び直しておきたい。ということで、C#について、基礎から学ぶことにした。勉強内容を、本ブログに記録していく。

C#での継承について

Javaと違う点として、継承がある。C#の方が記載が簡単。

public class Employee : Person{
    public int Id { get; set; }
    public string DivisionName { get; set; }
}

継承先のクラス名:継承元のクラス名(基底クラス)と記載する。
そして、継承の時にはis a 関係も考慮する必要がある。
上のソースの「人間クラス」、「社員クラス」を例とすると、「社員は人である」が成立するため上記のような継承が成立する。
逆に、「人は社員である」という関係は成り立たないため、

public class Person : Employee

という継承は使わない。

また、is a 関係から、以下のような形も可能。

// Employeeクラス特有のプロパティなどは利用不可
Person person = new Employee();

しかし、逆の代入は不可。

Employee emp = new Person();

【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

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




【スポンサーリンク】