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

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

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

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

Unity3D

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

Q&A

1回答

1698閲覧

Unity2D スプライトがカーソルの位置に向かって回転しない。

DeruDeru

総合スコア0

C#

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

Unity3D

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

0グッド

0クリップ

投稿2021/07/17 13:27

前提・実現したいこと

GungeonやNuclear Throneのような、見下ろし型弾幕シューティングゲームが作りたく、UnityとC#を最近始めました。

実装したいことは、プレイヤーのスプライトをマウスカーソルの位置の方向に向けて、Y軸を軸に右と左に反転することです。そして、武器のスプライトをプレイヤーのチャイルドとして、マウスカーソルの位置に向けて回転することです。

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

武器のスプライトをプレイヤーのチャイルドにした時、プレイヤーのスプライトは問題なくカーソルの位置に応じて反転するが、武器のスプライトが右方向にしか回転しないことです。Gifの容量を抑えるためにオプティマイズしたため、画質が荒く大変見にくくて恐縮ですが、カーソルが左側にあるのにもかかわらず、武器のスプライトが右に向いているのがわかると思います。

イメージ説明

該当のソースコード

C#

1**プレイヤーのスクリプト** 2public class Movement : MonoBehaviour 3{ 4 public float speed; 5 private Rigidbody2D rb; 6 Vector2 movement; 7 public bool facingRight = true; 8 9 // Update is called once per frame 10 private void Awake() 11 { 12 rb = GetComponent<Rigidbody2D>(); 13 } 14 15 void Update() 16 { 17 movement.x = Input.GetAxisRaw("Horizontal"); // player movement function 18 movement.y = Input.GetAxisRaw("Vertical"); // player movement function 19 20 var delta = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; // player look at the mouse position 21 22 if (delta.x >= 0 && !facingRight) 23 { // mouse is on Right side of player 24 transform.localScale = new Vector3(1, 1, 1); // or activate look right some other way 25 facingRight = true; 26 } 27 else if (delta.x < 0 && facingRight) 28 { // mouse is on left side 29 transform.localScale = new Vector3(-1, 1, 1); // activate looking left 30 facingRight = false; 31 } 32 } 33 34 35 36 private void FixedUpdate() 37 { 38 movement.Normalize(); 39 rb.velocity = new Vector2(movement.x * speed * Time.fixedDeltaTime, movement.y * speed * Time.fixedDeltaTime); 40 } 41}

C#

1**武器のスクリプト** 2public class GunRotation : MonoBehaviour 3{ 4 // Gun Rotation Function 5 public float offset; 6 private SpriteRenderer spriteRender; 7 8 9 // Start is called before the first frame update 10 void Start() 11 { 12 spriteRender = GetComponent<SpriteRenderer>(); 13 } 14 15 16 // Update is called once per frame 17 void Update() 18 { 19 // Gun Rotation Function 20 Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; 21 float rotZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg; 22 transform.rotation = Quaternion.Euler(0f, 0f, rotZ + offset); 23 24 if (rotZ < 89 && rotZ > -89) 25 { 26 Debug.Log("Facing right"); 27 spriteRender.flipY = false; 28 } 29 else 30 { 31 Debug.Log("Facing left"); 32 spriteRender.flipY = true; 33 } 34 } 35}

試したこと

武器のスプライトをプレイヤーから外したところ、プレイヤーと武器の両方が問題なく反転および回転したため、プレイヤーの反転が武器スプライトの回転機能に何らかの影響を及ぼしているのではないかと考えています。

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

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

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

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

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

guest

回答1

0

スクリプトを見ずにお話を聞いた感じの印象ですと、DeruDeruさんが予想されてる通り、武器が親の影響を受けて反転してしまってるのだと思います。

空のオブジェクトを親にして、その中にプレイヤーと武器を入れるのはどうでしょうか?

空オブジェクト
├プレイヤー
└武器

これなら、プレイヤーと武器が独立するので、影響を受けないと思います。

投稿2021/08/02 11:21

moory

総合スコア146

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問