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

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

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

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

受付中

UnityのRigidbodyで停止できない。

lastlast
lastlast

総合スコア1

C#

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0評価

0クリップ

93閲覧

投稿2022/06/10 14:02

編集2022/06/13 21:27

前提

Unity3Dで

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

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

実現したいこと

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

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

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

0.5

0.2

0

0.2

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

該当のソースコード

C#

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { void FixedUpdate() { Rigidbody rb = this.GetComponent<Rigidbody>(); // rigidbody Vector3 force = new Vector3(0.0f, 0.0f, 0.0f); if (Input.GetKey(KeyCode.W)) force.z += 1; if (Input.GetKey(KeyCode.S)) force.z -= 1; rb.AddForce(force, ForceMode.Force); // 力をon! } }

試したこと

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

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

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

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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問題になっているように見えます。

回答1件

0

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

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

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

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

C#

using Cinemachine; using UnityEngine; public static class CinemachineDollyCartExtensions { public static void AddForce( this CinemachineDollyCart dollyCart, float forceAlongTrack, ForceMode forceMode = ForceMode.Force, float mass = 1.0f, bool allowNegativeSpeed = true) { var deltaSpeed = forceAlongTrack; // forceModeに応じて速度変化量を調整し... if (forceMode is ForceMode.Force or ForceMode.Acceleration) { deltaSpeed *= Time.deltaTime; } if (forceMode is ForceMode.Force or ForceMode.Impulse) { deltaSpeed /= mass; } // 新しい速度を求め... var speed = dollyCart.m_Speed + deltaSpeed; // 負の速度を許さないなら(つまりバックを禁止するなら) // 0未満を0とし... if (!allowNegativeSpeed) { speed = Mathf.Max(speed, 0.0f); } // 新しい速度をdollyCartにセットする dollyCart.m_Speed = speed; } }

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

C#

using Cinemachine; using UnityEngine; [RequireComponent(typeof(Rigidbody))] public class Player : MonoBehaviour { [SerializeField] private CinemachineDollyCart dollyCart; private float force; private new Rigidbody rigidbody; private void Awake() { // インスペクター上でdollyCartをセットしなかった場合、 // 親子階層の中からCinemachineDollyCartを探すことにしました if (this.dollyCart == null) { this.dollyCart = this.GetComponentInParent<CinemachineDollyCart>(); if (this.dollyCart == null) { this.dollyCart = this.GetComponentInChildren<CinemachineDollyCart>(); if (this.dollyCart == null) { Debug.LogError($"{nameof(CinemachineDollyCart)} not found."); this.enabled = false; return; } } } this.rigidbody = this.GetComponent<Rigidbody>(); this.rigidbody.isKinematic = true; } private void FixedUpdate() { this.force = 0.0f; if (Input.GetKey(KeyCode.W)) { this.force += 1; } if (Input.GetKey(KeyCode.S)) { this.force -= 1; } // オブジェクトの質量を得るためにrigidbodyを使用していますが、 // 動きはdollyCartによってコントロールされており、rigidbodyは関与していません // もし質量が決め打ちでかまわなければ、あるいはForceModeが質量の影響を // 受けないタイプでもかまわなければ、この質量の取得すら省くことができますので // 完全にdollyCartだけで動かすことができるでしょう this.dollyCart.AddForce(this.force, ForceMode.Force, this.rigidbody.mass); // 力をon! // ちなみに「sキーを押して減速、その後停止するようにしたい。」と // おっしゃっているということは、sキーでだんだん減速していった後 // さらにsキーを押し続けてバックし始めてしまうとまずいということでしょうか? // その場合は、下記のように第4引数をfalseにするとバックしなくなるはずです // this.dollyCart.AddForce(this.force, ForceMode.Force, this.rigidbody.mass, false); } private void OnGUI() { // 確認のため、現在カートにトラックに沿って加えられている力と // カートのトラックに沿った速度を表示させてみました GUI.color = Color.black; GUILayout.Label($"Force: {this.force}"); GUILayout.Label($"Speed: {this.dollyCart.m_Speed}"); } }

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

図

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

投稿2022/06/13 12:15

編集2022/06/13 12:27
Bongo

総合スコア9860

良いと思った回答には高評価をしましょう。
評価が高い回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。