

## 概要

Unity上で物体をスクリプトで動かそうとしたところ, オブジェクトのすり抜けが発生して困っている.

## 目標

+X方向に自動で動きつつ, 重力や障害物の影響を受けるような挙動のオブジェクトを作成したい.

## 現状

設置した障害物をすり抜けて逆側へ移動してしまう.

## 試したこと

  * 多くのサイトですり抜けを解決する手段として「衝突検知アルゴリズムの変更」が挙げられていたが, `Discrete`, `Continuous`, `Continuous Dynamic`, `Continuous Speculative`のいずれを利用しても問題は解消しなかった.
  * 移動速度を十分に下げれば問題は発生しなくなった. しかし, レースゲームを作成することを考えているため, ゲーム上の楽しさの観点から本問題が発生しない程度まで速度を落とすという解決策は認めがたい.

## 詳細

[![Unityの画面](https://i.stack.imgur.com/cxJJY.png)](https://i.stack.imgur.com/cxJJY.png)

オブジェクト`Car`のコンポーネント`Movement`のプログラム:

[code]

    using UnityEngine;
    
    [RequireComponent(typeof(Rigidbody))]
    public class Movement : MonoBehaviour
    {
        [SerializeField][Range(-20f,20f)] float speed = 10f;
        Rigidbody rigid;
        void Start(){
            rigid = GetComponent<Rigidbody>();
        }
        void FixedUpdate(){
            Vector3 velocity = new Vector3(speed, 0,0);
            rigid.MovePosition(rigid.position + velocity * Time.fixedDeltaTime);
        }
    }
    
[/code]


CC BY-SA 4.0
2022-05-29T07:29:17.743
89114
2022-05-29T21:48:20.280
52847
question
unity3d debugging game-development
UnityEngine.RigidBodyのすり抜けを防ぎたい


Rigidbody.MovePosition() は過去に調べてみたところ挙動がトリッキーなので私は実際には使ったことがありません。IsKinematic
の値により異なる動きをします。それは試してみたらよいのではないでしょうか。

また、高速移動する物体の当たり判定はそもそも物理エンジンに任せません。例えば、移動元から移動先座標に Ray を発射し、Ray
が衝突しなかったら移動する、途中で衝突したらその座標に移動する、というように作ります。

これは FPS の弾（クリックで攻撃）で使われています。Unity の公式サンプルの FPS でもこのような方法が使われています。世に出ている FPS
は大体このように作られているはずです。

ゲームでは「こういうものを作りたい」と思ってそのまま作ってはダメ、という事はよくあります。何もかも見えるものの形に Mesh Collider
をつけたら計算負荷が高くなりすぎる、とか、近接攻撃は武器に当たり判定をつけるのではなく攻撃範囲をコライダーや XXcast
で指定する、など例はたくさんあります。

こういうのを学ぶには、サンプルプロジェクトを DL してどういう仕組みで動いているのか調べるのが良いと思います。


CC BY-SA 4.0
2022-05-29T21:48:20.280
89125
2022-05-29T21:48:20.280
48297
89114
answer