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

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

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

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

Unityの2Dゲーム制作で弾の発射方向に合わせてスプライトを回転させたい。

SH172
SH172

総合スコア21

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0評価

0クリップ

293閲覧

投稿2022/06/15 06:23

Unityでシューティング制作をはじめました。
プレイヤーから弾の発射方向を指定し、その発射方向を回転させていく。という軌道を作っているのですが
弾丸のスプライトが発射方向とがうまく合いません。
弾の発射方向は変数 pbAngで一定量回転しているのですが、弾丸のスプライトはそれとは異なる割合で回転しているようです。
数学的な間違いがある模様ですが、突き止めることができていません。ご指摘やアドバイスがあれば教示お願いします。

スクリプトはプレイヤーの操作と弾丸の移動に分かれています。

こちらはプレイヤーのスクリプトです

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCtrl : MonoBehaviour { public BulletCtrl pB002; private float shottime = 0; //弾の発射間隔 public float ang001 = Mathf.PI / 2;//弾の発射方向 float pbAng = 0.08f; //発射方向の加算分 float speed001 = 0.005f;//弾の速度 public float deg001 = 0.0f; void Start() { } void Update() { shottime -= 1; Pshot(ang001, speed001, deg001); } void Pshot(float angle, float speed, float deg) { if (shottime < 0) { shottime = 200.0f; ang001 += pbAng; deg001 = ang001 * Mathf.Rad2Deg; BulletCtrl bullet = Instantiate(pB002, transform.position, transform.rotation); bullet.shot(angle, speed, deg); } } }

こちらは弾丸を動かし、スプライトを回転させているスクリプトです。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class BulletCtrl : MonoBehaviour { float dx; float dy; float ang; public void shot(float angle, float speed, float deg) { dx = Mathf.Cos(angle) * speed; dy = Mathf.Sin(angle) * speed; ang = deg; } void Update() { transform.Translate(dx, dy, 0); transform.rotation = Quaternion.Euler(0, 0, ang); //この画像回転が発射方向と合わない if (transform.position.x < -5 || transform.position.x > 5 || transform.position.y < -5 || transform.position.y > 5) { Destroy(gameObject); } } }

どうかよろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

bboydaisuke

2022/06/15 08:35 編集

弾の発射方向のベクトルを弾の transform.up に代入すればできます。(弾の画像の上側が先端の場合) 質問を見ても、どんな操作をしたら何が起こるのか想像できませんが、Unity では角度を操作するよりベクトル演算でやった方が圧倒的にシンプルに書けます。
SH172

2022/06/15 09:21

回答本当にありがとうございます。transform.upというのがあるのですね。 しかし >弾の発射方向のベクトルを弾の transform.up に代入すればできます。 この部分で、変数でいうとなにをtransform.up に代入して、それをどのように画面に反映させればいいのか、わかりませんでした。 回答をいただいてとても感謝していて、自分でもできる限りの試行錯誤をしているのですが、どうしても実現できません。 >弾の発射方向のベクトルを弾の transform.up に代入 というところについて、上記の変数をどのようにtransform.up に代入すればいいのか、何とかご教示いただけないでしょうか。
SH172

2022/06/16 04:33

回答ありがとうございます。サンプルまで作っていただき感謝しております。 やはりRigidbodyを使うことになるようですね。 できるだけスクリプトを使って製作していくことで、ここから弾道のバリエーションに応用していこうと考えていたのですが、アドバイスをいただいた手法を検討していくことにします。 ありがとうございました。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。