弾幕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
あなたの回答
tips
プレビュー