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

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

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

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

Q&A

1回答

670閲覧

unityでRigidBody2D.VelocityとAddForceの処理を同時に使いたい。

10key3

総合スコア1

C#

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

0グッド

0クリップ

投稿2022/08/13 12:23

編集2022/08/13 12:24

前提

unityでRigidBody2D.VelocityとAddForceの処理を並行して使いたい。

実現したいこと

ボタンを押した際時、任意の2Dオブジェクトを横、縦、斜めに移動させたい。また斜め方向では放物線を描くように斜めに動かしたい。その際、ボタンを一回押すだけで物体が着地までするようにしたい。

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

現在横、縦移動をRigidBody2D.Velocityを書き換えて行っており、斜めの移動をAddForceで行おうとしたところエラーメッセージは出ないが処理が行われなくなった。Velocityの処理をコメントアウトすると、AddForceでの処理が正常に行われる。

エラーメッセージ

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class test : MonoBehaviour { //インスペクターで値を設定 public float speed; public float gravity; private Rigidbody2D rb = null; void Start() { rb = GetComponent<Rigidbody2D>(); } void Update() { float xSpeed = 0.0f; float ySpeed = -gravity; //放物線に飛んでいく処理 if ("上矢印キーを押したら") //if文の中の処理は省略しています。 { Vector2 forceDirection = new Vector2(1.0f, 1.0f); // 上の向きに加わる力の大きさを定義 float forceMagnitude = 10f; // 向きと大きさからSphereに加わる力を計算する Vector2 force = forceMagnitude * forceDirection; rb.AddForce(force, ForceMode2D.Impulse); } //横移動の処理 if ("横矢印キーを押したら") //上に同じく。 xSpeed = speed; } rb.velocity = new Vector2(xSpeed, ySpeed); //この一文をコメントアウトしないと、上矢印キーを押したときの処理が行われない。 } }

試したこと

Velocityを使って斜め移動ができないかと試し、
(中略)
if (Input.GetKeyDown("up"))
{
rb.velocity = new Vector2(rb.velocity.x, upForce);
}
のような処理を見つけた (参考:https://www.f-sp.com/entry/2016/08/16/211214) ものの、矢印キーを離したときにそのまま垂直落下してしまう。キーを一回押すだけで着地までしてほしい。

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

unity2020.3.19f1

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

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

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

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

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

guest

回答1

0

rb.velocity = new Vector2(xSpeed, ySpeed); //この一文をコメントアウトしないと(省略)
の箇所を、
rb.velocity += new Vector2(xSpeed, ySpeed);
のようにベクトルの足し算とするのはいかがでしょうか。
元々の記載だと、上キー時のAddForceによるベクトルが上書きされる形となっています。

蛇足:速度制限を特に考えていないため、右キーを連打するとインスペクタからのspeedの値を超えてしまいます。
これが嫌なら、横移動の判定個所を以下のようにすれば速度制限できます(実装方法の良し悪しは置いておいて)
if (Input.GetKeyDown(KeyCode.RightArrow) && rb.velocity.x < speed)
{
xSpeed = speed;
}

投稿2022/08/13 19:00

uniNewbie

総合スコア10

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

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

10key3

2022/08/13 23:39 編集

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問