
ごきげんよう、Budding Lab.編集部のゆくすぃです!
ここでは、Unityを使ったゲーム制作Tipsをお伝えしています!
会話システムを使った「サンプルゲーム:クラスメイト」のように「キャラクターの立ち絵(画像)とキャラクターの名前(テキスト)をセットにして扱いたい」という場合に「Dictionary<Tkey, Tvalue>クラス」を使うと、とても便利です!
そこで、今回は「Dictionary<Tkey, Tvalue>クラスでデータセットを管理する」を解説します!
Dictionary<Tkey, Tvalue>クラスとは
Dictionary<Tkey, Tvalue>クラスとは、System.Collections.Generic という名前空間に属している「データセットを扱うための仕組み」の一つです。
Dictionary<Tkey, Tvalue>クラス
一意のキー(Tkey)と、それに対応する値(Tvalue)を組み合わせて保持できる。
必要な時に、キー(Tkey)を使って値(Tvalue)を呼び出せる。
- キー(Tkey)は一意である必要がある(重複できない)。
- 値(Tvalue)は重複しても構わない。
※参考URL:Dictionary<Tkey, Tvalue>クラス(Learn Microsoft)



スクリプトの冒頭に「using System.Collections.Genetic」と記述することで使えるようになります。
Dictionary<Tkey, Tvalue>クラスを使う場面
「サンプルゲーム:クラスメイト」の会話システムでは、会話が発生すると「キャラクターの立ち絵 」と「キャラクターの名前」と「会話文」がセットで表示されます。


「キャラクターの名前」と「キャラクターの立ち絵」は常に同じペアを組むので、下記のように「キャラクター管理番号」を「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> の使い方を覚えれば、様々なデータセットの管理が楽になりそうですね!
まとめ
今回は、キャラクターの名前と立ち絵の管理をご紹介しましたが、他にも、キャラクターの質問に対応する選択肢の管理などにも利用できます。恋愛シミュレーションゲームやサウンドノベルゲームの制作時に大活躍しそうですね!
以上、最後まで読んでいただき有難うございました!