【Unity】ポリモーフィズムを使うジャンル

Unityは主にゲーム開発に使用されるため、ポリモーフィズムを使用するジャンルはゲームジャンルとなります。以下にいくつかのゲームジャンルの例を示します。

選択ジャンルのサンプル

  1. アクションゲーム: プレイヤーキャラクターや敵キャラクターの行動や挙動をポリモーフィズムを使って実装することができます。異なるキャラクターのクラスを作成し、それぞれが共通の基底クラスを継承することで、共通のメソッドやプロパティを利用しながら、異なる振る舞いを実現できます。
  2. RPG(ロールプレイングゲーム): キャラクターのクラスやスキルの種類が多岐にわたるRPGでは、ポリモーフィズムを活用して異なるキャラクターやスキルを実装することができます。例えば、異なる敵キャラクターが共通の基底クラスを継承し、それぞれが異なる攻撃方法や行動パターンを持つように設計することができます。
  3. シミュレーションゲーム: シミュレーションゲームでは、様々なオブジェクトやエンティティの振る舞いを表現する必要があります。例えば、都市建設シミュレーションでは、異なる建物や住民のクラスを作成し、それぞれが異なる機能や振る舞いを持つようにすることができます。

これらは一部の例ですが、ポリモーフィズムは様々なゲームジャンルで利用されることがあります。Unityの柔軟なクラス設計とポリモーフィズムの特性を組み合わせることで、異なる種類のオブジェクトやエンティティを効果的に管理し、ゲームのバリエーションや柔軟性を高めることができます。

アクションゲームでは

以下は、Unityでアクションゲームのキャラクターを表すクラスの例です。ポリモーフィズムを使用して、異なるタイプのキャラクターを実装します

// キャラクターの基底クラス
public class Character
{
    public virtual void Attack()
    {
        Debug.Log("通常攻撃");
    }
}

// 敵キャラクタークラス
public class Enemy : Character
{
    public override void Attack()
    {
        Debug.Log("敵の攻撃");
    }
}

// プレイヤーキャラクタークラス
public class Player : Character
{
    public override void Attack()
    {
        Debug.Log("プレイヤーの攻撃");
    }
}

// ゲームマネージャークラス
public class GameManager : MonoBehaviour
{
    private Character[] characters;

    private void Start()
    {
        // キャラクターの生成と配列への追加
        characters = new Character[] {
            new Enemy(),
            new Player()
        };

        // 全てのキャラクターの攻撃メソッドを呼び出す
        foreach (Character character in characters)
        {
            character.Attack();
        }
    }
}

上記のコードでは、Characterクラスを基底クラスとし、Attack()メソッドを仮想メソッドとして定義しています。EnemyクラスとPlayerクラスは、それぞれCharacterクラスを継承し、Attack()メソッドをオーバーライドして独自の攻撃内容を実装しています。

GameManagerクラスでは、EnemyPlayerのインスタンスを作成し、Characterの配列に格納しています。その後、foreachループを使用して配列内の全てのキャラクターのAttack()メソッドを呼び出しています。

実行すると、各キャラクターの攻撃内容がデバッグログに表示されます。Enemyの場合は「敵の攻撃」と表示され、Playerの場合は「プレイヤーの攻撃」と表示されるでしょう。

このように、ポリモーフィズムを使用することで、共通の基底クラスのメソッドを異なるクラスが継承し、それぞれのクラスに固有の振る舞いを実現することができます。

RPG(ロールプレイングゲーム)では

以下は、UnityでRPG(ロールプレイングゲーム)のキャラクターとスキルを表すクラスの例です。ポリモーフィズムを使用して、異なるタイプのキャラクターとスキルを実装します

// キャラクターの基底クラス
public class Character
{
    public virtual void Attack()
    {
        Debug.Log("通常攻撃");
    }
}

// 敵キャラクタークラス
public class Enemy : Character
{
    public override void Attack()
    {
        Debug.Log("敵の攻撃");
    }
}

// プレイヤーキャラクタークラス
public class Player : Character
{
    public override void Attack()
    {
        Debug.Log("プレイヤーの攻撃");
    }
}

// スキルの基底クラス
public class Skill
{
    public virtual void Use()
    {
        Debug.Log("スキルを使用");
    }
}

// 火のスキルクラス
public class FireSkill : Skill
{
    public override void Use()
    {
        Debug.Log("火のスキルを使用");
    }
}

// 氷のスキルクラス
public class IceSkill : Skill
{
    public override void Use()
    {
        Debug.Log("氷のスキルを使用");
    }
}

// ゲームマネージャークラス
public class GameManager : MonoBehaviour
{
    private Character[] characters;
    private Skill[] skills;

    private void Start()
    {
        // キャラクターの生成と配列への追加
        characters = new Character[] {
            new Enemy(),
            new Player()
        };

        // スキルの生成と配列への追加
        skills = new Skill[] {
            new FireSkill(),
            new IceSkill()
        };

        // 全てのキャラクターの攻撃メソッドを呼び出す
        foreach (Character character in characters)
        {
            character.Attack();
        }

        // 全てのスキルの使用メソッドを呼び出す
        foreach (Skill skill in skills)
        {
            skill.Use();
        }
    }
}

上記のコードでは、前回のアクションゲームの例に加えて、Skillクラスといくつかの具体的なスキルクラスを追加しています。Skillクラスは基底クラスとして、Use()メソッドを仮想メソッドとして定義しています。FireSkillクラスとIceSkillクラスは、それぞれSkillクラスを継承し、Use()メソッドをオーバーライドして独自のスキル内容を実装しています。

GameManagerクラスでは、EnemyPlayerのインスタンスを作成し、Characterの配列に格納しています。また、FireSkillIceSkillのインスタンスを作成し、Skillの配列に格納しています。その後、foreachループを使用して、キャラクターとスキルのそれぞれのメソッドを呼び出しています。

実行すると、各キャラクターの攻撃内容と各スキルの使用内容がデバッグログに表示されます。

このように、ポリモーフィズムを使用することで、異なるクラスが共通の基底クラスのメソッドを継承し、独自の振る舞いを実現できます。RPGゲームでは、キャラクターやスキルの種類が多岐にわたるため、ポリモーフィズムを活用すると柔軟で拡張性のある設計が可能となります

スキルはキャラクタが所有していると考え、クラス設計をします

シミュレーションゲームでは

インタラクション:相互作用を指します

// 建物の基底クラス
public class Building
{
    public virtual void Interact()
    {
        Debug.Log("建物とのインタラクション");
    }
}

// 住宅クラス
public class House : Building
{
    public override void Interact()
    {
        Debug.Log("住宅とのインタラクション");
    }
}

// 商業施設クラス
public class Shop : Building
{
    public override void Interact()
    {
        Debug.Log("商業施設とのインタラクション");
    }
}

// 住民の基底クラス
public class Resident
{
    public virtual void Interact()
    {
        Debug.Log("住民とのインタラクション");
    }
}

// 一般住民クラス
public class CommonResident : Resident
{
    public override void Interact()
    {
        Debug.Log("一般住民とのインタラクション");
    }
}

// 商人クラス
public class Merchant : Resident
{
    public override void Interact()
    {
        Debug.Log("商人とのインタラクション");
    }
}

// ゲームマネージャークラス
public class GameManager : MonoBehaviour
{
    private Building[] buildings;
    private Resident[] residents;

    private void Start()
    {
        // 建物の生成と配列への追加
        buildings = new Building[] {
            new House(),
            new Shop()
        };

        // 住民の生成と配列への追加
        residents = new Resident[] {
            new CommonResident(),
            new Merchant()
        };

        // 全ての建物とのインタラクションメソッドを呼び出す
        foreach (Building building in buildings)
        {
            building.Interact();
        }

        // 全ての住民とのインタラクションメソッドを呼び出す
        foreach (Resident resident in residents)
        {
            resident.Interact();
        }
    }
}

上記のコードでは、Buildingクラスといくつかの具体的な建物クラス、Residentクラスといくつかの具体的な住民クラスを定義しています。建物と住民それぞれに対してInteract()メソッドを実装し、それぞれのクラスでオーバーライドして独自のインタラクション内容を実装しています。

GameManagerクラスでは、HouseShopのインスタンスを作成し、Buildingの配列に格納しています。また、CommonResidentMerchantのインスタンスを作成し、Residentの配列に格納しています。その後、foreachループを使用して、全ての建物と住民のインタラクションメソッドを呼び出しています。

実行すると、各建物と住民のインタラクション内容がデバッグログに表示されます。

このように、ポリモーフィズムを使用することで、共通の基底クラスのメソッドを異なるクラスが継承し、独自の振る舞いを実現できます。シミュレーションゲームでは、異なる種類の建物や住民が存在し、それぞれとのインタラクションが重要な要素となる場合があります。ポリモーフィズムを活用することで、柔軟な設計と異なるオブジェクト間の相互作用を実現することができます。