UnityLearn勉強ノート1

C#Survival Guide オブジェクト指向、データベース、継承、オーバーライド


C#Survival Guide
https://learn.unity.com/project/c-survival-guide-classes?language=en&utm_source=learn_recommendation

OOP(オブジェクト指向プログラミング)について
ちゃんと機能別に分ける。
EX)
プレーヤークラス、レーザークラス。プレーヤー内で発射するレーザーの挙動を書かない。
動画内ではplayerクラスではmovement(),shoot()を定義。
laserクラスではmovement()で弾の挙動を制御する。
武器はweaponStatsで定義。この動画ではplayerクラスの中に定義してる。
weaponStatsで武器の名前は弾の速度、弾の数を定義できる変数を用意。
playerクラスでweaponStatsインスタンスを武器の種類分作って定義。
武器の種類分毎回playerクラスのstart()内に書くのは大変なのでWeaponStatsクラス内にメソッドを用意。このメソッドをコンストラクタという。

手に入れるアイテムはitemクラスで作る。monovihavorの継承ははずす。
まずはアイテムを定義する変数を決定する。この動画ではname,id,descirptionを定義してる。
アイテムクラスをまとめるitemDatabaseクラスを別のスクリプトで作る。
ここでもアイテムクラスにコンストラクタを作る。これによってデータベースクラスでインスタンス化しやすい。
[serialisable]とはitemclassの各変数をunityの画面側(インスペクタ)から入力した各数値をまとめて表示できることを許可するコマンド?


データベースでアイテムデータを一元管理することによって欲しいアイテムの情報はこの場合Item.name,Item.idなどで簡単にアクセスできる


Challenge: Customer Database


userをcustomerDatabaseで管理する。
itemと同じようにCustomerクラス、CustomerDatabaseクラスの2つのC#スクリプトで管理する。
手順も一緒でまずはcustomerクラスで必要な項目をすべて設定する。
この動画ではfirstName,lastName,age,gender,occupation、monovihaviorの継承は外す。動画では同じような説明がされてる。


CustomClass - RPGSpellSystem Presentation

魔法システムの作り方について解説。
前述DataBaseの作り方と同じ構成でItemのようにSpellクラスを作成。
同じ用に変数name,levelRequired,itemIdRequired,gainExを設定し、コンストラクタをspellクラスに作成。
別にspellを使うWizardクラスを別スクリプトで作成。
cast()はspellクラスで定義。
Wizardではインスタンス化したspellから呼んでいる。
fireBlast.cast();のように この動画ではウィザードのレベルが必要レベルだったら使うスペルを分ける処理を書いている。

継承について


itemクラスとweaponクラスで分けないと行けない場合。アイテムの中に武器が含まれてるけど挙動を変えないと不都合
itemクラスで定義されてるメソッドは使えるようにしたい場合クラスの宣言のときに:monovihavorの代わりに:ItemとItemクラスを継承するといった具合に書く必要がある。
この動画ではItemクラスを継承してweaponクラスではattackBonusなどボーナス変数を定義している、これとは別にConsumableクラスも定義、こちらは消費されるアイテムを定義している。同じアイテムでも武器とは特製が違う。
itemクラスがすべての変数を含む必要はないと動画で言っている。

後半の動画では銀行を例に継承について説明している。
Bankクラスは 変数としてbranchName,location,cashInVaultを定義、
メソッドとしてCheckBalance(),Withdrawl(),Deposit()によってbankクラスができることを定義している。
この動画では特に新しいことは言及していない。

protected Data

親要素を継承した子要素はprotectedはアクセスできないけどprivateはアクセスできるよ。
protectedは外からアクセスできないよ。
全部publicだと外からアクセスするとき数が多くなって選ぶのに戸惑うことや間違えることがあるからねという話

overrideについて

petクラスで作ったメソッドとそれを継承したDuckクラスのメソッドでは違う鳴き声を設定したいよという話。
speakDuck()メソッドで別に定義したくない場合、親クラスのspeak()メソッドを

protected virtual void speak()

のようにvirtual宣言し、子要素のDuckクラスでは

protected override void speak()

のようにセットで使う。
親クラスがprotectedで定義してたら子クラスはprotected以外ではoverrideできない。ex)public override void speak()はエラーになる。

これで親クラスのspeak()メソッドが親クラス内のstart()などで実行されるようにプログラムして置くと親のgameobjectがゲーム内になくても子のgameobjectがあれば子のスクリプト内では実行されてなくてもスクリプトが実行される。

classとstructの違いについて

struct:VALUE TYPE – Stack
class : REFERENCE TYPE - HEAP
挙動が変わるよという難しい話

まとめ

この動画ではC#のオブジェクト指向について、データベースの作り方(scriptableObjectについては触れてない)、継承、オーバーライドについて勉強できました。初心者向けC#プログラミングの本では説明してない内容があったのでよかった。


See also