【Unity】MVCモデルとは?ゲーム開発のデザインパターンの一つ

MVCモデルとは? Unity

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

このページでは、

「MVCモデルってなに?」

「MVCモデルでゲームを作ってみたい!」

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

ゲームやアプリなどを設計していく際に、MVCモデルという設計パターンを使って作る方法があります。

このMVCモデルとは、データ管理や計算処理などを行うModelクラスと、画面に表示させる役割を担うViewクラス、ユーザーからの入力を受け取ってModelとViewに指示を送るControllerクラスの3つに分けて、クラス設計を行って開発していく形のことです。

特に、複数人数で開発する際や大規模なゲームを作る時などに、MVCモデルが使われることがあります。

そこで、このページでは、Unityでゲームを作る際の設計パターンの一つとなるMVCモデルについて、どんな設計なのか、実際にどうやって作っていくのかをまとめていきます。

この記事を書いた人

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

MVCモデルとは?

まずは、MVCモデルがどういうものなのかを紹介していきます。

アプリやゲームを開発する際のモデル設計

MVCモデルというのは、アプリやゲームなどを開発する際に使うモデル設計のことで、Model(モデル)View(ビュー)Controller(コントローラー)という3つのクラスに分割して開発していく方法になります。

Modelのクラスは、HPやスコアといった変数のデータの値を管理したり、計算して更新させるなどメイン処理を行っている部分になります。

Viewのクラスは、画面への表示処理を行う部分で、Modelから受け取ったデータを使って値を表示させたり、座標を受け取ってオブジェクトを移動させて表示させるなどの処理を行います。

Controllerのクラスは、ユーザーからの入力や操作を受け取って、Modelに処理を行うように指示を出し、その結果をViewに渡して画面に表示させる役割を担っています。

もう少し簡単に言えば、Controllerが司令塔となっていて、ユーザーからの入力を受け取り、それに伴いModelに指示を出して処理を行い、その後Viewに指示を出して画面に表示させるようにしています。

このような作り方のことを頭文字からMVCモデルと呼ばれていて、他にもMVPモデルMVVMモデルなどがあります。

役割ごとにクラスが分かれているので作業しやすい

MVCモデルでゲームを作るメリットとして、クラス設計が役割毎に分かれているため、作業効率が高まるという部分にあります。

MVCモデルは前述の通り、データを管理する部分と、画面に表示させる部分、そして入力を受ける部分が、それぞれ分かれて独立して存在しています。

そのため、複数人でゲームを作っている場合に、M/V/Cのそれぞれのクラスを別の人に割り振って開発するということができるので、効率的に作っていくことができます。

また、例えば、表示処理の方法を変えたいとなっても、Viewクラスだけを変更することになり、Modelのデータや処理部分は影響を受けないため、保守性を高めるというメリットもあります。

小規模ゲームでは向かない

MVCモデルは、大規模なゲームではメリットが大きいですが、小規模なゲームでは複雑な仕組みとなってしまい、不向きな設計になりがちです。

例えば、オブジェクトを移動させる処理を作るだけであれば、通常はキー操作を使った移動処理を記述したクラスを紐づけるだけで済みます。

一方で、MVCモデルで設計している場合、キー操作による入力はControllerクラスで記述し、オブジェクトの座標の移動の計算をModelで行い、その結果をControllerでViewに渡して表示させることになるので、3つのクラスを作ることになり手間がかかるのが分かります。

このように、小規模なゲームだと処理が少ないこともあり、MVCモデルを使うと過剰設計となり、反対に作業が複雑になってしまうことがあります。

MVCモデルでHPを増減させる簡単な処理

MVCモデルの概念が分かってきたところで、実際にMVCモデルを使ってHPを増減させる簡単な処理を作ってみます。

ここでは、以下のようにHPを表示させて、その下のボタンを押すとHPの値が変更されていくという処理を作ってみます。

まず、メインの処理を行うHpModelのクラスを作成して、その中でそれぞれのボタンに応じて行いたい処理をメソッドで準備しておきます。

using UnityEngine;

public class HpModel : MonoBehaviour
{
    public int hp;

    void Awake()
    {
        hp = 100;   // 初期値を代入
    }

    // マイナスボタンが押された場合の処理
    public void HpMinus()
    {
        hp -= 10;
        if (hp < 0)
        {
            hp = 0;
        }
    }

    // プラスボタンが押された場合の処理
    public void HpPlus()
    {
        hp += 10;
        if (hp > 100)
        {
            hp = 100;
        }
    }

    // リセットボタンが押された場合の処理
    public void HpReset()
    {
        hp = 100;
    }
}

次に、HPの値を表示させるためのHpViewのクラスを作成して、HpUpdateというHPを表示するためのメソッドを作っておきます。

using TMPro;
using UnityEngine;

public class HpView : MonoBehaviour
{
    TextMeshProUGUI hpText;

    void Awake()
    {
        hpText = GetComponent<TextMeshProUGUI>();
    }

    // HPの値を表示させる処理
    public void HpUpdate(int hp)
    {
        hpText.text = "HP:" + hp.ToString();
    }
}

あとは、ユーザーからの操作を受け取るHpControllerのクラスを作成します。

using UnityEngine;

public class HpController : MonoBehaviour
{
    public HpModel hpModel; // HpModel型の変数
    public HpView hpView;   // HpView型の変数

    void Start()
    {
        hpView.HpUpdate(hpModel.hp);
    }

    // マイナスボタンがクリックされた場合
    public void MinusButtonClicked()
    {
        hpModel.HpMinus();              // Modelクラスのメソッドを呼び出す
        hpView.HpUpdate(hpModel.hp);    // Viewクラスで更新したHPで表示
    }

    // プラスボタンがクリックされた場合
    public void PlusButtonClicked()
    {
        hpModel.HpPlus();               // Modelクラスのメソッドを呼び出す
        hpView.HpUpdate(hpModel.hp);    // Viewクラスで更新したHPで表示
    }

    // リセットボタンがクリックされた場合
    public void ResetButtonClicked()
    {
        hpModel.HpReset();              // Modelクラスのメソッドを呼び出す
        hpView.HpUpdate(hpModel.hp);    // Viewクラスで更新したHPで表示
    }
}

この中の5行目と6行目で、HpModel型の変数HpView型の変数を作って、インスペクターウィンドウからそれぞれを指定しておきます。

そして、ボタンが押されたときに、HpModelの中で定義したメソッドを呼び出すようにして、HPの増減処理が行われた後に、HpViewのHpUpdateメソッドを行って、HPの値を画面に表示させる処理を行っています。

あとは、今回Buttonオブジェクトを使っているので、Unityで定義されているOnClickイベントを使って、ボタンが押されたらHpControllerで定義したメソッドを呼び出すようにしています。

これでゲームを実行してみると、

それぞれのボタンを押したときに、HpControllerクラスを介してHpModelでHPの値が変化して、HpViewで表示されるようになりました。

ここでは大した処理は行っていませんが、MVCモデルのような形で作成することができました。

まとめ

このページでは、Unityなどのゲーム開発で使われるMVCモデルについて、どんなものなのか、また実際にどうやってMVCモデルで作成するのかをまとめていきましたが、いかがでしたでしょうか?

MVCモデルとは、ゲームやアプリ開発のデザインパターンの一つで、Model・View・Controllerの3つに分けて設計していくモデルです。

Modelはデータ管理や実際の処理を行い、Viewは画面への表示処理、Controllerはユーザーからの入力を受け取り、ModelとViewに指示していくものになっています。

大規模なゲームを作る際は、MVCモデルを使うことで、開発効率の向上に繋がるため、大きなメリットがあります。

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

コメント