1st term 4th week - dsuz/csharp GitHub Wiki
paiza ラーニングの演習問題 をやりましょう。引き続き この問題 もやりましょう。
ここで覚えておかなければならないのは次のことです。
- クラス (class) と構造体 (struct) は「データと機能の塊」です
- クラスは「ひな形」、インスタンス(オブジェクトともいう)は「実体」です
- プレハブ(ひな形)と GameObject(実体)の関係と同じです
- クラスのフィールド(「メンバー変数」とも呼ぶ)は、そのクラスのインスタンスが持つデータです
- フィールドの変数としてのスコープはクラス全体です
- クラスのメソッド(「メンバー関数」とも呼ぶ)は、呼び出すことで機能を使うことができます
- Unity の「コンポーネント」は全て「クラス」です
- C# でこれまで使っていた int, string, float, Console もすべてクラス(または構造体)です
- クラスのメンバーを「public」で修飾すると、外部からアクセスできます
- 「private」で修飾すると、外部からはアクセスできません
- 何も修飾しなければ private とされます
- 名前付けのルールがあります
- クラス名は大文字で始まるようにつけます(パスカルケース)
- 変数名は小文字で始まるようにつけます(キャメルケース)
- メソッド名は大文字で始まるようにつけます(パスカルケース)
- フィールド名はプレフィックス _(アンダースコア)をつけて、小文字で始まるようにつけます(キャメルケース)
- これらは守らなくてもプログラムは動きますが、守ってください。また、世に出ているプログラムはほぼすべてこのルールに従っています。つまり、プログラムを読むときにもこのことを知っておく必要があります。
クラスの概念はすぐに理解するのは難しいでしょう。しかし、クラスを使えなければゲームプログラミングはできません。理解できなくてもまずは使ってみましょう。そして、使いながら理解し、使う→理解する→使う→理解する→使う→理解する→... を繰り返していきましょう。
Unity でまず覚えなければならないのは、以下のクラスです。「どんなクラスやコンポーネントがあるのか」や「個々のクラスの使い方」は覚えていく必要があります。
- Input - キーボード・マウス・ジョイスティックなどの入力を検出するクラス
- Transform - 座標・角度・倍率とオブジェクトの親子関係を扱うクラス(コンポーネント)
- Rigidbody, Rigidbody2D - 力を加えたり、速度ベクトルを設定したりなど力学的挙動を操作するクラス(コンポーネント)
- GameObject - オブジェクトの名前や、オブジェクトのアクティブ状態を制御したり、シーンからのオブジェクトの検索などの機能を提供するクラス
- Vector2, Vector3(構造体)- ベクトルの要素や空間内での座標など、2つあるいは3つの数をまとめて扱う構造体
※構造体とクラスは厳密には異なるものですが、現時点では同じものと理解しておいて問題ありません。クラスは機能寄り、構造体はデータ寄りですが、それも覚えなくてよいです。これらの違いを理解するには C++ の知識があると理解しやすいので、後でそれを踏まえて説明します。
引き続き以下の演習問題をやりましょう。
- 『独習 C#』
- 7.1 クラスの定義
- 7.2 フィールド
- 7.3 メソッド
コンストラクターは「何もないところからインスタンスを作る時」に呼ばれます。new キーワードを使うことで呼び出すことができます。
クラスを作る時は、「クラス名と同じ名前のメソッド」がコンストラクターになりますが、Unity のコンポーネントではコンストラクターを使う事が許されていないので、Unity でプログラミングをする時はほとんど使いません。
ただし、以下のような場合に new を使います。
// Listを作る時
List<int> intList = new List<int>();
List<string> stringList = new List<string>();
// 複数のfloat値からVectorを作る時
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
Vector2 direction = new Vector2(h, v);
- 『独習 C#』7.4 コンストラクター
paiza ラーニングの演習問題 をやりましょう。
ここで覚えておかなければならないのは次のことです。
- フィールドやメソッドに static をつけると、そのフィールドやメソッドは「クラス」に紐づけられる(クラスフィールド・クラスメソッド)
- static をつけていないメソッドやフィールドは、「インスタンス」に紐づけられる(インスタンスメソッド・インスタンスフィールド)
- クラスメソッドやクラスフィールドは、外部からアクセスする時に クラス名.メソッド名 などと呼び出す
- 例: Main(), Console.WriteLine(), Console.ReadLine(), Input.GetAxisRaw(), Mathf.PI
- インスタンスメソッドやインスタンスフィールドは、外部からアクセスする時に インスタンス名.メソッド名 などと呼び出す
- Main() メソッドが static なのは、それが含まれるクラスがインスタンス化されることがないから
- Unity でプログラミングする時は、static をつけることは当面はない
- なぜなら当面の間 Unity で作るのは「コンポーネント」だから
- コンポーネントはいろいろな GameObject に追加してインスタンス化して使うので、static にしなければいけない場合が当面はない
自分で static をつけることはしばらくはあまりないので、まずは「使う側」として知っておけばよいが、大抵は丸暗記とインテリセンスにより、static を理解しなくてもプログラミングできてしまう。それはそれでよい。いずれ static はもう一度出てきます。
- 『独習 C#』
- 7.5 クラスメソッド/クラスフィールド
- 7.5.1 クラスメソッド
- 7.5.2 クラスフィールド
- 7.5 クラスメソッド/クラスフィールド
paiza ラーニングの演習問題 をやりましょう。
ここで覚えておかなければならないのは次のことです。
- プロパティは外部から見れば、フィールドを public にして公開しているのと変わらない
- 内部的にはメソッドを定義して値を返したり受け取ったりするのと変わらない
- 例えば、内部的には生年月日をフィールドに持っておいて、プロパティとして年齢を公開するということができる
- プロパティの書き方や、なぜこのような事をしているのかという理由については参考資料に説明がある
現時点ではプロパティを「作る」ことはないでしょう。どうしてこのような事が必要なのか、どのように書くのかについては後で「オブジェクト指向」について学ぶ時にもう一度やります。現時点では、インスタンスフィールド・クラスフィールドは外部からは「プロパティ」と呼ぶことを知っておけばよいです。Windows においては、ファイルやフォルダなどもインスタンス(オブジェクト)であり、プロパティを持っています。
- 『独習 C#』8.1.2 フィールドのアクセス権限とプロパティ
paiza ラーニングの演習問題 をやりましょう。
ここで覚えておかなければならないのは次のことです。
- 同じ名前のメソッドを複数定義することができる
- 同じ名前でも、引数の数や引数の型が違っていれば、別のメソッドとして定義できる
- 以下が全て同じだと、同じメソッドと判断されて重複して定義することはできない
- 名前
- 引数の数
- 引数の型
- 引数の並び順
- 名前が同じで別のメソッドを「メソッドのオーバーロード」という
- メソッドを使う時は、別のオーバーロードがあってそちらの方が都合がよい場合がある
引き続き 次の演習問題 をやりましょう。
- 『独習 C#』7.3.6 メソッドのオーバーロード
-
paiza ラーニングの C#入門編7: クラスを理解しよう の演習を全て正解する
- 合計 10 問あります
- 受講する(動画を見る)必要はありませんが、演習が解けない場合は動画を見て学んでもよいでしょう
- 動画は見ていなくても受講済みにしてしまって構いません
次回以降は何週間か「これまで学んできたことを、Unity でのプログラミングのどこでどのように使うのか」を学んでいきます。
単に「ゲームを作る」だけならば見よう見まねである程度できる人もいますが、すぐに応用が利かなくなります。今回までに学んできた内容を使えば、Unity でのプログラミングを最低限は理解できるでしょう。
ただし、これまでに学んだことだけで全てを理解できることはありません。普通の(特に高度でない)プログラミングでも、これまでに学んでいない事が出てきています。
しばらくは、Unity での C# プログラミングを学びつつ、新しいことを学んでいきます。