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

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

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

925閲覧

UnityのRigidbodyで停止できない。

lastlast

総合スコア67

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2022/06/10 14:02

編集2022/06/10 14:34

前提

Unity3Dで

  • wキーで加速
  • sキーで減速

させるスクリプトを作りました。
rb.velocity.magnitude;をCinemachine Dolly Cartのspeedに代入して実装しています。
back方向(後ろ)に加速せず、flont方向(前)に加速してしまうのです。

実現したいこと

sキーを押して減速、その後停止するようにしたい。

発生している問題・エラーメッセージ

sキーを押すと、減速はするのですが、
1

0.5

0.2

0

0.2

というように、再び数(速度)が上がっていってしまいます。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour 6{ 7 void FixedUpdate() 8 { 9 Rigidbody rb = this.GetComponent<Rigidbody>(); // rigidbody 10 Vector3 force = new Vector3(0.0f, 0.0f, 0.0f); 11 if (Input.GetKey(KeyCode.W)) 12 force.z += 1; 13 if (Input.GetKey(KeyCode.S)) 14 force.z -= 1; 15 rb.AddForce(force, ForceMode.Force); // 力をon! 16 } 17}

試したこと

googleで検索をしたりしてみたのですが、該当する内容が見つからず、わかりません。

補足情報(FW/ツールのバージョンなど)

Unityの最新版(2021.3.4f)を使用しています。

質問に不備があれば、コメント欄からお知らせください。できるだけ早く訂正させていただきます。
ご回答、よろしくお願いいたします。

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

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

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

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

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

bboydaisuke

2022/06/10 14:22

> 再び数が上がっていってしまいます。 「数」って何の数ですか? s を押した時にやっている処理は、ワールド座標系の back の方向に力を加え続けているので、押し続けていたら止まらずに back 方向に加速しますよ。
lastlast

2022/06/10 14:33

あ、失礼しました。 「数」とは速度です。 rb.velocity.magnitude;をCinemachine Dolly Cartのspeedに代入して実装しています。 そのback方向に加速せず、flont方向(前)に加速してしまうのです。 質問を訂正させていただきます。
bboydaisuke

2022/06/11 14:14 編集

> そのback方向に加速せず、flont方向(前)に加速してしまうのです。 「何が」そのback方向に加速せず、front方向(前)に加速してしまう、のですか? このスクリプトをアタッチした Rigidbody ですか?新たに質問に登場した Cinemachine Dolly Cart ですか? 後者だったら当然だと思います。
lastlast

2022/06/10 22:06

playerというモデルにchinemachine dolly cartとこちらの提示したスクリプトを両方アタッチしてあります。
bboydaisuke

2022/06/11 04:14

それで何をしようとしているのか本当にわからないのですが、何をしようとしているのですか? その実現しようとしていることに対してとっているアプローチが間違ってると思いますが、質問内容がアプローチに対して起きた質問になっている、いわゆるXY問題になっているように見えます。
guest

回答1

0

ベストアンサー

rb.velocity.magnitudeをカートのm_Speedに代入しているとのことですが、rb.velocity.magnitudeは速度の大きさであって常に0以上の値になるでしょうから、rbに逆方向の力を加え続けて運動の向きがバック側に振れてもm_Speedはプラスの値になり、カートが前進してしまう...ということはありそうに思います。

もっとRigidbodyCinemachineDollyCartの連携の仕方を工夫してやる必要がありそうですね。ですが、bboydaisukeさんからも何をしようとしているのかわからないとのご指摘がありましたが、私としてもどういう理由からRigidbodyCinemachineDollyCartを複合させるという手をとろうとなさっているのか、ご質問文からはいまいち読み取れませんでした。

もしトラックの途中に障害物があって、それに当たるとリアリティのある吹っ飛び方で脱線させたいといった事情があれば、もしかするとRigidbodyが必要になってくるのかもしれません。ですが単純にトラック上で加速・減速するだけならばCinemachineDollyCart単独でもいいんじゃないでしょうかね?

たとえば別途下記のようなスクリプトを用意して...

C#

1using Cinemachine; 2using UnityEngine; 3 4public static class CinemachineDollyCartExtensions 5{ 6 public static void AddForce( 7 this CinemachineDollyCart dollyCart, 8 float forceAlongTrack, 9 ForceMode forceMode = ForceMode.Force, 10 float mass = 1.0f, 11 bool allowNegativeSpeed = true) 12 { 13 var deltaSpeed = forceAlongTrack; 14 15 // forceModeに応じて速度変化量を調整し... 16 if (forceMode is ForceMode.Force or ForceMode.Acceleration) 17 { 18 deltaSpeed *= Time.deltaTime; 19 } 20 if (forceMode is ForceMode.Force or ForceMode.Impulse) 21 { 22 deltaSpeed /= mass; 23 } 24 25 // 新しい速度を求め... 26 var speed = dollyCart.m_Speed + deltaSpeed; 27 28 // 負の速度を許さないなら(つまりバックを禁止するなら) 29 // 0未満を0とし... 30 if (!allowNegativeSpeed) 31 { 32 speed = Mathf.Max(speed, 0.0f); 33 } 34 35 // 新しい速度をdollyCartにセットする 36 dollyCart.m_Speed = speed; 37 } 38}

Playerは下記のようにしたところ...

C#

1using Cinemachine; 2using UnityEngine; 3 4[RequireComponent(typeof(Rigidbody))] 5public class Player : MonoBehaviour 6{ 7 [SerializeField] private CinemachineDollyCart dollyCart; 8 9 private float force; 10 private new Rigidbody rigidbody; 11 12 private void Awake() 13 { 14 // インスペクター上でdollyCartをセットしなかった場合、 15 // 親子階層の中からCinemachineDollyCartを探すことにしました 16 if (this.dollyCart == null) 17 { 18 this.dollyCart = this.GetComponentInParent<CinemachineDollyCart>(); 19 if (this.dollyCart == null) 20 { 21 this.dollyCart = this.GetComponentInChildren<CinemachineDollyCart>(); 22 if (this.dollyCart == null) 23 { 24 Debug.LogError($"{nameof(CinemachineDollyCart)} not found."); 25 this.enabled = false; 26 return; 27 } 28 } 29 } 30 31 this.rigidbody = this.GetComponent<Rigidbody>(); 32 this.rigidbody.isKinematic = true; 33 } 34 35 private void FixedUpdate() 36 { 37 this.force = 0.0f; 38 if (Input.GetKey(KeyCode.W)) 39 { 40 this.force += 1; 41 } 42 43 if (Input.GetKey(KeyCode.S)) 44 { 45 this.force -= 1; 46 } 47 48 // オブジェクトの質量を得るためにrigidbodyを使用していますが、 49 // 動きはdollyCartによってコントロールされており、rigidbodyは関与していません 50 // もし質量が決め打ちでかまわなければ、あるいはForceModeが質量の影響を 51 // 受けないタイプでもかまわなければ、この質量の取得すら省くことができますので 52 // 完全にdollyCartだけで動かすことができるでしょう 53 this.dollyCart.AddForce(this.force, ForceMode.Force, this.rigidbody.mass); // 力をon! 54 55 // ちなみに「sキーを押して減速、その後停止するようにしたい。」と 56 // おっしゃっているということは、sキーでだんだん減速していった後 57 // さらにsキーを押し続けてバックし始めてしまうとまずいということでしょうか? 58 // その場合は、下記のように第4引数をfalseにするとバックしなくなるはずです 59 // this.dollyCart.AddForce(this.force, ForceMode.Force, this.rigidbody.mass, false); 60 } 61 62 private void OnGUI() 63 { 64 // 確認のため、現在カートにトラックに沿って加えられている力と 65 // カートのトラックに沿った速度を表示させてみました 66 GUI.color = Color.black; 67 GUILayout.Label($"Force: {this.force}"); 68 GUILayout.Label($"Speed: {this.dollyCart.m_Speed}"); 69 } 70}

下図のようにレール上を加速・減速しました。

図

これだと意図と違うといった点がありましたらコメントください。私の分かる範囲でしたらなるべく案を考えてみようと思います。

投稿2022/06/13 12:15

編集2022/06/13 12:27
Bongo

総合スコア10816

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

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

lastlast

2022/06/13 14:02

この説明で、「そういうことなのか!」と雲が開けたように理解が進みました。 心より感謝申し上げます。 あくまでも```Rigidbody```は質量を再現するもので、```CinemachineDollyCart```で動かすことができるのですか。 自分は```CinemachineDollyCart```は単なるガイドレールみたいなものだと思っていたのですが、どうやらそうではなかったようです。 今後もゲーム制作を頑張ろうと思います。 また質問をさせていただく機会があると思うのですが、その時はどうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問