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

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

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

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

Unity

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

Q&A

解決済

1回答

940閲覧

Unity3Dで、GetAxisでオブジェクトを動かす際、進む角度を変化させたいです。

senkiru

総合スコア24

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2022/03/30 01:04

編集2022/03/30 01:35

ご覧いただきありがとうございます。
UnityとC#を使って、3Dゲームを作り始めた初心者です。
私は現在、
GetAxisのHorizontal,Verticalを用いた下記①のコードを使い、
オブジェクトを3D平面上で動かすことに成功しました。
また、下記②のコードで、そのオブジェクトの向きを水平回転させることにも成功しました。

今苦戦しているのは、オブジェクトを水平回転させて、
オブジェクトの向いている方向を基準として前後左右に動かしたいのですが、
私の現在のGetAxisを用いたコードだとx,z軸に平行な向きにしか動かせません。

オブジェクトが向いている方向を基準として前後左右に動かしたいです。

アドバイスをいただければ幸いです。

以下、現在のコードを記載いたします。
また、一番下に補足を書いています。

■■■①GetAxisを使ってオブジェクトを前後左右に動かすプログラム■■■

public class RigidBodyVelocity : MonoBehaviour { public float speed = 3f; float moveX = 0f; float moveZ = 0f; Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void Update() { moveX = Input.GetAxis("Horizontal") * speed; moveZ = Input.GetAxis("Vertical") * speed; Vector3 direction = new Vector3(moveX, 0, moveZ); } private void FixedUpdate() { rb.velocity = new Vector3(moveX, rb.velocity.y, moveZ); } }

■■■オブジェクトを水平回転させるプログラム■■■

public class Cam_Yoko : MonoBehaviour { void Start() { } void Update() { if (Input.GetKey(KeyCode.R)) { transform.eulerAngles += new Vector3(0, 3, 0); } else if (Input.GetKey(KeyCode.W)) { transform.eulerAngles += new Vector3(0, -3, 0); } }

■■■補足■■■
Unity3Dでのオブジェクトの動かし方は、
transformを使う方法もあるようですが、
私が試したところ、壁などに接した場合に挙動がおかしくなるので
transformは使わない方向で考えたいです。
(壁にめり込む→元に戻る、を細かく繰り返してブルブル動きます)

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

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

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

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

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

fana

2022/03/30 01:16

私は Unity を全く知りませんので何が使える話なのか等の判断はできませんけども, 「unity オブジェクト 向き」とかでググるだけでいろいろと話が見つかる様子です. それらではダメなのでしょうか? (transformとかいうやつからオブジェクトの姿勢情報が取れるような話に見えます)
fana

2022/03/30 01:22 編集

私が「回答」できるわけではありませんが,今の質問文だと何が問題点なのかが不明瞭とも思えます. 仮に「上記のような手段でオブジェクトの姿勢が得られる」のだとして… そのことがわかったならばそれでこの話は解決するっていう話なのか, それとも「オブジェクトの姿勢が得られたらどうだというのか?」っていうようなところ(:それを使ってどういう計算をすれば所望の動作が達成できるのか?っていう算数の領域の話)が問題点なのか, そこらへんをはっきりさせておくと,必要な事柄に関する回答が得られやすくなるのではないでしょうか.
guest

回答1

0

ベストアンサー

そういう時は、絶対座標系(ワールド座標系)ではなく、相対座標系(ローカル座標系)に対して動かさなければなりません。

csharp

1using UnityEngine; 2 3[RequireComponent(typeof(Rigidbody))] 4public class PlayerMovement : MonoBehaviour 5{ 6 [SerializeField] float _moveSpeed = 3f; 7 [SerializeField] float _rotateSpeed = 2f; 8 Rigidbody _rb = default; 9 10 void Start() 11 { 12 _rb = GetComponent<Rigidbody>(); 13 _rb.freezeRotation = true; 14 } 15 16 void Update() 17 { 18 float h = Input.GetAxisRaw("Horizontal"); 19 float v = Input.GetAxisRaw("Vertical"); 20 _rb.velocity = (this.transform.forward * v + this.transform.right * h).normalized * _moveSpeed 21 + Vector3.up * _rb.velocity.y; 22 float r = Input.GetAxisRaw("Mouse X"); 23 this.transform.Rotate(this.transform.up, r + _rotateSpeed * Time.deltaTime); 24 } 25}

注)FixedUpdate() を使っていませんが、これは正しいです。

投稿2022/03/30 01:38

編集2022/03/30 02:32
bboydaisuke

総合スコア5275

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

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

senkiru

2022/03/30 02:01

ありがとうございます!! いただいたコードを一部変えて、質問が解決しました!! 思っていた動かし方ができました!! お礼申し上げますm(_ _)m 申し訳ございません、もしよろしかったら、 追加で少しお伺いしたいのですが。。。 どのあたりが相対座標系(ローカル座標系)なのでしょうか。。。 教えてやっていただけませんでしょうか。。。すみません。。。
bboydaisuke

2022/03/30 02:04

ローカル座標系 ワールド座標系 unity でググりましょう。
senkiru

2022/03/30 02:05

かしこまりました m(_ _)m このたびは、ありがとうございました^_^
fana

2022/03/30 02:23 編集

座標系の区別というか基底変換の話から入らねばならない的な想定での回答だとしたら, 「ローカル座標系における速度」というベクトルを陽に扱う(:ベクトル型の変数として明確にコード上に現れる形に定義する)とより分かりやすい形になるのではないでしょうか? …とか思いました.
senkiru

2022/03/30 02:36

fana様 アドバイスありがとうございます。 ちょっとまだ知識が追い付いていませんので、、、 引き続き勉強いたします。。。
fana

2022/03/30 03:13

示されたコードの > _rb.velocity = ... (長いので省略しますが) の部分には,ワールド座標系の上で定義されているベクトルとスカラーしか出てきていないのですから,これを見て > どのあたりが相対座標系(ローカル座標系)なのでしょうか という疑問が生じるのは当然のことではないかな,と思います. このコードは ワールド座標系に変換した結果のベクトル = 変換(ローカル座標系で考えているベクトル) という変換処理の中身の具体的な演算ををある程度書き下した状態のものなので,この状態だとわからない状況なのであれば 書き下す前の状態から説明がはじまっているような解説なりを見つけて読む必要があるでしょう.
senkiru

2022/03/30 05:00

ご丁寧にありがとうございます。 _rb.velocity = ... の内容について調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問