動く床を作ったけど上に載ったボールが微動だにしない。
そもそも物理演算周りもよくわかってないので色々試して解決したので覚書きします。
ググっても情報ないのは調べ方が悪いのか、需要がないのか、当たり前の話だからなのか。
Rigidbody同士の摩擦
準備
- デフォルトのシーンにCube2つを追加する
- Cube2つにRigidbodyと摩擦の強い反射特性を追加する
- 土台のほうのCubeにスクリプトを追加して動かす
ポジションを移動させる場合
1 2 3 |
void Update(){ this.transform.position+=Vector3.right; } |
力を加える場合
1 2 3 4 |
void Start () { Rigidbody rigid=this.GetComponent<Rigidbody>(); rigid.AddForce(new Vector3(1000,0,0)); } |
この結果について
Rigidbodyとしての動きでないと摩擦が働かない。
そのため動く床なんかをPlaneで作っても乗った物体がボトボト落ちてしまう。ドラゴンズレアみたいだ、慣性どこいった。
PlaneにRigidbodyをつけようにもKinematicである必要があるので物理演算はされないので詰んだかと思ったら普通に解決できました。
動く床の解決法
準備
PlaneにRigidbodyを追加してIsKinematicをオンにする。
CubeのスクリプトをPlaneに付け替える。
結果1
1 2 3 4 5 6 7 |
private Rigidbody rigidbody; void Start () { rigidbody = this.GetComponent<Rigidbody>(); } void Update(){ rigidbody.MovePosition(this.transform.position + transform.right * Time.deltaTime); } |
床の移動に対して摩擦が働いた!
transform.position でなくて Rididbody.MovePosition を使えばよかったのか。
rigidbodyのpositionを直接変えてもいけるかなと思ったけどそれはダメだった。
1 |
rigidbody.position+=Vector3.right*0.1f; |
でも摩擦が 1 なのになんでずれるだけなんだ。
結果2
1 2 3 4 5 6 7 |
private Rigidbody rigidbody; void Start () { rigidbody = this.GetComponent<Rigidbody>(); } void FixedUpdate(){ rigidbody.MovePosition(this.transform.position + transform.right * Time.deltaTime); } |
そういえばRigidbodyの操作はFixedUpdateでする必要があった。
これで円満解決!
最初の画像のやつも Rigidbody.MoveRotation を使って解決しました。
すみません
聞きたいことがあるのですが
回転する床に球を落としたサンプルを探していた所このサイトに
たどり着きました。
ぶしつけではありますがサンプルを教えていただけたりはしないでしょうか?
当時のプロジェクトが見つからないので新規に試してみましたが、その内容であれば簡単に作れると思います。
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));
}
}
/* スクリプト ここまで */
返信遅れてすみません。
サンプルありがとうございました。
自分が思い描いてたとおりの動作でした。
ばんびーのかいっ!