【Unityで学ぶ】C#の基本
Updateにコードを記述すると、フレームごとにそのコードが実行される。Startははじめに一度だけ実行される。
コメントアウト
// その行のコメントアウト
/* */ 囲んだ範囲をコメントアウト
条件分岐
真理値表
簡単な動作プログラム
Input.GetMouseButtonDown(0)でマウスの左クリックを検知します。
(Input.GetMouseButtonDown(1)ならマウスの右クリックを検知します。)
InputGetKey(KeyCode.W)でキーボードのwボタンの押下を検知します。
InputGetKey(KeyCode.S)でキーボードのsボタンの押下を検知します。
上記のプログラムは、wを押した状態でマウスの左ボタンをクリックすると、Unityのコンソール画面に"上に移動"と表示し、sを押した状態でマウスの左ボタンをクリックすると、Unityのコンソール画面に"下に移動"と表示します。
while文とif文
if文は条件ブロックの評価がおわったら、ブロックを抜けて、したへプログラムをすすめる。
while文はブロックの評価がおわったら、条件式にもどり、条件の評価を行う。
while文とfor文の実行順序
それぞれ番号順に動作します。
配列の性質(固定長)
可変長配列
Listという構文をつかうことで、実現できます。<>のなかに、データ型を指定します。
可変長配列の性質
連想配列の性質(辞書配列)
LINQ
そのほかにも、
* Sum,Average,Max,Min
合計、平均、最大、最小
* Select
データを変換してコピーする
* Where
データを選択する
* OrderBy
データをソートする
などの操作が可能です。配列データをSQL的に扱うものだと考えるとわかりやすくなるかもしれません。
メソッドの利用
メソッドとは関数のことです。
関数を定義する場所には注意が必要です。これらはクラスメソッドなので、クラスの関数として定義する必要があります。ですので、void Start()の内部には定義できません。
メソッドで引数を指定する
与えた引数の値に応じて、関数の出力は変化します。
値型と参照型(さまざま言語で記述されるオブジェクト指向の概念を理解する上でも役立ちます)
newするものは、参照型です。つまり、オブジェクト指向のクラスは型を参照する概念ともいえます。
もっというと、オブジェクト指向とそうでないものとの違いは、メモリのアドレスを参照しているか否かということになります。
値型は、変数間でメモリのアドレスの参照をしませんが、参照型は変数間でメモリのアドレスの参照をします。たとえば、
というコードがあったとすると、メモリアドレス上には、Aという値の領域と同時にBという値の領域ができます。Bの領域を仮にアドレス52番とすると、Aの領域はこの52番のアドレスを参照することになります。では、このAをCに代入しましょう。
すると、アドレス56番にCという領域ができて、いまAが代入されているので、52番の値を参照します。注意しなければならないのは、ここまで具体的な値はまだなにもセットされていないということです。ここで、Cに5が代入されたとしましょう。
この段階ではじめて値がセットされたことになります。では、この値はどこに入るでしょうか?それは、Cの値が参照しているアドレスに入ります。いま、Cは52番のアドレスを参照しているので、5は52番のアドレスに入ります。これではじめて、Cの具体的な値が5であると決まります。そして、52番を参照しているのはCだけではありあません。Aも52番を参照しているので、じつはこの段階でAの値も5に決定するのです。
どうでしょう?参照の概念はわかりましたか?
参照型っていうのは、「値が具体的に与えられていないときに、先にどこに変数を入れるかを決めておくタイプ」って考えるとわかりやすいかもしれません。
ここら辺を理解するにはC言語の「ポインタ」の概念を理解するとわかるようになります。
Unityでクラス
このようにクラスを宣言した場合、MonoBehaviorというクラスを継承した、RobotScriptクラスという意味になります。
クラスのなかには、変数、メソッド、さらにクラスも宣言できます。
クラスとインスタンス
クラスは参照型の概念です。つまり、new Robot()によって、Robot()クラスにはメモリのアドレスが与えられ、それが代入されるものをインスタンスといい、インスタンスはRobot()のアドレスを参照します。つまり、クラスのアドレスが根っことなるイメージです。根っこのアドレスを参照するものがインスタンスであり、メモリの容量が許す限り、クラスのアドレスを参照するインスタンスをいくつも生成することができるのです。
クラスの継承
たとえば、Baseというクラスを継承するDerivationというクラスを考えてみましょう。クラスを継承すると、継承もとで定義されている変数やメソッドを、宣言や定義することなく使うことができます。ただし、privateと宣言されているものは、継承先では利用できません。
このほかのクラスから利用可能かどうかを決定するのがアクセス修飾子です。
変数のスコープ
スコープの概念も非常に重要です。
int aとint dはクラスの変数なので、このクラス内で利用できます。int bはMethod1の引数で、Method1のなかだけで利用できます。int cはMethod1のifブロック内の変数なので、ifブロック内でのみ利用できます。基本的には、スコープは狭いほうがいいとされています。理由は、デバッグがしやすくなるからです。
メソッドの引数refとout
・ref メソッドの呼び出し側がメソッドの定義元に対して、値を渡す。なおかつ、値も変更できる。
・out メソッドの定義側が呼び出し側に値を戻すもの。
では、メソッド間でどのように値がわたされるのかを見ていきます。
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になります。
メソッドが終了すると、メソッドが利用していたデータ領域は解放されます。
暗黙の型指定がされるvar
型を指定して生成したインスタンスを他の値に代入するときには、varとして変数宣言すると、foreachなどで値を取り出すときに、KeyValuePair<string, int>などのようにあらためて明示的に宣言する必要がなくなります。
なお、Dictionary変数の{}のあとには「;」が必要となるのを忘れないようにしましょう。
クラス設計
なんのためにクラスをつくるのか?
・データとそれに関連する処理をひとまとめにするため
・似たものを共通化してコーディングを効率化するため
こんな感じで、udemyだと、ものすごくわかりやすくunityをまなぶことができます。
自分でUnityアプリケーションをつくってみたいひとは、
世界最大級のオンライン学習サイトUdemyから「Unity」と検索すると、さまざまな動画教材をみつけることができます。とても質が高いものばかりなので、プログラミング初心者の方から上級者まで、あらゆるひとが満足できる教材がそろっています。わたしはここでいま、ブロックチェーンとUnityを学んでいますが、ほかの動画教材サイトにはない質の高い内容にかなり満足しています。本気で実力をつけたいひと、エンジニアになって転職したいひとは、ぜひこちらの教材で学ぶことをおすすめします。値段が少し高いものもありますが、内容がとにかくすぐれているので、買って不満を感じたことはありません。教材によっては、30日間なら返金OKというものもあるので、素早く学習することができれば、実質無料で有料の講義を受けることだって可能です。プログラミングの実力をつけたいひと、とにかくアプリをつくりたいひとにはUdemy一択でおすすめです。
ではでは!