AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

ゼビウスもどき開発(6)

進捗

  • ドモグラムがパスに沿って移動する
  • イントロ曲とBGM曲を再生

経路移動

 パスに沿って移動は、前にタワーディフェンスを作った時と同じように予め移動経路のパスを示すGameObjectを画面に配置しておいて、次々にそれを経由するようにしこんでいる。
f:id:yasu9780:20160129100950p:plain
 現時点でパスは最大3つまでで、存在する場合のみ移動するようになっている。要はカメラにいる間だけ動けばいいので(ゝω・)
 単純に現在位置とパスの距離を比較して、遠い場合は近づくだけ(^o^)
 角度は要らないので、ATAN使うことなく、単に基本ベクトルを求めて足している。徐々に移動を使うと、パスの終端で減速するので、速度一定で移動しています。実行時は旗アイコンは非表示にします。これはSPAWNでも同様に実行時はenableをfalseにして非表示にしています。
 パス経路はiTweenを使うとパスとパスの移動にベジェ曲線が使えるようになります。

コルーチン

 コルーチンというのは、yield return nullがあるので、1フレーム毎にwhileループが回るようになっている。
 もし、yield return nullが無いと、1フレーム内で、whileループが全部回ってしまうので、徐々に移動する処理では無くなってしまいます。
 これが遅延実行といわれる所以です。
 例えば、ECサイトで、商品をマトリックスに配置している時(例えばAmazonとか)に、全部をCGIで表示させると全てのアイテムを表示してから表示が始まりますが、それぞれのアイテムをJavaScriptで呼び出して表示すれば、全体の枠はすぐ終わりますが、アイテムの表示はそれぞれ並列処理として遅延実行されます。これと概念は同じですね。

if( path ) StartCoroutine ("MoveTo");

	IEnumerator MoveTo ()
	{
		while(Vector3.Distance(path.position,transform.position)>0.1f)
		{
			float dx= path.position.x-transform.position.x;
			float dy= path.position.y-transform.position.y;
			Vector3 v = new Vector3(dx,dy,0f).normalized;
			transform.position += v * Time.deltaTime;
			yield return null;
		}
		while(path2 && Vector3.Distance(path2.position,transform.position)>0.1f)
		{
			float dx= path2.position.x-transform.position.x;
			float dy= path2.position.y-transform.position.y;
			Vector3 v = new Vector3(dx,dy,0f).normalized;
			transform.position += v * Time.deltaTime;
			yield return null;
		}
		while(path3 && Vector3.Distance(path3.position,transform.position)>0.1f)
		{
			float dx= path3.position.x-transform.position.x;
			float dy= path3.position.y-transform.position.y;
			Vector3 v = new Vector3(dx,dy,0f).normalized;
			transform.position += v * Time.deltaTime;
			yield return null;
		}
	}

音楽

MML で ゼビウス - Good morning.
こちらがMMLでのゼビウスのイントロとBGMを公開されていたので使わせて頂きました。
MMLを再生してWAVE保存できるソフトを利用してWAVEを作り、それをMP3に変換して、追加しました。
シングルトンのGMに、AudioSourceを追加して、BGMはLOOPにチェック。
AudioSourceを複数Componet追加した場合は、配列として読み込める。

AudioSource[] audioSources;
audioSources = GetComponents<AudioSource>();

audioSources[1].Play(); // LOOP設定してある

 ゼビウスBGMは検索しても、なかなかすぐ使えるものが見つからず、YouTubeゼビウス動画からBGMだけをMAGIX Music Maker Silver(結月ゆかりについてくるドイツ製の音楽編集ソフト)で抜き出さないといけないかと思ってたので、助かりました。