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

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

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

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

Q&A

0回答

2738閲覧

Unity2D 弾幕ゲーム 弾のスクリプト

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2019/11/18 00:50

編集2022/01/12 10:55

弾幕2Dゲームを作成しています。
Playerのスクリプトを改良したものをBossにつけたいと思います。
Playerには、マウスカーソルの向きに弾を発射するスクリプトで、ボスにはPlayerの角度へ発射するスクリプトを作成したいです。

C#

1public class Player : MonoBehaviour 2 { 3 4 public float m_speed; // 移動の速さ 5 public Shot m_shotPrefab; // 弾のプレハブ 6 public float m_shotSpeed; // 弾の移動の速さ 7 public float m_shotAngleRange; // 複数の弾を発射する時の角度 8 public float m_shotTimer; // 弾の発射タイミングを管理するタイマー 9 public int m_shotCount; // 弾の発射数 10 public float m_shotInterval; // 弾の発射間隔(秒) 11 12 private void Update() 13 { 14 // プレイヤーのスクリーン座標を計算する 15 var screenPos = Camera.main.WorldToScreenPoint(transform.position); 16 17 // プレイヤーから見たマウスカーソルの方向を計算する 18 var direction = Input.mousePosition - screenPos; 19 20 // マウスカーソルが存在する方向の角度を取得する 21 var angle = Utils.GetAngle(Vector3.zero, direction); 22 23 // プレイヤーがマウスカーソルの方向を見るようにする 24 var angles = transform.localEulerAngles; 25 angles.z = angle - 90; 26 transform.localEulerAngles = angles; 27 28 // 弾の発射タイミングを管理するタイマーを更新する 29 m_shotTimer += Time.deltaTime; 30 31 // まだ弾の発射タイミングではない場合は、ここで処理を終える 32 if (m_shotTimer < m_shotInterval) return; 33 34 // 弾の発射タイミングを管理するタイマーをリセットする 35 m_shotTimer = 0; 36 37 // 弾を発射する 38 ShootNWay(angle, m_shotAngleRange, m_shotSpeed, m_shotCount); 39 } 40 // 弾を発射する関数 41 private void ShootNWay( 42 float angleBase, float angleRange, float speed, int count) 43 { 44 var pos = transform.localPosition; // プレイヤーの位置 45 var rot = transform.localRotation; // プレイヤーの向き 46 47 // 弾を複数発射する場合 48 if (1 < count) 49 { 50 // 発射する回数分ループする 51 for (int i = 0; i < count; ++i) 52 { 53 // 弾の発射角度を計算する 54 var angle = angleBase + 55 angleRange * ((float)i / (count - 1) - 0.5f); 56 57 // 発射する弾を生成する 58 var shot = Instantiate(m_shotPrefab, pos, rot); 59 60 // 弾を発射する方向と速さを設定する 61 shot.Init(angle, speed); 62 } 63 } 64 } 65}

C#

1public static class Utils 2{ 3 public static float GetAngle(Vector2 from, Vector2 to) 4 { 5 var dx = to.x + from.x; 6 var dy = to.y + from.y; 7 var rad = Mathf.Atan2(dy, dx); 8 return rad * Mathf.Rad2Deg; 9 } 10 public static Vector3 GetDirection(float angle) 11 { 12 return new Vector3 13 ( 14 Mathf.Cos(angle * Mathf.Deg2Rad), 15 Mathf.Sin(angle * Mathf.Deg2Rad), 16 0 17 ); 18 } 19}

C#

1public class Shot : MonoBehaviour 2{ 3 private Vector3 m_velocity; // 速度 4 5 private void Update() 6 { 7 // 移動する 8 transform.localPosition += m_velocity; 9 } 10 11 // 弾を発射する時に初期化するための関数 12 public void Init(float angle, float speed) 13 { 14 // 弾の発射角度をベクトルに変換する 15 var direction = Utils.GetDirection(angle); 16 17 // 発射角度と速さから速度を求める 18 m_velocity = direction * speed; 19 20 // 弾が進行方向を向くようにする 21 var angles = transform.localEulerAngles; 22 angles.z = angle - 90; 23 transform.localEulerAngles = angles; 24 25 // 秒後に削除する 26 Destroy(gameObject, 4); 27 } 28} 29

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問