事前に配布してあってもノーヒントだと無理ゲーだと思ったので、アルゴリズムのメモ。
■移動アルゴリズム
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;