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

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

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

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

Q&A

解決済

1回答

840閲覧

物理演算を考慮しつつ、向いている方向に転がして移動させたい

YYYY

総合スコア1

Unity

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

0グッド

0クリップ

投稿2022/09/25 13:56

概要

ボールを、上下キーで前進/後退、左右キーで方向転換を行う動作を目的として、以下のコードを作成したところ、同じ場所を行ったり来たりするのみでうまく進まず、方向転換もボールが回転していると、それ自身の傾きを考慮してしまい、y軸でうまく回りません。

ソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerController : MonoBehaviour 6{ 7 public float speed; 8 public float angleSpeed; 9 10 private Rigidbody rb; 11 12 // Start is called before the first frame update 13 void Start() 14 { 15 rb = GetComponent<Rigidbody>(); 16 } 17 18 void FixedUpdate() 19 { 20 //キー入力を取得 21 var moveHorizontal = Input.GetAxis("Horizontal"); 22 var moveVertical = Input.GetAxis("Vertical"); 23 24 //上下入力は進行、後退を行う 25 rb.AddForce(transform.forward * moveVertical * speed * Time.deltaTime, ForceMode.Force); 26 27 //左右入力は方向転換を行う 28 transform.Rotate(0, angleSpeed * moveHorizontal * Time.deltaTime, 0); 29 } 30}

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

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

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

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

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

pm_tera

2022/09/25 17:24

正確な回答ではないので、こちらへのコメントで失礼します。 >上下入力は進行、後退を行う 球体が回転しているためtransform.forwardの向きが変わってしまうことが行ったり来たりの原因です。 たとえば、該当箇所をCamera.main.transform.forwardとすると、カメラの奥行方向に進んだり、戻ったりできます。 >左右入力は方向転換を行う おそらく、やりたいことはtransform.RotateAroundではないかと想像します。 ただ、方向転換後には前進/後退の向きはどうなるのでしょうか? 90度方向転換したら、上下キーで左右に進むようになるのでしょうか? そのあたりの仕様を記述すると、より正確な回答を得られると思います。 余談ですが、十字キーで前進/後退するゲームの多くは、左右キーではカメラの位置と向きを変えているだけな気がします……
guest

回答1

0

ベストアンサー

pm_teraさんのご意見のとおり、多くのゲームではカメラの向きを基準に進行方向を決める方式が主流のように思います。
ですがゲームデザインによってはカメラとは独立して進行方向を決める、いわばラジコン的な方式にしたい場合があるかもしれません。
もしそうでしたら、たとえば下記のように前方向を表すベクトルを別途用意するというのはいかがでしょうか。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerController : MonoBehaviour 6{ 7 public float speed; 8 public float angleSpeed; 9 10 private Rigidbody rb; 11 12 // 前方を表すベクトルを別途用意する 13 private Vector3 forward; 14 15 // Start is called before the first frame update 16 void Start() 17 { 18 rb = GetComponent<Rigidbody>(); 19 20 // Start時のtransform.forwardを初期前方ベクトルとする 21 forward = transform.forward; 22 } 23 24 void FixedUpdate() 25 { 26 //キー入力を取得 27 var moveHorizontal = Input.GetAxis("Horizontal"); 28 var moveVertical = Input.GetAxis("Vertical"); 29 30 //上下入力は進行、後退を行う 31 // transform.forwardに代わってforwardの向きに力を加える 32 rb.AddForce(forward * moveVertical * speed * Time.deltaTime, ForceMode.Force); 33 34 // ちなみに余計なお世話かもしれませんが、ForceMode.Forceで力を加えるときは普通は下記のように 35 // 第一引数の力のベクトルをTime.deltaTimeに依存させないようにするべきかと思います 36 // rb.AddForce(forward * moveVertical * speed, ForceMode.Force); 37 // Time.deltaTimeをかけてしまうと、Edit→Project Settings...のTime→Fixed Timestepを変更した際に 38 // 力の大きさがTime.deltaTimeに比例して変化し、動き方が変わってしまうかもしれません 39 40 //左右入力は方向転換を行う 41 // transformに代わってforwardを回転させる 42 forward = Quaternion.Euler(0, angleSpeed * moveHorizontal * Time.deltaTime, 0) * forward; 43 } 44 45 void Update() 46 { 47 // 向きの確認のため、シーンビュー上にforward方向を表す青い線を描く 48 Debug.DrawRay(transform.position, forward, Color.blue); 49 } 50}

投稿2022/09/30 13:46

Bongo

総合スコア10807

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問