【Unity/C#】継承やオーバーライドも使えると便利なのでぜひ

【Unity/C#】継承やオーバーライドも使えると便利なのでぜひ

C#はオブジェクト指向のプログラミング言語で、他のクラスを継承する機能があります。

継承とは、派生元となるクラスの機能(フィールドやメソッドなど)を引き継いで、新しいクラスでも使えるようにする機能です。

すでに作ってある機能を新しいクラスでまた作るのは手間なので、使いまわせると便利です。といっても全てのフィールドやメソッドを継承先で使えるわけではなくて、protectedまたはpublicのキーワードをつけたものが対象になります。(アセンブリが同じならinternalもOK)

また、継承した先でメソッドの動作をちょっと変えたいなーというときに便利なのが「オーバーライド」の機能。これは継承元と同じメソッド名をもちつつ、中身の動作を変えることができる機能で、同じ名前なのに振る舞いが変わるという初心者キラーな機能です(笑) その分必要なポイントで使えると便利に使うことができるので、この記事で名前だけでも覚えていってくださいな。

 

 

継承やオーバーライドも使えると便利なのでぜひ

実はUnityを使っている人だったら継承の機能をいつも使っています。

というのも、スクリプトを作る時には以下のように既に書かれているためです。クラス名の横でコロンで区切られた名前が継承元のクラスです。

いつもスクリプトを作った時には、MonoBehaviourのクラスを継承していたんです。

なので、私たちが処理を書かなくても「gameObject」と指定すればアタッチしたゲームオブジェクトの情報を使うことができたり、あるいはGetComponentでコンポーネントへの参照を取得できたりするんです。

クラスを作るたびに毎回メソッドを書くのは大変なので、すでに作ってあるクラスの動きを使い回すことで時間を短縮することができます。

また、こうしたメソッドの動きをちょっとだけ変えたいこともあります。そんなときにはオーバーライドとしてメソッドの動きをカスタマイズすることができます。発売から大分時間が経ってから「ホライゾンゼロドーン」にハマったので、オーバーライドというとこちらが映像として思い浮かぶようになってしまいました。

 

継承の例

さて、継承に関してちょっと例を挙げてみます。

例えば「動物」というクラスがあったとして、このクラスを継承して「犬」や「猫」、「人間」といったクラスを作成することを考えます。

 

動物を継承する
動物を継承する

 

「鳴く」「移動する」といった機能はこれらのクラスで共通しているので、「動物」クラスに持たせておくと便利です。

「鳴く」「移動する」の機能については継承を使って表現することで、動物クラスを継承するクラスだったら「鳴く」という機能を持っていることが分かります。

ベースとなるクラスのことを「基底クラス」、この基底クラスから派生したクラスを「派生クラス」と呼びます。初心者の頃はこの呼び方で頭がいっぱいになった記憶があります。

 

オーバーライドの例

ここで、同じ「鳴く」という機能を持っていても、「犬」クラスだったら「わん!」と鳴きますし、「猫」クラスだったら「にゃー」と鳴きます。

人間に至っては複雑な言語を持っています。

このように派生先のクラスによっては「鳴く」という機能を拡張したいこともあります。

そんな時に便利なのがオーバーライドの機能。オーバーライドは同じメソッド名を使いつつ、継承元のメソッドを上書きして継承先で個別に処理を変更できる機能です。

例えば以下のように動物クラスを表す「Animal」クラスがあったとします。(余談ですが日本語名メソッドでもコンパイルが通ります。まぁ英語で書くほうが楽なんですけど笑)

 

これを継承して犬を表すDogクラスを作成してみると以下のようになります。

 

鳴く()メソッドが呼ばれたら、犬なら「わん!」と出力するようにしてみましょう。

 

同様にCatクラスを作ると以下のような感じです。

 

猫なら「にゃー!」ですね。こんな風にクラスごとに鳴き声を変えることができます。

 

この時、継承元のメソッドでは「virtual」のキーワードをつけておきます。上の例ではAnimalクラスのメソッドにつけています。これにより、「このメソッドは上書きしてもいいよ」という情報がコンパイラに伝わります。

継承先、つまりDogクラスやCatクラスでは「override」のキーワードをつけて、「メソッドの振る舞いを上書きするよー」とコンパイラに伝えます。こうすると同じ名前のメソッドですが継承先のメソッドの動きに切り替わります。ここでの例だと犬の鳴き声や猫の鳴き声になるイメージです。

メソッドとして呼び出すときにも、「鳴く()」と指定するだけで継承先のクラスに応じた動作に切り替えてくれるので便利なんですよね。

 

まとめ

別のクラスの機能を引き継いだクラスを作ることができる機能は継承、継承する際に基底クラスにあるメソッドの振る舞いを派生クラス側で変更できるのがオーバーライドです。

継承とオーバーライドを1つの記事にまとめてみましたが、これらの情報はあくまで紹介レベルなので、この記事に出てきたキーワードを使って理解を深めるためのきっかけになればと思います。

全然コワクナイヨーホントダヨー。

 

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!