【Unityゲーム制作Tips】Dictionary<Tkey, Tvalue>クラスでデータセットを管理する

Unityゲーム制作Tips、Dictionaryクラスでデータセットを管理する
ゆくすぃ

ごきげんよう、Budding Lab.編集部のゆくすぃです!
ここでは、Unityを使ったゲーム制作Tipsをお伝えしています!

会話システムを使った「サンプルゲーム:クラスメイト」のように「キャラクターの立ち絵(画像)とキャラクターの名前(テキスト)をセットにして扱いたい」という場合に「Dictionary<Tkey, Tvalue>クラス」を使うと、とても便利です!

そこで、今回は「Dictionary<Tkey, Tvalue>クラスでデータセットを管理する」を解説します!

目次

Dictionary<Tkey, Tvalue>クラスとは

Dictionary<Tkey, Tvalue>クラスとは、System.Collections.Generic という名前空間に属している「データセットを扱うための仕組み」の一つです。

Dictionary<Tkey, Tvalue>クラス

Dictionary<Tkey, Tvalue>クラス

一意のキー(Tkey)と、それに対応する値(Tvalue)を組み合わせて保持できる。
必要な時に、キー(Tkey)を使って値(Tvalue)を呼び出せる。

※参考URL:Dictionary<Tkey, Tvalue>クラス(Learn Microsoft)

ゆくすぃ

スクリプトの冒頭に「using System.Collections.Genetic」と記述することで使えるようになります。

Dictionary<Tkey, Tvalue>クラスを使う場面

「サンプルゲーム:クラスメイト」の会話システムでは、会話が発生すると「キャラクターの立ち絵 」と「キャラクターの名前」と「会話文」がセットで表示されます。

classmate-blog_30

「キャラクターの名前」と「キャラクターの立ち絵」は常に同じペアを組むので、下記のように「キャラクター管理番号」を「key」にしたデータセットと考えることができます。

※ key:キャラクター管理番号

keyキャラクターの名前キャラクターの立ち絵
0幼馴染みImage0(幼馴染みの立ち絵)
1クラスメイトImage1(クラスメイトの立ち絵)
2親友Image2(親友の立ち絵)
3主人公なし

会話文を表示する際、このデータセットの「key(0, 1, 2, 3 の数字)」を使ってキャラクターの名前と立ち絵の表示を一度に制御できれば、スクリプト内で何度もキャラクターの名前(”幼馴染み” や “クラスメイト” など)や立ち絵のファイル名(”Image0″ や “Image1” など)を書かずに済みます。また、組み合わせのミスマッチを防げますし、コードもすっきりしそうです。

Dictionary<Tkey, Tvalue>クラスの使い方

Dictionary<Tkey, Tvalue>クラスを使って「辞書:characterData」を作ってみましょう。

  • characterData:辞書の名前(任意の名前で良い)
using UnityEngine;
using System.Collections.Generic; // Dictionaryクラスを使うために必要

public class TalkController : MonoBehaviour
{
    // 辞書:characterDataを宣言
    Dictionary<int, string> characterData;

    // 辞書:characterDataを初期化
    void Awake()
    {
        characterData = new Dictionary<int, string>
            {
                {0, "幼馴染み" },
                {1, "クラスメイト" },
                {2, "親友" },
                // 3は名前なし
            };
    }
}

これで、キャラクター管理番号(Tkey)に対応するキャラクターの名前(Tvalue)が保存された「辞書:characterData」ができました。

さらに、キャラクターの立ち絵を辞書に付け加えてみましょう。

  • キャラクターの立ち絵は、UI:Imageで作成。
using UnityEngine;
using UnityEngine.UI; // UI:Imageを扱うために必要
using System.Collections.Generic; // Dictionaryクラスを使うために必要

public class TalkController : MonoBehaviour
{
    // キャラクターの立ち絵を設定
    [SerializeField] private Image Image0;
    [SerializeField] private Image Image1;
    [SerializeField] private Image Image2;

    // 辞書:characterDataを宣言
    private Dictionary<int, Dictionary<string, Image>> characterData;

    // 辞書:characterDataを初期化
    void Awake()
    {
        characterData = new Dictionary<int, Dictionary<string, Image>>
        {
            { 0, new Dictionary<string, Image> { { "幼馴染み", Image0 } } },
            { 1, new Dictionary<string, Image> { { "クラスメイト", Image1 } } },
            { 2, new Dictionary<string, Image> { { "親友", Image2 } } }
            // 3は名前も立ち絵もないので設定しなくて良い
        };
    }
{

Dictionary<Tkey, Tvalue>の「Tvalue」の箇所に、さらにDictionary<Tkey, Tvalue>が入った辞書の「入れ子」状態になりましたね!

では、いよいよ「辞書:characterData」を使って、キャラクターの名前と立ち絵を表示するスクリプトを書いてみましょう。

  • uiName.text:TextMashPro型のUI「uiName」のtextプロパティ。キャラクターの名前を表示するテキストエリア
  • Image0, Imqge1, Image2:Image型のUI。キャラクターの立ち絵がセットされている
using UnityEngine;
using UnityEngine.UI; // UI:Imageを扱うために必要
using System.Collections.Generic; // Dictionaryクラスを使うために必要
using TMPro; // UI:TextMashProを扱うために必要


public class TalkController : MonoBehaviour
{
    // キャラクターの立ち絵を設定
    [SerializeField] private Image Image0;
    [SerializeField] private Image Image1;
    [SerializeField] private Image Image2;

    // キャラクターの名前を表示する「TextMeshPro:uiName」と接続
    [SerializeField] private TMP_Text uiName;

    // 辞書:characterDataを宣言
    private Dictionary<int, Dictionary<string, Image>> characterData;

    // 辞書:characterDataを初期化
    void Awake()
    {
        characterData = new Dictionary<int, Dictionary<string, Image>>
        {
            { 0, new Dictionary<string, Image> { { "幼馴染み", Image0 } } },
            { 1, new Dictionary<string, Image> { { "クラスメイト", Image1 } } },
            { 2, new Dictionary<string, Image> { { "親友", Image2 } } }
            // 3は名前も立ち絵もないので設定しなくて良い
        };
    }

    // キャラクターの名前と立ち絵を表示する
    void ShowCharacter(int characterNumber) // int型のcharacterNumberで辞書のTkeyを指定
    {
        // まず全部の立ち絵を非表示にする
        Image0.gameObject.SetActive(false);
        Image1.gameObject.SetActive(false);
        Image2.gameObject.SetActive(false);

        // 名前と画像の表示
        // CntainsKeyで辞書の中に該当するcharacterNumberがあるか確認
        if (characterData.ContainsKey(characterNumber))
        {
            foreach (var kvp in characterData[characterNumber])
            {
                string characterName = kvp.Key; // 辞書からキャラクターの名前(key:string)を取り出す
                Image characterImage = kvp.Value; // 辞書からキャラクターの立ち絵(value:Image)を取り出す

                uiName.text = characterName;
                uiName.gameObject.SetActive(true); // デフォルトが非表示なので表示する
                characterImage.gameObject.SetActive(true); // デフォルトが非表示なので表示する
                break; // 1人分だけ表示するので break
            }
        }
        else
        {
            // characterNumberが辞書にない場合(今回は3以降)
            uiName.text = ""; // 名前を空にする
        }
    }
}
ゆくすぃ

Dictionary<Tkey, Tvalue> の使い方を覚えれば、様々なデータセットの管理が楽になりそうですね!

まとめ

今回は、キャラクターの名前と立ち絵の管理をご紹介しましたが、他にも、キャラクターの質問に対応する選択肢の管理などにも利用できます。恋愛シミュレーションゲームやサウンドノベルゲームの制作時に大活躍しそうですね!

以上、最後まで読んでいただき有難うございました!

よかったらシェアしてね!
  • URLをコピーしました!
目次