質問: unityでテトリスの3Dバージョンのようなゲームを作成しています。 ブロックを段階的に落とすにあたり、重力をゼロにし、rigidbody.movePositionで1マス分ずつ降下させ、真下にあるブロックと衝突した時点で降下を止めるスクリプトを書いたのですが、下に落ちきる前に他のブロックと隣り合うと側面が衝突判定を起こし、そこで降下が止まってしまいます。 とにかく側面が他のブロックと触れてもスルーし、下面が衝突した時にのみ降下を止めるようにしたいです。 そこで質問なのですが、衝突判定において判定する面を「ワールド座標でのy軸と直交する面が衝突した場合のみ〜」という風に指定することは可能でしょうか? あるいは、テトリス風の動きを再現するうえで、もっと単純な方法はありますか? 解答よろしくおねがいします。
回答: おそらく、このような離散的な動きのゲームで当たり判定を行うにあたっては、物理シミュレーションによる判定は不向きかと思います。仮に垂直方向だけがヒットするような動作を実現できても、例えばブロックを細い隙間を狙って落とす事を考えると、シミュレーション上の誤差のために本来当たるべきでない隙間の縁の上面と衝突したと判定される...などのケースが考えられます。また、水平方向の判定を完全になくしてしまうと、ブロックの間を落下中のブロックが水平方向に移動可能かどうかの判定を別途実装する必要があるのではないでしょうか。思うに、3Dであるとはいっても、当たり判定については古典的な2Dテトリスに倣って、フィールドを3次元の配列のような形で表現した方が面倒が少ないように思います。 あえて物理シミュレーションによる判定でいくとしたら、Rigidbodyは物理的相互作用はしないようにして、衝突イベントのみ検出してイベント応答メソッド中で本当に意図した衝突であるかを正確に判定する...とか、コライダーの形状を実際のブロックの3Dモデルよりも水平側面を少しだけブロック内側に引っ込めて意図しない衝突判定を回避する(この方法は案外うまく行くかもしれません)...などはどうでしょう。ただし、即興で思いついた方法なので、何か他に厄介な問題が出てくるかもしれません。