【Unity】継承とは?変数やメソッドを別のクラスで使える機能

継承とは?クラスを引き継げる Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityでゲーム作りをしているんだけど、継承がなんなのかわからない。」

「継承ってどうやって使えばいいの?」

というお悩みの方に向けた内容となっています。

継承とは、クラスで定義した変数やメソッドを別のクラスで使えるようにするための仕組みです。

同じようなオブジェクトにスクリプトを書いていく場合、宣言した変数やメソッドが他のクラスと重複してしまうことがよくあります。

この継承を使うことで、クラスごとに重複している変数やメソッドを一つにまとめて管理することができて、プログラムを修正する際などにその一つだけ変更すれば済むので、非常に効率が良いです。

そこで、このページでは、Unityのスクリプトを作っていく際に使うことができる継承について、どんな仕組みなのか、機能や使い方、注意点までをまとめていきます。

なお、このページでは、

Windows11
Unity Hub3.11.1
Unity6

のバージョンで解説しています。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

継承とは?

まず、継承がどういう仕組みなのかについて紹介していきます。

クラスの変数やメソッドを別のクラスに引き継ぐ

継承とは、冒頭でも解説した通り、クラスで宣言したメンバ変数やメンバメソッドを別のクラスに引き継ぐことができる仕組みです。

通常、クラスで定義した変数やメソッドはそのクラス内でのみ使用することができ、別のクラスで呼び出す際は、そのクラスのインスタンスを作成してから使うことになります。

しかし、この継承を使うことで、そのクラスの変数やメソッドを別のクラスに引き継ぐことができるため、変数やメソッドを元のクラスで宣言していれば使用することができます。

重複したプログラムをまとめる役割

継承は、クラス毎に重複したプログラムを無くして、効率化するための役割があります。

例えば、敵キャラクターとして敵A・敵B・敵Cと3体いて、それぞれのキャラクター毎のクラスで変数やメソッドを定義していたとします。

そして、それぞれのクラスで定義した中から、攻撃のメソッドであるattackを修正したいとした場合、3体のattackメソッドを修正していかなければなりません。

この時、それぞれのキャラクターでattackメソッドを含む重複する部分の変数やメソッドを別のクラスから継承させておけば、継承の元となるクラスのattackメソッドだけを修正すれば、すべてのキャラクターの処理が修正できます。

このように、継承を使ってクラスごとに重複した変数やメソッドをまとめておくことで、敵キャラクターが何体いても修正は一つだけ、という仕組みを作ることができます。

基本クラスと派生クラスについて

重複する変数やメソッドをまとめている継承の元となるクラスのことを「基本クラス」と呼びます。

そして、基本クラスから継承されている継承先のクラスのことを「派生クラス」と呼びます。

また、この派生クラスから、さらに継承して派生クラスを作ることができ、この派生クラスが持つ変数やメソッドは、辿ってきた元のクラスで定義されているものが全て含まれています。

継承の使い方

継承の仕組みが分かってきたところで、実際に継承をどのように使うのかをまとめていきます。

継承させたい基本クラスを作成する

まずは、継承の元となる基本クラスを作成しておきます。

今回は、EnemyBaseというファイル名・クラス名で作成しています。

using UnityEngine;

public class EnemyBase : MonoBehaviour
{
    public int hp;  // 変数hpを宣言している
    public int damage;  // 変数damageを宣言している

    public void attack()    // メソッドattackを定義している
    {
        Debug.Log("攻撃する");
    }

    public void runAway()   // メソッドrunAwayを定義している
    {
        Debug.Log("逃げる");
    }
}

この中で定義したものが、派生クラスに継承されていきます。

なお、変数やメソッドの前にpublicを付けていますが、これはアクセス修飾子と呼ばれるもので、他のクラスからメンバ変数やメンバメソッドを参照できるようにするかどうかを決めています。

publicは、すべてのクラスから参照できるアクセス修飾子となっています。

継承して派生クラスを作成する

派生クラスを作成する時は、

class 派生クラス名 : 基本クラス名
{

}

と書いてクラスを作ってあげることで、基本クラスから継承させることができます。

ここでは、EnemyAというクラス名で作成し、先ほどのEnemyBasicを継承させてみます。

using UnityEngine;

public class EnemyA : EnemyBase // EnemyBaseを継承する
{
    void Start()
    {
        hp = 5;
        damage = 10;
        Debug.Log("HPは" + hp);
        Debug.Log("ダメージは" + damage);
        attack();
        runAway();
    }

}

実際にゲームを実行してみると、EnemyBasicで定義した変数やメソッドを使うことができています。

なお、基本クラスのEnemyBasicも、Unity側で準備されている「MonoBehaviour」クラスを継承していることが分かります。

継承の注意点:継承できるクラスは1つのみ

継承の注意点として、派生クラス側で継承できる基本クラスは1つだけとなっています。

例えば、敵キャラクターが飛行できるクラスと、泳ぐことができるクラスを作っていて、飛行も泳ぐこともできる敵のクラスを作ろうとしても、2つを継承することができません。

この場合は、元となる基本クラスで飛行と泳ぐ処理を定義してしまうか、飛行の派生クラスを作ってその派生クラスの中で泳ぐ処理を定義する必要があるため、注意しておきましょう。

また、継承と同じような機能として、インターフェースという機能があります。

このインターフェースは、メソッドを強制的に実装させるという仕様がありますが、継承をいくつも行うことができます。

そのため、先ほどの例であれば、飛行クラスと泳ぐクラスの両方の機能を持つクラスは、インターフェースを使ってそれぞれを継承させることで実現できます。

インターフェースについては、また別の記事で紹介します。

まとめ

このページでは、Unityのスクリプト作成の際に使うことができる継承という機能について、どんな仕組みなのか、使い方や注意点までをまとめていきましたが、いかがでしたでしょうか?

継承とは、クラス内で定義した変数やメソッドを、別のクラスで引き継いで使えるようにした機能です。

複数のクラスで重複したプログラムを無くす役割があり、継承を使うことで非常に便利にスクリプトを作っていくことができます。

ただし、継承は1つだけしか出来ないため、注意しておきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント