弾道銃弾
ℹ️ 留意事項
この記事は Godot 3から Godot 4 へ内容の書き換え中です。 Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリのIssuesまでご報告ください。
課題
ご希望の2D弾は弧を描くように移動したり、弾道曲線を描いたりする仕様でしょうか?
解決策
この問題に対する解決策の一つとして、RigidBody2D コンポーネントを使用することが考えられます。組み込みの物理演算システムにより、発射後も重力によって自動的に地球へ引き戻されるよう設定できます。
ただし、2Dシューティングゲームのレシピで解説されているように、Area2Dは単純な弾丸やその他の投射物に非常に適しています。衝突判定やバウンド、その他の物理挙動を必要としない場合には特に便利です。弾道計算自体は難しくないため、物理エンジンの助けを借りるほどでもありません。
弾丸の設定
- Bullet (Area2D)
- Sprite
- CollisionShape2D
以下の方法で利用できます。Area2D の gravity プロパティを設定します。初期テストでは値を 150 に設定します。
extends Area2D
var velocity = Vector2(350, 0)
func _process(delta):
velocity.y += gravity * delta
position += velocity * delta
rotation = velocity.angle()
func _on_BallisticBullet_body_entered(body):
queue_free()
ここで必要なのは運動方程式を適用するだけです。velocity の初期値は単なるテスト用です。ブレットシーンを実行してください。
現在の射撃オブジェクトでは、弾丸インスタンスを作成し、初期プロパティを設定できます。以下のいずれかの射撃処理関数/入力ハンドラに実装してください。
@export var muzzle_velocity = 350
@export var gravity = 250
func shoot():
var b = Bullet.instantiate()
owner.add_child(b)
b.transform = $Barrel/Marker2D.global_transform
b.velocity = b.transform.x * muzzle_velocity
b.gravity = gravity
以下に実際の使用例をご紹介します。