100日チャレンジ『100日で50弾!』第6回、ブランチショットです。
100日チャレンジ、まだ楽しんでやっていますが、いずれ常在戦場みたいな感じになりそうです。ぼくは結構頻繁に授業で数学通信(数学をテーマにした新聞みたいなもの)を配布します。面白いことを勉強したらそれも載せますが、そうでなくてもこれまでに書いたテーマは何百もあるから時期や授業の内容、生徒に合わせていくつか選んで一部直してレイアウトするだけで大丈夫。しかし若い頃は知識もあまりなく、どんなことをどう書けばよいかもピンときていなかったりして、相当苦労したこともあります。特に「書かなきゃ!」と思っているときは辛いです。それでもそういう経験はしておいてよかったです。何かものを書くのも自分の中でハードルが低くなったし(ブログも)、何より勉強になりました。100日チャレンジもそうなるといいと思います。
さて、今回は……クエリちゃんが弾を撃つと、少し経ってその弾が5つに分裂します。それぞれの弾はまたそれぞれが5個に分裂します。gifをどうぞ。
「再帰プログラム」というのを使います(BranchShot(3)を実行すると、その中で1発発射、そしてBranchShot(2)が5回呼ばれる。……引数が0になったら実行終了。……よく分からなければスルーして!)。ここでは1個の弾が5個に分かれるようにしており、それを2段階実行しています。3段階にするとか2段階目は3発に分かれるとか、その辺はどうにでも変えられます。
1個の弾は5個に分かれ、5個はそれぞれの方向に飛んで行きます。その方向もプログラマが決めなければなりません。最初の弾の移動の向きを表すベクトルvと垂直なベクトルuが1本手に入れば、uをvの周りに回しながら(5個に分けたければ72°ずつ回す)vに加えればOKです。垂直なベクトルを求めるコードは次。
//----------------
//ベクトルvと垂直な単位ベクトルを1本、求める
//
Vector3 getVerticalVec(Vector3 v) {
Vector3 w = v;
w.x += 1;
Vector3 u = Vector3.Project(w, v);
u = w - u;
return u.normalized;
}
//----------------
というわけで今回はここまで! まだ6つ目。がんばります。