Unity

【C#Unity備忘録】ゲーム開発で使えるDictionary関連コードまとめ【要素,Key,Valueの取得や並べ替え】

本記事内には、アフィリエイトリンクを含む場合があります

Dictionaryとは、連想配列。

基本的なことは他サイトで解説されているので、そちらもご参照ください(いきなり他力)
参考:Samurai Engineer

ここでは無駄な説明を省き、
ゲーム開発で確認したり、即使いやすいようにコードをまとめました。

もちろん、初心者の方もわかりやすく目指しました。

なので、まずは簡単な解説から・・・
基本として、Dictionaryでは、要素、Key、Valueという情報を扱います。

Dictionaryという配列に、要素(情報)を格納していきます。
(必要なときに要素を取り出して使ったりします)
また、要素は、KeyとValueがセットで構成されます。

とりあえず、この概念さえ抑えておけばOK!

 

実際のゲームでの使い道としては・・・
複数プレイヤーで競うゲームにおいて、
1プレイヤーにつき、1つの要素。
そのプレイヤー名をKey、そのプレイヤーの得点をValueにします。
それら情報を持つ要素を、Dictionaryに格納します。

Dictionaryに格納することによって、
Valueの高い順に要素の順を並べ替えたり、検索をかけることができます。
例えば、
最もValue(得点)の大きい要素を検索
→そのKey(プレイヤー名)
というように取得して、ゲームの勝者を決めることができます。

私のリリースしているゲームもそれを駆使して、勝者を決めてます^^

 

なので、Dictionaryを使いこなすことは、
ゲームを成立させるのにとても重要です!

連想配列には、ListとDictionaryがあります。
Listは要素を格納した順の番号に、値(Value)を格納するので、番号に対応するValueを扱うこととなります。
一方、Dictionaryは、要素にKeyと、Valueの2つの情報をもって格納できます。

 

Dictionaryを扱うためのコードは覚えきれないので、
本記事は、ゲーム開発の備忘録として、重宝していただければ幸いです!

1. Dictionaryを扱う宣言

Dictionaryの連想配列を使う場合、宣言をする必要があります。
実際の例文↓

<宣言する構文>
Dictionary<Key型名, Value型名> Dictionary名
= new Dictionary<Key型名, Value型名>() 

例文では、Key型名をstring(文字列)、Value型名をint(整数)のDictionaryを宣言しています。

そして、
Dictionaryを扱うのに、
using System.Collections.Generic;

Dictinaryの要素を並べ変えたりするのに、
using System.Linq;
を記述する必要があるので忘れないように。

 

2.要素に対する処理

要素の追加

dictionary.Add("Key型名", "Value型名");

 

要素の削除

・特定の要素の削除

Dictionaryでは、要素は必ずKeyをもつので、Keyを指定した上で削除します。
Keyによる扱いにて、特定の要素の削除は記載します。

ちなみにListの場合は、□番目の要素として削除します。
宣言
List<string> list = new List<string>( a, b, c);
削除処理
list.RemoveAt(2); ←bの要素が削除される
参考:samurai engineer

 

・全ての要素を削除

dictionary.Clear();

 

要素数の取得

Dictionaryに格納している要素数を取得する場合

int itemNum = dictionary.Count;

整数なので、intの変数に代入します。

 

各要素に処理を行う(foreach)

 

・Dictionaryがもつ全要素のKeyとValueを出力させる場合
参考:コガネブログ

foreach(var item in dictionary)
{
Debug.Log(item.Key);
Debug.Log(item.Value);
}

 

2.キーKeyに対する処理

Key指定の要素の取得

aというKeyの要素を取得する場合

var item = dictionary.FirstOrDefault( c => c.Key == "a" );

 

Key指定の要素削除

aというKeyの要素を削除する場合

dictionary.Remove("a");

 

Key指定のValue取得

aというKeyのValueを取得し、aValueに代入する場合

var aValue = dictionary["a"];

 

Keyの順に要素を並び替え

前述の通り、Dictionaryの連想配列でソート(並び替え)機能を使う場合、
using system.Linqを使う必要があります。
参考:C#の連想配列(個人Blog)

・昇順(1,2.. または a,b..)

var sorted = dictionary.OrderBy((x) => x.Key);

 

・降順(3,2.. または c,b..)

var sorted = dictionary.OrderByDescending((x) => x.Key);

この処理の結果、Dictionaryの並べ替えを行なった情報は、
sortedというDictironaryとして生成することになります。

この機能は、ゲームにおいて、プレイヤーの順位を示す際に利用できます。
もし1位だけを取得し、示したいなら、
Valueの最も大きい要素(のKey)を取得する処理で済みます^^
それはValueの項で説明します。

 

最も大きいKeyのValueを取得

・Keyの降順に並び替えたDictionaryの最初の要素のValueを取得する方法
上記のように、Keyの降順に並べ替えを行なったなら、
その新たなDictinaryのsortedに対して、最初の要素およびValueを取得します。
参考:コガネブログ

var item = sorted.FirstOrDefault();
Debug.Log(item.Value);

 

・Dictionaryの最も大きいKeyを取得し、そのValueを取得する方法
シンプルなこちらの方法もご検討あれ。

var maxKey = dictionary.Keys.Max();
var maxKeyValue = dictionary[maxKey] Debug.Log(maxKeyValue);

 

指定したKeyのValue変更

aというKeyのValue(int型)を100に変更する場合

dictionary["a"] = 100;

 

指定したKeyの有無の確認

aというKeyの有無を確認する場合
*ConstrainKey()は、有る場合、trueを返します。

if ( dictionary.ContainsKey( "a" ) )
{
Debug.Log( "aあり" );
}

 

3.値Valueに対する処理

処理によっては、KeyのときのようにValueに対してアクセスできないものも中にはあります。
しかし、ステップを踏めば、ValueからKeyにアクセスできます。

つまり、ステップを踏めば、KeyとValue、双方向のアクセスが可能ということです。
(これがDictionaryの良さだと個人的に思ってます^^)

Value指定の要素の取得

10というint型Valueの要素をitemとして取得する場合
参考:コガネブログ

var item = dictionary.FirstOrDefault( c => c.Value == 10 );

Keyの場合と同じですね(c.Keyがc.Valueになっただけ)。

 

Value指定の要素削除

Dictionaryは特定の要素を指定して、削除することはできませんでしたね。
その場合は、Keyを指定する必要があります。

なので、いったん上記のようにValueから要素を取得したら、
そのKeyを指定して削除します。

dictionary.Remove(item.Key);

 

Value指定のKey取得

上記でValueから要素を取得したら、そのKeyは取得したも同然です。

var 10Key = item.Key;

まとめて、このように記述もできます。

var 10Key = dictionary.FirstOrDefault( c => c.Value == 10 ).Key;

 

Valueの順に要素を並び替え

並び変えは、Keyの時と同様です。

・昇順(1,2.. または a,b..)

var sorted = dictinary.OrderBy((x) => x.Value);

 

・降順(3,2.. または c,b..)

var sorted = dictinary.OrderByDescending((x) => x.Value);

 

指定したValueのKey変更

DictionaryのKeyは変更できません。

そのKeyの要素を削除し、新しく追加するしかなさそうです。。。

指定したValueの有無の確認

10というValueの有無を確認する場合
*ConstrainValue()は、有る場合、trueを返します。

if ( dictionary.ContainsValue( 10 ) )
{
Debug.Log( "10あり" );
}

その他エラーを回避するための条件分岐

Keyが重複しないようにする方法

後日追記予定・・・

 

独学でプログラミングに挑戦するなら・・・
Udemyで学ぶのがおすすめ

ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA