6VR剣戟ゲーのための自作当たり判定処理C#UnityVRはじめにSEKIROみたいな剣の斬り合いがVRでやりたい!!!!こんにちは、ZeniZeniです。VRなど、面白い良VR剣戟ゲームが増えてきました。それらをプレイしてると、自分の理想の剣戟ゲームというのを作りたい欲がふつふつと湧き上がってきます。いうわけで絶賛開発中です。今回は、VRで剣戟ゲームを作るための第一歩として、剣を高速で振っても、剣の当たり判定と剣同士が交差した座標を取得できる機能を実装しようと思います。下の動画のようなことができるようになります。コリダーは使わずにやっています。いうと、高速な物体同士の当たり判定は、コリダーだと簡単にすり抜けてしまうからです。下の動画くらいの速度が限界でした。2019プラス、座標を取得するために小さいコリダーを大量に配置していたので、剣を変えるときは設定がめんどくさいですし、パフォーマンスもよろしくなさそうです。それではコリダーを使わない当たり判定の実装方法を考えていきましょう。剣と剣がぶつかった判定をどうとるかを考えてみます。これは三次元空間において、ある線分と線分の距離が一定値以下になったときを考えればよさそうです。p_{22})$からなる線分$L_2$の距離$d$を導出していきます。こちらのサイトを参考にしてみます。線分$L_1$の方向ベクトルを$V_1$、線分$L_2$の方向ベクトルを$V_2$として、$V_1$と$V_2$の外積、すなわち線分$L_1$から線分$L_2$に垂直なベクトル$n$を求めます。$L_1$上の任意の点$P_1$から$L_2$上の任意の点$P_2$へのベクトルを$V_{12}$とすれば、ベクトル$n$とベクトル$V_{12}$の内積が、そのまま距離$d$となります。計算がうまくできないとき上記の導出では、線分同士が同一平面上にあるときには距離$d$は必ず0になり、正確な値が出ません。(垂直なベクトルの内積は0)実際の所、剣同士をぶんぶん振り回している中で、剣同士が同一平面上になるときなど滅多にないのですが、一応考慮しておきます。剣同士がぶつかった瞬間にぶつかった場所から発生させたいので、剣同士が交差した座標を導出していきます。これがちょっとめんどくさいです。考え方としては、まず線分$L_2$上の点で、線分$L_1$に最も近い点を$P_{min}$とします。その点$P_{min}$上から線分$L_1$への垂線の方向ベクトルの単位ベクトルを$\hat{n}$とします。剣同士の交点ですが、例えば剣同士が10cmより小さくなったときを剣同士が接触したと考えれば、剣同士の交点は剣同士の互いに最も近い点二つの中点とするのがよさそうです。それでは次に、$P_{min}$を導出していきます。\\\end{align}と表せます。\\\end{align}と表せます。(p_{11z}-p_{21z})^2\end{align}というようにあらわせます。うへぇ...って思いますよね、僕は思いました。これを次数に注目して、係数は適当な文字に置き換えて、平方完成してみます。C^2}\end{align}のときです。C^2}$を代入したものとなります。絶対に交差しないとき剣が絶対に交差しない状況のときは上のような計算をするのは無駄なので、そのような状況は早い段階ではじきましょう。剣が絶対に交差しない状況は、下図のようなときです。これにz座標の判定も加わります。実際のコードそれでは実際に書いた線分同士の距離と交点を導出するコードがこちらです。線分同士の距離とその交点を同時に取得したかったので、IntersectionInfoという構造体を作っています。線分はLineという構造体を作成していて、剣の刃の部分の根本と剣先の2点を設定してください。}}}という感じになります。交差しない場合やいくつかの例外時には、IntersectionInfoのDistanceは-1となります。下図のような感じで設定してください。後は、GetIntersectionInfo関数を呼んで得られたIntersectionInfoのMidPointで火花等のエフェクトを発生させればよいのです。剣を速く振ったときだけ呼びたい場合、まず剣の振る速度を求める方法を考えると思います。SDKアセットに入っている、VelocityEstimatorというコンポーネントを使うことをお勧めします。開発、執筆にあたり、下記のサイト様を参考、引用させていただきました。upLoginユーザーは見つかりませんでした。