質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

1347閲覧

[Unity]RigidBody.movePotisionで動くGameObjectに他のGameObjectをずれなく追従させたい

Poteto143

総合スコア32

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/11/10 11:52

前提・実現したいこと

以下の画像のような、ボールを跳ね返すゲームを制作しています。
プロジェクト
車とボールを跳ね返す台は別々のオブジェクトで、それぞれにRigidBodyを適用するために親子にしていません。
RigidBodyを台に適用しているのは、台がスクリプトによって上下に動き、その動きをボールの跳ね返しに影響させるためです。
また、台は車の移動を追従して動きます。

発生している問題

車が動くと台が少し遅れて追従されます。
このずれを改善したいです。

該当のソースコード

cs

1using UnityEngine; 2 3public class Mover : MonoBehaviour 4{ 5 private Rigidbody rb; 6 public float speed; 7 void Start() 8 { 9 rb = GetComponent<Rigidbody>(); 10 } 11 void FixedUpdate() 12 { 13 rb.MovePosition(transform.position + transform.forward * Input.GetAxis("move") * Time.fixedDeltaTime * speed); 14 } 15 16} 17

cs

1using UnityEngine; 2 3public class Stretcher : MonoBehaviour 4{ 5 public float start; 6 public float end; 7 public float upSpeed; 8 public float downSpeed; 9 public string key; 10 public float pos; 11 private Rigidbody rb; 12 private bool move; 13 void Start() 14 { 15 rb = GetComponent<Rigidbody>(); 16 pos = start; 17 } 18 void Update() 19 { 20 if (Input.GetKey(key)) 21 { 22 move = true; 23 } 24 else 25 { 26 move = false; 27 } 28 } 29 30 void FixedUpdate() 31 { 32 if (move) 33 { 34 pos += upSpeed * Time.fixedDeltaTime; 35 } 36 else 37 { 38 pos -= downSpeed * Time.fixedDeltaTime; 39 } 40 if(pos < start) 41 { 42 pos = start; 43 } 44 if (pos > end) 45 { 46 pos = end; 47 } 48 49 rb.MovePosition(car.transform.position + transform.up * pos); 50 } 51} 52

試したこと

「スクリプト実行順序」の設定を以下の画像のようにしましたが効果はありませんでした。
スクリプト実行順序

補足情報

Unityのバージョン: 2018.4.23f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

安直な考えですが、車のz座標を台に送ると良いのではないでしょうか?

void Update() { Vector3 v = car.transfrom.position; Vector3 myv = transfrom.position; myv.z = v.z; transfrom.position = myv; }

Update内でVector3型で車のtransfrom.positionと台(おそらくスクリプトをつけているオブジェクトだと認識)のtransfrom.positionを取得して、
台のtransfrom.positionのzに車のtransfrom.positionのzを代入して反映させています
これだとおそらくラグは無くなるはずですが・・・
質問の意図と違ったら申し訳ありませんが、一度試してみてください

投稿2020/11/10 12:16

CraftTable

総合スコア234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Poteto143

2020/11/10 12:30

回答ありがとうございます。 transform.positionを使えば確かにラグは無くなるのですが、そうすると台とボールが衝突した際の台の動きが物理演算に適用されないため、RigidBody.movePositionを使っています。
CraftTable

2020/11/10 13:21

質問をよく見ずに回答してしまい申し訳ありません でしたら、少しめんどくさくはなりますが空のGameObjectを作りそのオブジェクトの子に台を置くのはどうでしょう? その状態でGameObjectにtransform.positionで車に追従するスクリプトを設定し、 子の台でrigidbody.addforceを使い跳ね返すというのがいいかもしれません 一瞬だけAddForceで力を加えて、その後に加速度をrigidbody.velocity = new Vector3(0,0,0);で0にして、transform.positionで戻るというのをコールチンで行うといいかもです RigidBody.movePositionで跳ね返すことができていたのならAddForceを使う必要は無いかもしれませんが、試してみてください
CraftTable

2020/11/10 13:22

さっき似たような環境を憶測でつくりためしにAddForceで飛ばしてみましたが、しっかり力を加えた方向に跳ね返っていきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問