Unityで地面を動かしたときの挙動


動く床を作ったけど上に載ったボールが微動だにしない。

roll

そもそも物理演算周りもよくわかってないので色々試して解決したので覚書きします。

ググっても情報ないのは調べ方が悪いのか、需要がないのか、当たり前の話だからなのか。

Rigidbody同士の摩擦

準備

  • デフォルトのシーンにCube2つを追加する
  • Cube2つにRigidbodyと摩擦の強い反射特性を追加する
  • 土台のほうのCubeにスクリプトを追加して動かす

quake3

quake4

ポジションを移動させる場合

quake1

力を加える場合

quake2

この結果について

Rigidbodyとしての動きでないと摩擦が働かない。

そのため動く床なんかをPlaneで作っても乗った物体がボトボト落ちてしまう。ドラゴンズレアみたいだ、慣性どこいった。

PlaneにRigidbodyをつけようにもKinematicである必要があるので物理演算はされないので詰んだかと思ったら普通に解決できました。

動く床の解決法

準備

PlaneにRigidbodyを追加してIsKinematicをオンにする。

CubeのスクリプトをPlaneに付け替える。

結果1

quake5

床の移動に対して摩擦が働いた!

transform.position でなくて Rididbody.MovePosition を使えばよかったのか。

rigidbodyのpositionを直接変えてもいけるかなと思ったけどそれはダメだった。

でも摩擦が 1 なのになんでずれるだけなんだ。

結果2

quake6

そういえばRigidbodyの操作はFixedUpdateでする必要があった。

これで円満解決!

 

最初の画像のやつも Rigidbody.MoveRotation を使って解決しました。

roll2

 


4 thoughts on “Unityで地面を動かしたときの挙動”

  1. すみません
    聞きたいことがあるのですが
    回転する床に球を落としたサンプルを探していた所このサイトに
    たどり着きました。
    ぶしつけではありますがサンプルを教えていただけたりはしないでしょうか?

  2. 当時のプロジェクトが見つからないので新規に試してみましたが、その内容であれば簡単に作れると思います。

    1.新規3Dプロジェクトの作成
    2.Plane, Sphereをシーンに追加してそれぞれに Rigidbody を追加する
    3.Plane の Rigidbody の IsKinematic をオンにする
    4.Plane にスクリプトを追加
    5.Sphere の位置を好きな場所(Planeの中心以外)に調整

    /* スクリプト ここから */
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    public class Plane : MonoBehaviour {
    Rigidbody rb;
    void Start() {
    rb = this.GetComponent();
    }
    void FixedUpdate() {
    rb.MoveRotation(rb.rotation * Quaternion.Euler(Vector3.up * 200 * Time.deltaTime));
    }
    }
    /* スクリプト ここまで */

  3. 返信遅れてすみません。
    サンプルありがとうございました。
    自分が思い描いてたとおりの動作でした。

コメントを残す

メールアドレスが公開されることはありません。