🐙

ゲーム開発のシチュエーションで学ぶLINQ:Selectメソッド

2023/08/12に公開

はじめに

LINQにはじめて触れる方や、過去に詰まった経験のある方のために、この記事を執筆しています。LINQの勉強中、どのシチュエーションでどのメソッドを使うべきか戸惑うことはありませんか?また、知識として学んだはずのメソッドを、実際の開発時に忘れてしまうことも。そんな方々の課題を解決するため、ゲーム開発でよく遭遇する実例を通じて、LINQのメソッドを解説します。今回は、Selectメソッドを紹介します。
この記事を読めば、Selectメソッドの理解を深め、ゲーム開発のさまざまな場面での応用が可能になります。

Selectメソッド解説

LINQのSelectメソッドは、データのリストから特定の情報を選び出すためのメソッドです。たとえば、学校の学生たちの成績リストがあるとき、数学の成績だけを取り出したいと思うことがあるでしょう。Selectメソッドを使うと、すべての学生から数学の成績だけを抜き出し、新しいリストを作ることができます。プログラミングで情報を整理したいときにとても便利な機能です。

ゲームのシチュエーション

題材

とあるRPGゲームで、プレイヤーキャラクターがさまざまなスキルを持っている場面を題材にします。

シナリオ

プレイヤーキャラクターは、攻撃、防御、回復などのスキルを持っており、これらのスキルの情報は、オブジェクトとして保持されています。特定の条件下でプレイヤーが、使用できるスキルの一覧を表示する必要があります。
ここでの特定の状況下とは、以下の様な状況を指します。

  • プレイヤーキャラクターの現在のレベルに基づいて、利用可能なスキルを決定します。
  • ゲームの進行に応じて、キャラクターのレベルが上昇し、新しいスキルが解放される場合があります。
  • たとえば、プレイヤーのキャラクターがレベル5に到達した場合、レベル5以下で必要とされるすべてのスキルが利用可能になります。**

今回は、現在のレベル以下の条件に当てはまる、スキル名を表示したい場合のサンプルコードの紹介をします。

サンプルコード

サンプルコードでは、Whereメソッドで現在のレベル以下のスキルを条件として集めます。集められたスキルの名前をSelectメソッドで抽出します。抽出した利用可能なスキルの名前だけをListにします。
これによって、データの変換や操作が簡単に実現できます。

using System.Linq;

// スキルクラス
public class Skill
{
    // スキル名
    public string Name { get; set; }
    // スキルに必要なレベル
    public int LevelRequired { get; set; }
}

// プレイヤークラス
public class Player
{
    public int Level { get; set; }
    
    // 利用可能なスキルを返すメソッド
    public List<Skill> AvailableSkills()
    {
        List<Skill> allSkills = new List<Skill>
        {
            new Skill { Name = "攻撃", LevelRequired = 1 },
            new Skill { Name = "防御", LevelRequired = 5 },
            new Skill { Name = "回復", LevelRequired = 10 }
        };

        // ここが今回一番大事な箇所
        return allSkills.Where(skill => skill.LevelRequired <= Level).Select(skill => skill.Name).ToList();
    }
}

Whereメソッドに関して、わからない人はこちらの記事で解説しています。
https://zenn.dev/hiropoko/articles/304909a8d2846a

その他、応用例

LINQのSelectメソッドは、こんな場面で使えます。

  1. 敵AIの属性抽出: ゲーム内の敵のリストから特定の属性(例: 体力、攻撃力など)を抽出して操作や計算に利用する。
  2. インベントリの整理: プレイヤーのインベントリから特定の情報(例: アイテムの名前、カテゴリーなど)を抽出し、一覧表示や絞り込みに利用する。
  3. スコアランキングの作成: プレイヤーのスコアデータからランキングを生成する際、特定のデータ(例: プレイヤー名、スコアなど)を抽出して表示する。

おわりに

以上でLINQのSelectメソッドの紹介を終わりになります。プロパティなどから新たに要素を抽出した配列を使う時などに便利だと思います。今後もさまざまなメソッドを紹介します。よろしくお願いします。

Discussion