Unityに関連する記事です

 クラスの分割方法について解説します。

 クラスの分割は、プログラムの可読性と保守性を向上させ、バグの発生を減らすための重要な技術です。



分割前のサンプルコード


 まずは、単一のクラスが複数のタスクを扱う以下のサンプルコードを考えてみましょう。ここでは、スコアの管理と表示を行っています


using UnityEngine;
using UnityEngine.UI;

public class ScoreDirector : MonoBehaviour
{
    // スコアを保存する変数
    private int score = 0;

    // スコアに加算する値を保持する変数
    [SerializeField]
    private int point = 0;

    // スコア表示用のTextコンポーネント
    [SerializeField]
    private Text scoreText;


    // スコアを加算するメソッド
    public void AddScore(int amount)
    {
        score += amount;
        Debug.Log("Score added. Current score: " + score);
    }

    // スコアを表示するメソッド
    public void DisplayScore(int score)
    {
        scoreText.text = "Score: " + score;  // スコアをテキストで表示
    Debug.Log("Your total score is: " + score);       
    }

    void Start()
    {
        // デバッグ用
        AddScore(point);

        DisplayScore(score);
    }
}

 このScoreDirectorクラスでは、スコアの加算と表示を管理しています。
score変数はスコアを保持し、AddScoreメソッドはスコアを加算し、DisplayScoreメソッドはスコアを表示します。

 一見、すべてが整理されていて手頃なように見えますが、クラスが大きくなり始めると問題が生じます。


クラスの肥大化によるデメリット


 クラスが大きくなると、それはコードの管理が難しくなることを意味します。
特定のメソッドを見つけるのが困難になり、また、特定の変数がどのメソッドに影響を与えるか把握するのも難しくなります。
その結果、バグが発生しやすくなり、デバッグも困難になります。

 さらに、大きなクラスは再利用性も低下します。
一部の機能だけが別の場所で必要な場合でも、その大きなクラス全体を再利用することになり、必要ない機能まで含まれてしまいます。

 したがって、クラスを適切に分割することで、これらの問題を軽減することができます。
次のパートでは、このクラスをどのように分割するかを解説します。


役割に応じたクラスの分割


 スコアの加算と表示を一つのクラスで管理するサンプルコードを見ました。
今回はこのクラスを2つに分割し、各クラスが一つの役割だけを持つようにします。

 ScoreManagerクラス内にあった処理を他のクラスに委譲し、スコアの加算と表示を調整します。



1.Scoreクラス


 まず、スコアの管理を担当するScoreクラスを作成します。


using UnityEngine;

public class Score : MonoBehaviour
{
    // スコアを保存する変数
    private int score = 0;

    // スコアを加算するメソッド
    public void AddScore(int amount)
    {
        score += amount;
    }

    // 現在のスコアを取得するメソッド
    public int GetScore()
    {
        return score;
    }
}


2.ScoreDisplayクラス


 次に、スコアの表示を担当するScoreDisplayクラスを作成します。

using UnityEngine;
using UnityEngine.UI;

public class ScoreDisplay : MonoBehaviour
{
    // スコアを表示するためのTextコンポーネント
    public Text scoreText;

    // スコアを表示するメソッド
    public void DisplayScore(int score)
    {
        scoreText.text = "Score: " + score;  // スコアをテキストで表示
    }
}

3.ScoreManagerクラス


 そして、最後に、スコアの加算と表示を調整する新たなScoreManagerクラスを作成します。

using UnityEngine;

public class ScoreManager : MonoBehaviour
{
    // ScoreクラスとScoreDisplayクラスへの参照
    public Score score;
    public ScoreDisplay scoreDisplay;

    // スコアを加算し、表示を更新するメソッド
    public void AddScore(int amount)
    {
        score.AddScore(amount);
        scoreDisplay.DisplayScore(score.GetScore());
    }
}

 このように、ScoreManagerクラスがScoreクラスとScoreDisplayクラスを管理し、それらを連携させます。
これにより、各クラスは一つの役割に専念し、他のクラスと疎結合になることが可能になります。

 このような設計は、コードの可読性、保守性、再利用性を向上させるのに役立ちます。


クラスの分割によるメリット


 分割後のクラスはそれぞれの役割に特化しているため、コードの可読性と保守性が向上します。
それぞれのクラスが小さくなったため、特定のメソッドや変数を見つけやすくなり、デバッグも容易になります。

 また、各クラスが独立しているため、必要な機能だけを再利用することが容易になります。
例えば、スコアの加算だけが必要な場合はScoreクラスだけを使用し、スコアの表示が必要な場合はScoreDisplayクラスを追加するだけです。

 このように、クラスの分割は、より良いコードの設計と開発を実現するための重要な手法です。


複数のクラスの分割時の考え方


 プログラムにおいては、複数のクラスを利用するケースの方が多くあります。
またシーン遷移のことなども考えた設計を行うケースもあるため、複数のクラスがどのようにしてつながっているのか、把握が難しいことも多いです。

 そういった場合には、一度、こういったベーシックな形で、1つのクラス内に、やりたい処理をまとめて書いてみてください。
それから、役割を考えた上で、クラスを分割していくことで、必要な情報や分割した方がよい情報が見えてきます。

 処理が複雑になればなるほど、混乱を生じやすくなります。

 常に基本をイメージし、基本に立ち戻って考えるようにしてみることで、分割の方法へ理解が深まります。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます