たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【Unityで学ぶ】C#の基本

   

https://gyazo.com/5b45d94913dd2dab64a8211369452992

最初のプログラムの説明
https://gyazo.com/3b63a0240d827d3bee4638a2ba7f3da5

usingについて
https://gyazo.com/3e06ba3ff487f4cf6bef30fda57bde19

https://gyazo.com/e4e887aaed2f525917968dfc934122c7

https://gyazo.com/a2c2fe013457c8b6b167a729ea52c504
Updateにコードを記述すると、フレームごとにそのコードが実行される。Startははじめに一度だけ実行される。

コメントアウト

// その行のコメントアウト
/* */ 囲んだ範囲をコメントアウト

条件分岐

https://gyazo.com/3a3b47d8778236560e50878fb3c19b64

真理値表

https://gyazo.com/6430ac1ba9eaf50597a2ed876c7dfb5d

簡単な動作プログラム

https://gyazo.com/b04077ce46c4f7f2134b9ed20ec57eae

Input.GetMouseButtonDown(0)でマウスの左クリックを検知します。
(Input.GetMouseButtonDown(1)ならマウスの右クリックを検知します。)
InputGetKey(KeyCode.W)でキーボードのwボタンの押下を検知します。
InputGetKey(KeyCode.S)でキーボードのsボタンの押下を検知します。

上記のプログラムは、wを押した状態でマウスの左ボタンをクリックすると、Unityのコンソール画面に"上に移動"と表示し、sを押した状態でマウスの左ボタンをクリックすると、Unityのコンソール画面に"下に移動"と表示します。

while文とif文

https://gyazo.com/d3b00b743400f5fb65b95c7c0992558f

if文は条件ブロックの評価がおわったら、ブロックを抜けて、したへプログラムをすすめる。

while文はブロックの評価がおわったら、条件式にもどり、条件の評価を行う。

while文とfor文の実行順序

https://gyazo.com/c889cb0c9dffaf0a49b1e88fab976cca

それぞれ番号順に動作します。

配列の性質(固定長)

https://gyazo.com/8f2eef06a000614d50ed2fa0d0a36cd7

可変長配列

https://gyazo.com/2fbfa274e02712185b709845cd785a56
Listという構文をつかうことで、実現できます。<>のなかに、データ型を指定します。

可変長配列の性質

https://gyazo.com/3bfac6d6ecc50b4ba09a4bc53034741e

連想配列の性質(辞書配列)

https://gyazo.com/3bfac6d6ecc50b4ba09a4bc53034741e

LINQ

配列全体にたいして、一気に操作をする方法
https://gyazo.com/2286a34416a9b2ebbb0bddb57caea531

そのほかにも、
* Sum,Average,Max,Min
合計、平均、最大、最小
* Select
データを変換してコピーする
* Where
データを選択する
* OrderBy
データをソートする

などの操作が可能です。配列データをSQL的に扱うものだと考えるとわかりやすくなるかもしれません。

メソッドの利用

https://gyazo.com/c30ff329483f1aa37bff9f4144a7f06c

メソッドとは関数のことです。
関数を定義する場所には注意が必要です。これらはクラスメソッドなので、クラスの関数として定義する必要があります。ですので、void Start()の内部には定義できません。

メソッドで引数を指定する

https://gyazo.com/3b5338f97c4459d70db9a81a60e3b4a2

与えた引数の値に応じて、関数の出力は変化します。

値型と参照型(さまざま言語で記述されるオブジェクト指向の概念を理解する上でも役立ちます)

newするものは、参照型です。つまり、オブジェクト指向のクラスは型を参照する概念ともいえます。

もっというと、オブジェクト指向とそうでないものとの違いは、メモリのアドレスを参照しているか否かということになります。
https://gyazo.com/a7a4d31242fa47da89bc7ed99fe069ae

値型は、変数間でメモリのアドレスの参照をしませんが、参照型は変数間でメモリのアドレスの参照をします。たとえば、
https://gyazo.com/d16a604fc157b63a220dd9641787e7b1
というコードがあったとすると、メモリアドレス上には、Aという値の領域と同時にBという値の領域ができます。Bの領域を仮にアドレス52番とすると、Aの領域はこの52番のアドレスを参照することになります。では、このAをCに代入しましょう。
https://gyazo.com/f9678812093191b02b50004658c09486
すると、アドレス56番にCという領域ができて、いまAが代入されているので、52番の値を参照します。注意しなければならないのは、ここまで具体的な値はまだなにもセットされていないということです。ここで、Cに5が代入されたとしましょう。
https://gyazo.com/2f7f7b5f4b42be9e5d136f2f91ceb633
この段階ではじめて値がセットされたことになります。では、この値はどこに入るでしょうか?それは、Cの値が参照しているアドレスに入ります。いま、Cは52番のアドレスを参照しているので、5は52番のアドレスに入ります。これではじめて、Cの具体的な値が5であると決まります。そして、52番を参照しているのはCだけではありあません。Aも52番を参照しているので、じつはこの段階でAの値も5に決定するのです。
https://gyazo.com/9d6cdd7d9019bfd2c7c5d632df0d8746
どうでしょう?参照の概念はわかりましたか?

参照型っていうのは、「値が具体的に与えられていないときに、先にどこに変数を入れるかを決めておくタイプ」って考えるとわかりやすいかもしれません。

ここら辺を理解するにはC言語の「ポインタ」の概念を理解するとわかるようになります。

Unityでクラス

https://gyazo.com/9a07bea35ec0dd18dc5f43273c29ea80

このようにクラスを宣言した場合、MonoBehaviorというクラスを継承した、RobotScriptクラスという意味になります。

クラスのなかには、変数、メソッド、さらにクラスも宣言できます。

クラスとインスタンス

https://gyazo.com/5ad2d13f44a17913ca7ee34185c4a6c2

クラスは参照型の概念です。つまり、new Robot()によって、Robot()クラスにはメモリのアドレスが与えられ、それが代入されるものをインスタンスといい、インスタンスはRobot()のアドレスを参照します。つまり、クラスのアドレスが根っことなるイメージです。根っこのアドレスを参照するものがインスタンスであり、メモリの容量が許す限り、クラスのアドレスを参照するインスタンスをいくつも生成することができるのです。

クラスの継承

https://gyazo.com/4c14cc3c3647433014a4ae70867195fb

たとえば、Baseというクラスを継承するDerivationというクラスを考えてみましょう。クラスを継承すると、継承もとで定義されている変数やメソッドを、宣言や定義することなく使うことができます。ただし、privateと宣言されているものは、継承先では利用できません。

このほかのクラスから利用可能かどうかを決定するのがアクセス修飾子です。

https://gyazo.com/f24d3b35df71b10c09525cb5d04cc6d7

変数のスコープ

https://gyazo.com/9759bdb81b6754abd22d24358ddf0cf6

スコープの概念も非常に重要です。
int aとint dはクラスの変数なので、このクラス内で利用できます。int bはMethod1の引数で、Method1のなかだけで利用できます。int cはMethod1のifブロック内の変数なので、ifブロック内でのみ利用できます。基本的には、スコープは狭いほうがいいとされています。理由は、デバッグがしやすくなるからです。

メソッドの引数refとout

いま、bool型のDanceというメソッドがあるとします。
https://gyazo.com/7c518e2c5fef9968231458a4d709ddb7

・ref メソッドの呼び出し側がメソッドの定義元に対して、値を渡す。なおかつ、値も変更できる。
・out メソッドの定義側が呼び出し側に値を戻すもの。

https://gyazo.com/ab2a970695718688305061b092b2b238

では、メソッド間でどのように値がわたされるのかを見ていきます。
https://gyazo.com/23111c79bea289bca9c6b1a581c1abb4

void Start()メソッドからプログラムがはじまります。int rが宣言されているので、メモリのアドレス40番に変数rのデータ領域が確保されるとします。aには0が代入されているので、ここに値0が入ります。同様にint c = 0が宣言されておりメモリのアドレス44番に変数cのデータ領域が確保され、値0が代入されているので、値0が入ります。次に変数sucが宣言されており、メモリのアドレス48番にsucのデータ領域が確保されます。ここにメソッドDanceの値が格納されるので、ここでDanceをみます。Danceは引数をふたつとり、いまrとref cが渡されています。Danceメソッドの内部では、変数right=1が宣言され、メモリのアドレス52番に変数rightのデータ領域が確保され値1が格納されます。次にrcndが宣言され、メモリのアドレス56番にデータ領域が確保されます。ただし、rcndはref型なので、Danceメソッドにref cとして渡されたcのアドレス44番をrcndは参照します。いま、cがrcndに渡されているので、rcnd=2とすると、アドレス44番のcの値が2になります。
https://gyazo.com/07bfbc20eae4299694124e0c03096bf4
メソッドが終了すると、メソッドが利用していたデータ領域は解放されます。

暗黙の型指定がされるvar

https://gyazo.com/61d393c211078c7ef204e22101cf0586

型を指定して生成したインスタンスを他の値に代入するときには、varとして変数宣言すると、foreachなどで値を取り出すときに、KeyValuePair<string, int>などのようにあらためて明示的に宣言する必要がなくなります。

なお、Dictionary変数の{}のあとには「;」が必要となるのを忘れないようにしましょう。

クラス設計

なんのためにクラスをつくるのか?

・データとそれに関連する処理をひとまとめにするため
・似たものを共通化してコーディングを効率化するため

こんな感じで、udemyだと、ものすごくわかりやすくunityをまなぶことができます。
自分でUnityアプリケーションをつくってみたいひとは、
世界最大級のオンライン学習サイトUdemyから「Unity」と検索すると、さまざまな動画教材をみつけることができます。とても質が高いものばかりなので、プログラミング初心者の方から上級者まで、あらゆるひとが満足できる教材がそろっています。わたしはここでいま、ブロックチェーンとUnityを学んでいますが、ほかの動画教材サイトにはない質の高い内容にかなり満足しています。本気で実力をつけたいひと、エンジニアになって転職したいひとは、ぜひこちらの教材で学ぶことをおすすめします。値段が少し高いものもありますが、内容がとにかくすぐれているので、買って不満を感じたことはありません。教材によっては、30日間なら返金OKというものもあるので、素早く学習することができれば、実質無料で有料の講義を受けることだって可能です。プログラミングの実力をつけたいひと、とにかくアプリをつくりたいひとにはUdemy一択でおすすめです。

ではでは!

 - プログラミング系, Unity, C#