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

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

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

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

Unity

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

Q&A

解決済

3回答

2201閲覧

UnityでObjectを移動させる方法

sena14

総合スコア109

C#

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

Unity

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

0グッド

0クリップ

投稿2018/05/02 06:24

十字キーのようなものでobjectを動かしたり回転させたりしたいのですが回転させた後に動かそうとすると意図していない方向に進んでしまって困っています。
自力で調べてみた結果ワールド座標とローカル座標がありtransform.Translate()はそのobjectの向きに対して動いてしまうためということまでわかり、下記のようにworldPosに変換して移動させてみたのですがすごい勢いでどこかへ移動していってしまいました。

Tlanslate()にlocalPosを渡したときのような動きを回転後も右へ動かすなら画面に対して右方向へといった感じの仕様にしたいのですがどのようにすればよいのでしょうか?

using System.Collections; using System.Collections.Generic; using UnityEngine; public class StickController : MonoBehaviour { float speedX = 0; float speedZ = 0; GameObject Generator; // Use this for initialization void Start () { this.Generator = GameObject.Find("StickGenerator"); } // Update is called once per frame void Update () { Vector3 localPos = new Vector3(this.speedX, 0, this.speedZ); Vector3 worldPos = transform.TransformPoint(localPos); Generator.GetComponent<StickGenerator>().now.transform.Translate(worldPos ); this.speedX *= 0.96f; this.speedZ *= 0.96f; } //右へ動かす public void MoveRight() { this.speedX = 0.01f; } //左へ動かす public void MoveLeft() { this.speedX = -0.01f; } //手前へ動かす public void MoveFront() { this.speedZ = -0.01f; } //奥へ動かす public void MoveBack() { this.speedZ = 0.01f; } //右へ回転させる public void RotationRight() { Generator.GetComponent<StickGenerator>().now.transform.Rotate(new Vector3(45, 0, 0)); } //左へ回転させる public void RotationLeft() { Generator.GetComponent<StickGenerator>().now.transform.Rotate(new Vector3(-45, 0, 0)); } //手前へ回転させる public void RotationFront() { Generator.GetComponent<StickGenerator>().now.transform.Rotate(new Vector3(0, 0, -45)); } //奥へ回転させる public void RotationBack() { Generator.GetComponent<StickGenerator>().now. transform.Rotate(new Vector3(0, 0, 45)); } }

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

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

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

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

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

guest

回答3

0

ベストアンサー

transform.Translateの第二引数にSpace.Worldを指定するとワールド座標での移動になる為、それ以外の変換は不要かと思います。
Transform.Translate - Unity スクリプトリファレンス


余談&推測ですが、失敗する理由としてはベクトルではなく位置(座標)を返しているからかと思います。
transform.TransformPointではなくtransform.TransformDirectiontransform.TransformVectorを使ってみてください。

投稿2018/05/02 06:51

sakura_hana

総合スコア11425

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

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

sena14

2018/05/06 09:04

ありがとうございます! そんなに簡単にできたんですね
guest

0

以下を試してみてください。

  • transform.Translate に Space.World を付けてみる(sakura_hana さんの回答のとおり)
  • 移動方向を transform ではなく Vector3 で指定してみる

参考コード

質問者さんのコードとは全然違うものですが、参考コードです。
試す場合は動かすゲームオブジェクトに直接アタッチしてください。(2Dプロジェクト用)

C#

1using UnityEngine; 2 3 4public class Mover : MonoBehaviour 5{ 6 // インスペクターから変更可能 7 public float rotateSpeed = 50f; 8 public float moveSpeed = 10f; 9 10 11 private void Update () 12 { 13 // 左右に旋回(A,Dキー) 14 if ( Input.GetKey ( KeyCode.A ) ) 15 { 16 transform.Rotate ( Vector3.forward, rotateSpeed * Time.deltaTime ); 17 } 18 else if ( Input.GetKey ( KeyCode.D ) ) 19 { 20 transform.Rotate ( -Vector3.forward, rotateSpeed * Time.deltaTime ); 21 } 22 23 // 前後方向に移動(W,Sキー) 24 if ( Input.GetKey ( KeyCode.W ) ) 25 { 26 transform.Translate ( transform.up * moveSpeed * Time.deltaTime, Space.World ); 27 } 28 else if ( Input.GetKey ( KeyCode.S ) ) 29 { 30 transform.Translate ( -transform.up * moveSpeed * Time.deltaTime, Space.World ); 31 } 32 33 // 画面の上下左右方向に移動(上下左右キー) 34 if ( Input.GetKey ( KeyCode.UpArrow ) ) 35 { 36 transform.Translate ( Vector3.up * moveSpeed * Time.deltaTime, Space.World ); 37 } 38 else if ( Input.GetKey ( KeyCode.DownArrow ) ) 39 { 40 transform.Translate ( -Vector3.up * moveSpeed * Time.deltaTime, Space.World ); 41 } 42 43 if ( Input.GetKey ( KeyCode.LeftArrow ) ) 44 { 45 transform.Translate ( -Vector3.right * moveSpeed * Time.deltaTime, Space.World ); 46 } 47 else if ( Input.GetKey ( KeyCode.RightArrow ) ) 48 { 49 transform.Translate ( Vector3.right * moveSpeed * Time.deltaTime, Space.World ); 50 } 51 } 52} 53

参考動画

参考動画はこちら

投稿2018/05/02 08:25

編集2018/05/02 09:00
negitama

総合スコア943

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

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

0

C#

1 void Update () { 2 Vector3 localPos = new Vector3(this.speedX, 0, this.speedZ); //(1) 3 Vector3 worldPos = transform.TransformPoint(localPos); //(2) 4 Generator.GetComponent<StickGenerator>().now.transform.Translate(worldPos ); //(3) 5 this.speedX *= 0.96f; 6 this.speedZ *= 0.96f; 7 }

動作確認してないので、私も推測になりますが、上記でローカル座標とワールド座標の関係が逆になっているのが原因だと思います。
質問文を見た感じでは(1)はワールド座標ですし、(3)の~.Translate()はデフォルトではのローカル座標で適用されるため、必要なのは「ローカル座標→ワールド座標」の変換ではなく、「ワールド座標→ローカル座標」の変換です。
また、(2)のtransformはこのスクリプトをアタッチしているオブジェクトのTransformを指しているので、意図した動作にならないはずです。

他については、sakura_hanaさんと同じなので、省略します。

投稿2018/05/02 07:21

fiveHundred

総合スコア9774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問