テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

ゲーム大会/アルゴリズムめも

事前に配布してあってもノーヒントだと無理ゲーだと思ったので、アルゴリズムのメモ。



■移動アルゴリズム

C:島突撃タイプ

島突撃タイプは、とりあえず島にいけばいいのでルートは非常にシンプル。島はxz(0,0)固定なので、とりあえずxz(0,0)に行けば良い。
基本的に相手より早く到着することが必須なので、スピーとアップを使う事になると思う。

go_x = 0;
go_z = 0;



D:周回軌道タイプ

SampleBから引っこ抜いた。
中央島の周りを45の距離を維持しつつ回る。
中央島の座標がxz(0,0)なので、θ(角度)はxとzのアークタンジェントで求められる。
んで、θに0.5を足してやれば、うまい感じに周囲を回る座標を得る事が出来る・・・という原理らしい。
あんまり固定値で回ってるとステージに喰われるので注意。

float thete = Mathf.Atan2(now_z,now_x);
float distance = 45;
thete = thete + 0.5f;
go_x = distance * Mathf.Cos(thete);
go_z = distance * Mathf.Sin(thete);



E:敵突撃タイプ

敵に突撃するタイプ。とにかく近づいて火力の高いショート砲撃をかます。
ただ、とりあえず凸ると障害物や島にあたって進めなくなるので、それを回避するようなアルゴリズムが必要になるかもしれない。
基本コードはCに負けず劣らずの単純仕様。
とは言え、直線に進むと良い的なので、上手く照準を外してやる必要がありそう。

go_x = enemy_x;
go_z = enemy_z;



■照準

遠距離砲台

シンプルに対象の現在地点を狙って撃つ。
移動している相手には概ね当たらないので注意。

arrow_x = enemy_x;
arrow_z = enemy_z;



近距離砲台

SampleBから引っこ抜いた。

Vector3 v_f = (new Vector3(now_dir_x,0,now_dir_z)).normalized;
Vector3 v_e = (new Vector3(enemy_x-now_x,0,enemy_z-now_z)).normalized;
Vector3 v_n = (new Vector3(0,1,0));

shot_F_angle = Mathf.Atan2(Vector3.Dot(v_n,Vector3.Cross(v_f,v_e)),Vector3.Dot(v_f,v_e))*Mathf.Rad2Deg;
shot_M_angle = Mathf.Atan2(Vector3.Dot(v_n,Vector3.Cross(v_f,v_e)),Vector3.Dot(v_f,v_e))*Mathf.Rad2Deg;
shot_B_angle = Mathf.Atan2(Vector3.Dot(v_n,Vector3.Cross(v_f,v_e)),Vector3.Dot(v_f,v_e))*Mathf.Rad2Deg;