【Unity】オーバーライドで継承したメソッドの内容を書き換えられる!

オーバーライドとは? Unity

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

このページでは、

「C#のオーバーライドってなに?」

「オーバーライドはどうやって作るの?」

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

Unityでスクリプトを作る際に使うC#では、オーバーライドという仕組みを使うことができます。

このオーバーライドとは、継承した際に基本クラスで定義していたメソッドの処理内容を、派生クラスで書き換えることができるものです。

オーバーライドを使うことで、継承先の派生クラスに同じメソッド名でも異なる処理を行うことができるようになります。

そこで、このページでは、UnityのC#で使えるオーバーライドという仕組みについて、どんな仕組みなのか、また作り方や使い方をまとめていきます。

この記事を書いた人

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

オーバーライド(override)とは?

オーバーライドとは、冒頭でも解説した通り、クラスの継承を行った際に、基本クラスで定義しているメソッドの処理内容を、派生クラスで書き換えて異なる処理を行えるようにできる仕組みです。

そもそも継承というのは、クラスで定義した変数やメソッドを別のクラスでも使えるようにするための仕組みで、クラス毎に重複したプログラムを無くす役割があります。

なお、継承元となるクラスを基本クラス、継承先となるクラスを派生クラスと呼びます。

例えば、キャラクターの基本クラスを作り、Attackという攻撃処理を行うメソッドを定義していたとします。

このクラスを継承してキャラクターの派生クラスを作ることで、このAttackというメソッドを派生クラスでも使うことができるようになります。

ただ、キャラクター毎に攻撃処理が同じであれば問題ないですが、キャラクターによっては攻撃処理の内容を変えたい場合(「パンチ」「キック」など)があります。

この際に、Attackメソッドをオーバーライドして、派生クラスで処理内容を書き換えてあげることで、同じメソッドでも異なる処理を行うことができるようになります。

オーバーライド(override)の作り方・使い方

ここからは、オーバーライドをどのように作っていくのかを紹介していきます。

「virtual」と「override」のキーワードを記述する

まず、継承元となる基本クラスで、オーバーライドしたいメソッドを定義する際に、頭に「virtual」というキーワードを付けて定義してあげます。

virtual 型名 メソッドの名称(引数)
{
	// メソッドの処理 //
}

そして、継承先となる派生クラスでは、同じようにメソッドを定義してあげて、こちらには頭に「override」というキーワードを付けてあげます。

virtual 型名 メソッドの名称(引数)
{
	// 書き換える処理 //
}

このようにキーワードを付けてメソッドを定義することで、派生クラスでのメソッドの処理内容が書き換えられることになります。

オーバーライドを使って処理を書き換える

実際に、Unity上でオーバーライドを使ってメソッドの処理を書き換えてみます。

ここでは、継承元となる基本クラスをPlayer、そして継承先となる派生クラスをPlayerAPlayerBとしています。

まず、基本クラスのPlayerクラスで以下のように記述しています。

using UnityEngine;

public class Player : MonoBehaviour
{
    // 攻撃処理用のメソッド
    public virtual void Attack()    // virtualを付けて定義
    {
        Debug.Log("攻撃する");
    }

    // 攻撃処理を実行するメソッド
    public void OnAttack()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Attack();   // Attackメソッドを呼び出す
        }
    }
}

6行目でAttackメソッド「virtual」のキーワードを付けて定義しています。

なお、virtualを付けたメソッドは、他のクラスで書き換えるのを前提としているため、他のクラスからアクセスできるようにpublic修飾子を付けています。

そして、12行目でOnAttackメソッドを作り、スペースキーを押したらAttackメソッドが実行されるようにしています。

次に、このPlayerクラスを派生したPlayerAに、以下を記述しています。

using UnityEngine;

public class PlayerA : Player   // Playerクラスを継承
{
    void Update()
    {
        OnAttack(); // 攻撃処理
    }
}

PlayerAは、基本クラスのAttackメソッドの処理をそのまま使用したいので、Updateメソッドの7行目でOnAttackメソッドの処理を記述しているだけとなっています。

これでPlayerAクラスを空オブジェクトなどに紐づけて、ゲームを実行してスペースキーを押してみると、

コンソールウィンドウに「攻撃する」と表示されていて、メソッドを継承できているのが分かります。

そして、もう一つの派生クラスのPlayerBでは、以下のように記述しています。

using UnityEngine;

public class PlayerB : Player   // Playerクラスを継承
{
    public override void Attack()    // overrideを付けて定義
    {
        Debug.Log("パンチで攻撃する");
    }

    void Update()
    {
        OnAttack(); // 攻撃処理
    }
}

5行目でAttackメソッドに「override」のキーワードを付けて、中の処理を書き換えています。

あとは、PlayerAと同じく、Updateの中の12行目で、OnAttackメソッドを行うようにしています。

これで同様にオブジェクトにアタッチ、ゲームを実行してスペースキーを押してみると、

コンソールウィンドウには「パンチで攻撃する」と表示されるようになり、メソッドの内容を書き換えることができました。

まとめ

このページでは、Unityで使えるC#のオーバーライドという仕組みについて、どういうものなのか、作り方や使い方までをまとめていきましたが、いかがでしたでしょうか?

オーバーライドとは、継承元で定義したメソッドの処理内容を、継承先で書き換えることができる仕組みとなっています。

オーバーライドを使う際は、継承元で「virtual」を付けてメソッドを作り、継承先では「override」を付けて書き換えを行います。

継承先でも同じメソッドを使いたいけど、処理内容や機能を少し変更させたいという場合に、オーバーライドが便利に使えます。

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

コメント