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

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

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

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

Unity

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

Q&A

解決済

1回答

1773閲覧

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

SH172

総合スコア21

C#

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

Unity

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

0グッド

0クリップ

投稿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); } } }

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

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

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

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

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

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

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を使うことになるようですね。 できるだけスクリプトを使って製作していくことで、ここから弾道のバリエーションに応用していこうと考えていたのですが、アドバイスをいただいた手法を検討していくことにします。 ありがとうございました。
guest

回答1

0

ベストアンサー

Unity の機能を使って Unity らしく作るとこんな感じになると思います。

C#

1using UnityEngine; 2using UnityEngine.UI; 3 4public class GenerateBullet : MonoBehaviour 5{ 6 [SerializeField] GameObject _bulletPrefab; 7 [SerializeField] float _shotInterval = 0.3f; 8 [SerializeField] Transform _muzzle; 9 [SerializeField] Animator _muzzleSpinner; 10 float _timer = 0f; 11 12 void Update() 13 { 14 _timer -= Time.deltaTime; 15 16 if ( _timer < 0f ) 17 { 18 _timer = _shotInterval; 19 Instantiate(_bulletPrefab, _muzzle.position, _muzzle.rotation); 20 } 21 } 22 23 public void Spin(bool stop) 24 { 25 if (stop) 26 { 27 _muzzleSpinner.Play("Idle"); 28 } 29 else 30 { 31 _muzzleSpinner.Play("Spin"); 32 } 33 } 34 35 public void SetSpeed(Slider slider) 36 { 37 _muzzleSpinner.speed = slider.value; 38 } 39}

C#

1using UnityEngine; 2 3[RequireComponent(typeof(Rigidbody2D))] 4public class BulletController : MonoBehaviour 5{ 6 [SerializeField] float _speed = 2f; 7 8 void Start() 9 { 10 var rb = GetComponent<Rigidbody2D>(); 11 rb.velocity = transform.up * _speed; 12 } 13}

動いている様子

イメージ説明

パッケージ

Spin.unitypackage

投稿2022/06/15 13:34

bboydaisuke

総合スコア5275

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問