図で解説!クラスとインスタンスについて学ぼう!

前回は処理をまとめることができるメソッドについて学びました。続いては、メソッドと変数をまとめることができるクラスを紹介していきます

また、クラスと同時に扱われる言葉としてインスタンスが挙げられます。最初は混同しやすいのですが、わかりやすいように図解しながら解説していきますので少しずつメソッドとインスタンスについての理解を深めていきましょう。

クラスってなんだろう?

まずは、そもそもクラスとは何なのかという疑問についてお答えしていきます。

クラスはメソッドと変数をまとめたもの

前回紹介したメソッドは、「処理」をまとめたものでした。処理中心のメソッドに対してクラスは、メソッドだけではなく変数を同時に定義することができます

これがどういった時に役立つのかというと、例えばキャラクターなどを扱う時です。次の画像をみてください。

今回は騎士というクラスを用意しました。騎士クラスはRPGの主人公のようなものだとイメージしてみてください。

騎士クラスは、HP・MP・攻撃力といった変数だけではなく、攻撃・守る・魔法といったメソッドを持っています。最後のダメージというのはダメージを受けるというメソッドです。後半の実際にスクリプトを用いる場合に使用します。

「処理」だけしか扱えないメソッドよりも、「モノ」を扱う場合には変数とメソッドどちらも扱えた方が便利という場合があり、そういったシーンではクラスは非常に活躍します。

実際にUnityの開発でも、クラスは必ずと言っていいほどよく使われます。

クラスの基本的な書き方

クラスの考え方について理解したところで、実際にスクリプト上での基本的な書き方について見ていきましょう。

こちらがスクリプトにおけるクラスの基本的な書き方です。classを宣言してクラス名を定義し、その中に変数とメソッドを定義していくことを覚えましょう。

ちなみに、見慣れない言葉が出てきましたが、クラス内で扱う変数をメンバ変数、同様にクラス内で扱うメソッドをメンバメソッドと呼びます

クラスを実体化させたものがインスタンス!

クラスは、それ自体は設計図のようなもので、実体はありません。

上の画像を見てください、騎士・魔法使い・アーチャーといったクラスと、ゲーム上のキャラクターである騎士、魔法使いは全く別な存在です。

もう少し具体化すると、RPGの世界では騎士という職業の人物は沢山存在しますが、騎士という職業は1つだけしか存在しませんこの騎士一人一人がインスタンスで、職業上の騎士という肩書きがクラスになります。

クラスとそれを「実体化」させたものがインスタンスであるという関係は押さえておきましょう。

クラスを使ってみよう!

クラスとインスタンスについて学んだところで、これから実際にクラスを扱う方法について学んでいきます。

クラスは「型」のように扱える

「型」というのは変数や定数といった値を入れておく箱のようなものでした。実は、作成したクラスでも型のように扱うことができます

簡単にいうと、Knightクラスを作ればKnight型を扱えるということです。(厳密には型とクラスは異なるのですが、最初は同じように扱えると考えておいても大丈夫です)

スクリプトにおいて、string name;でstring型の変数nameを作れるようにKnight Player;と記入すればKnight型の変数Playerを作成することができます。クラスそのものは実体を持たないので、変数nameに後から値を入れるように、変数Playerについても同様に”何か”を入れる必要があります。

その”何か”がここではインスタンスにあたります変数と同様にインスタンスも右から左に代入されます

クラスの扱い方

インスタンスを使用する際には、上の画像のように「Knight Player = new Player();」という風に書きます。

メンバ変数・メンバメソッドの呼び出しかた

インスタンスを生成したら、もとのクラスが持つメンバ変数やメンバメソッドを呼び出すことができます

騎士クラスのインスタンスであるPlayerの場合、「Player.メンバメソッド名orメンバ変数名」でメンバメソッドおよびメンバ変数を呼び出すことができます。ここで用いる「.(ドット)」は日本語の「〜の」にあたります

「.(ドット)」で記入する例はスクリプトでも頻繁に目にすることになるので、日本語における「〜の」にあたるを意味することは覚えておきましょう。

実際にスクリプトを書いてみよう

それでは、実際にスクリプトを試していきましょう。Unityのプロジェクトを作成し、テスト用のスクリプトを用意します
テスト用のスクリプトの準備については、下記記事で解説しているのでよろしければご参照ください。スクリプトの実行だけなので、何らかのオブジェクトにアタッチされたスクリプトさえあれば問題ありません。

上手に使えてる?メソッドの基本について学ぼう!

2018.09.25

 

スクリプトを開き、次のように入力してください。まだわからない内容についても下記で説明していくので大丈夫です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Knight {

    private int hp = 150;
    private int mp = 10;
    private int op = 5;//offensive power(攻撃力)の略です

    public void Attack(){
        Debug.Log(this.op + "のダメージを与えた");
    }//攻撃メソッド

    public void Magic() {
        Debug.Log(this.mp + "のダメージを与えた");
    }//魔法メソッド


    public void Damage(int damage){

        Debug.Log(damage + "のダメージを受けた");
        this.hp -= damage;
        Debug.Log("残りの体力は" + hp + "です");
    }//ダメージメソッド
}


public class Test : MonoBehaviour
{

    // Use this for initialization
    void Start() {
        Knight Player = new Knight();//Knightクラスのインスタンスを作成し、変数Playerに代入する

        Player.Attack();
        Player.Magic();
        Player.Damage(30);
    }

}





スクリプトの内容について簡単に説明すると、5行目にKnightクラスを定義しています。また、7~9行目にメンバ変数を定め、11~13行目および15~17行目で攻撃・魔法メソッドを定義しています。また、20~25行目のダメージメソッドでは相手から攻撃を受けた際のメソッドを定義しています。
34行目では、Knightクラスのインスタンスを作成し、変数Playerにインスタンスを代入しています。
その後、攻撃・魔法・ダメージの3つのメンバメソッドが呼び出されています。

スクリプトの記入が完了したら、早速プロジェクトを再生してみましょう。

このように表示されれば、スクリプトの実行は成功です。

クラスを使用する際に知っておきたい2つのキーワード

最後に上のスクリプトで出てきた、「private」や「public」などで表されるアクセス修飾子thisキーワードについて解説していきます。

アクセス修飾子

上のスクリプト内にある「private」 や「public」といった文字列は、アクセス修飾子と呼ばれます。他のクラスから呼び出すことができるかどうかを表します

「public」は他のクラスから呼び出すことができますが、「private」のついたメンバ変数およびメソッドは他のクラスからアクセスすることができません。

また、アクセス修飾子を省略することも可能で、その場合にはprivateであると判断されます。

以下アクセス修飾子をまとめておきます。

アクセス修飾子 アクセス可能なクラス
public 全てのクラスからアクセスできる
protected 同じクラスおよびそのサブクラスからアクセスできる
private 同じクラスからだけアクセスできる

thisキーワード

12行目や16行目で「this」というキーワードが登場しています。「this」というのは、自分自身のインスタンスのことを意味します

thisを用いなくても、そのクラスのメンバ変数を使用することができるのですが、メンバメソッド内で同じ名前の変数を用いた場合はメソッド内の新しい変数が優先されてしまいます。

実際にスクリプトで見ていきましょう。

先ほど作成したスクリプトを、上の画像のように変更します。変更が完了したら、早速プロジェクトを再生してみます。(上の黄色い警告はクラス上部で定義したメンバ変数が使用されてないことに対する警告で、プロジェクトの再生は問題なく行えます。)


先ほどは、「5のダメージを与えた」と表示されていましたが、後から設定したローカル変数が優先されたため「100のダメージを与えた」に変わりました。

このようなバグを防ぐために、メンバ変数を使用する場合には「this」キーワードを用いると便利です。

変数の確認
どこでも使用できるグローバル変数に対し、使用できる範囲の限定された変数をローカル変数と呼びます。例えばメソッド内で宣言されたローカル変数は、そのメソッド外では使用できません。

まとめ

いかがでしたでしょうか?

今回は、変数とメソッドを同時に定義できるクラスと、それを実体化させたインスタンスについて解説しました。特にクラスとインスタンスの違いは最初は理解しにくいかもしれないので、Unityを使っていく中で少しずつ理解を深めていきましょう。

最後に、今回のポイントをまとめておきます。

今回のポイント
・クラスには変数とメソッドを定義できる
・クラス内で定義する変数をメンバ変数、メソッドをメンバメソッドと呼ぶ
・クラスを実体化させたものをインスタンスと呼ぶ
・アクセス修飾子を用いることで、他のクラスからのアクセスを制限できる
・メンバ変数を扱う際にはthisキーワードを用いることでバグを減らせる

オススメアプリ!渋谷で気軽に友達を作れるアプリが登場!