見出し画像

ゲームキャラクターの移動方向について

こんにちは!ねずみとりです。最近制作している生態系シミュレーションゲームの進捗報告を行います。

今回はキャラクターの移動方向についてプログラミングしました。私は大学院で神経細胞が少なく、構造が単純な生物の行動選択について研究しています。この分野はゲームAIに応用できると私は考えています。


構造が単純な生物における移動方向の選択

生物は障害物、食物、敵などを見つけたときに移動方向の切り替えを行います。感覚神経細胞と呼ばれる、匂いや物理的刺激、視覚情報などを受け取るセンサのような器官により周囲の情報を察知します。感覚神経に入ってきた様々な情報が介在神経細胞と呼ばれる細胞により統合され制御されます。そして統合された情報が運動神経細胞に伝えられることで運動が行われます。


ゲームキャラクターにおける移動方向の選択

私が制作しているゲームのキャラクターにおける刺激情報は、周囲の環境や隣のキャラクターの情報です。マナ(小さい生物が食べる栄養)、汚染(生物が排出した汚れ)、隣のキャラクターの種類などが該当します。これらの情報を統合して移動方向の決定に使用します。

これまでは、各情報に重み付けをし、それらを合計して最も値が高い方向に移動する方法を使用していました。たとえば、餌を感知する重みが大きい場合は、餌の方向に移動します。

しかしこの方法では重みが小さい情報の意味が無くなります。改善後は下のC#コードに示すような方法を使っています。まずどの感覚器からの情報を重視して移動方向を決定するのかを決めます。決めた比に従ってルーレットを行い、当たった移動方法を使用します。このようにすることで重みが小さい情報もたまには採用することができます。

int randomWalkRate = 4;
int manaWalkRate = 3;
int pollutionWalkRate = 1;
int fellowWalkRate = 1;
int otherWalkRate = 1;

int[] rouletteRates = new int[] { randomWalkRate, manaWalkRate, pollutionWalkRate, fellowWalkRate , otherWalkRate };

int sumRoulette = 0;
int selectWalk = 0;

int random1 = random.Next(0, 10);
for (int i = 0; i < rouletteRates.Length; i++)
{
	sumRoulette += rouletteRates[i];
	if (random1 < sumRoulette)
	{
		selectWalk = i;
		break;
	}
}



いいなと思ったら応援しよう!