【Unreal Engine】UE5で弾を撃つ:Spawn ActorとProjectile Movementの基本

作成: 2026-07-20最終更新: 2026-09-05

左クリックで弾を出し、箱へ当ててHPを減らす入門記事。Spawn Actorによる生成、Projectile Movementによる移動、衝突と寿命による後始末を、役割ごとに図解します。

ボタンを押すと弾が飛び、箱に当たって消える。この動きは、弾を出す・飛ばす・当たった結果を処理する の3つに分けると作りやすくなります。

弾を出すのが Spawn Actor from Class、飛ばすのが Projectile Movement Component です。この記事では、左クリックで白い球を撃ち、的の箱へ20ダメージを与えるところまで作ります。外れた弾も、3秒後には消えるようにしましょう。

弾を出す・飛ばす・命中と後始末を担当する3つの役割

この記事でわかること

  • 作るActorの種類と、生成する位置・向きの指定
  • 弾の当たり判定と見た目、移動を担当する部品の分け方
  • 左クリックで発射し、命中した箱のHPを減らす手順
  • 生成できない場合の確認と、外れた弾の後始末

Sponsored

Spawn Actorは、実行中にActorを作る

レベルへ箱をドラッグして置く操作は、ゲーム開始前の配置です。ゲーム中に弾を撃ったり、倒した敵の場所へアイテムを落としたりするときは、そのタイミングで新しいActorを作ります。この生成を Spawn(スポーン) と呼びます。

Spawn Actor from Classでは、まず「何を」「どこへ出すか」を決めます。

入力・出力決めること
Class作るActorの種類。今回は弾のBlueprint Class
Spawn Transform作る位置・回転・大きさ
Collision Handling Override生成位置でほかの物と重なる場合の扱い
Return Value生成したActorを後から指定するための参照

Classは作る種類、Return Valueは今作った1個を指す情報 です。同じ弾のClassから10発出せば、レベルには別々の弾が10個できます。

Transformは、Location(位置)・Rotation(回転)・Scale(大きさ)をまとめたデータです。弾なら「銃口の位置へ、撃つ方向を向けて、等倍で出す」という指定になります。

同じClassとTransformを使って別々のActorを生成し、Return Valueで今回の1個を指定する

生成したActorは、自分のBlueprintに書かれた処理を始めます。発射するキャラクターは生成までを担当し、その後の移動や消える処理は弾の側へ持たせると、役割を追いやすくなります。

OwnerとInstigatorは、誰が出したかを残す情報

Spawn Actorの詳細ピンには、OwnerとInstigatorもあります。Ownerは所有者として記録するActor、Instigatorはその行動を起こしたPawnです。Pawnは、プレイヤーやAIに操作されるActorの種類で、Characterも含みます。

今回は、どちらにも発射するBP_InputPracticeを渡します。発射者を操作する Controller は、プレイヤー入力やAIの操作を担当するActorです。後のダメージ処理では、InstigatorからこのControllerを取り出して渡します。

ただし、OwnerやInstigatorを設定するだけで、発射者に当たらなくなったり、スコアが加算されたりするわけではありません。 当たり判定や得点の処理は、別に作ります。

Controllerが操作する発射者と、Owner・Instigatorを持つ弾の関係

弾を飛ばす役割はProjectile Movement

Spawn Actorは弾を出しますが、それだけでは飛びません。弾のBlueprintへ Projectile Movement Component を付けると、速度や重力に従って位置を更新してくれます。Projectileは、弾や投げた物のことです。

最初は、次の4項目を押さえましょう。

項目意味今回の値
Initial Speed発射時の速さ。cm/秒1000
Max Speed速さの上限。0なら上限なし1000
Projectile Gravity Scale弾へ効く重力の倍率。0なら重力なし0
Should Bounceぶつかったときに跳ね返るかオフ

1000cm/秒は、1秒で10m進む速さです。最初は飛ぶ様子が分かる速度にして、動きと設定を結び付けます。

方向には Velocity(速度ベクトル) を使います。これは、進む向きと速さを表すX・Y・Zの値です。Initial Speedが正の値なら、Velocityを方向として使い、速さをInitial Speedへ合わせます。Initial Speedが0の場合も、Velocity自体に速さがあれば動くため、「0なら必ず停止」とは限りません。

今回はVelocityを(1, 0, 0)、Initial Velocity in Local Spaceをオンにします。Local Spaceは「そのActor自身を基準にした向き」です。この組み合わせなら、弾の前方であるローカル+Xへ飛びます。生成時に弾のRotationを変えると、発射方向も変わります。

当たり判定の部品を、一番上へ置く

弾のBlueprintは、次の3部品で組みます。

部品役割
Sphere Collision球形の当たり判定。Rootにする
Static Mesh見た目の球。Sphereの子にする
Projectile MovementSphereを動かす

Rootは、Actor全体の位置の基準になる部品 です。Projectile Movementは通常、このRootを移動対象にします。移動中の経路を調べるSweepでは、移動対象の当たり判定が使われるため、見た目だけの部品をRootにしないことが大切です。

見た目のMeshはSphereに付いて動きます。今回はMeshのCollisionを切り、球形のSphereで判定をまとめます。Projectile Movementは見た目を持たない移動用の部品なので、Sphereの下へ置く立体部品とは役割が違います。

SphereをRootにし、Bodyを子にしてProjectile Movementで動かす構成

実践の準備:白い球で箱を撃つ

Enhanced Input入門のBP_InputPracticeと、体力とダメージ入門のBP_Damageableを使います。プレイヤーは白い直方体、的はHP100の箱です。

平らな床の上面をZ=0とし、PlayerStartをLocation=(0, 0, 100)、Rotation=(0, 0, 0)へ置きます。同じGameModeからBP_InputPracticeを出し、WASDで動ける状態にしてください。今回は向きを固定した練習なので、左クリックすると身体の前方である+X方向へ撃ちます。

開始位置から6m先の箱へ、前方100cmに生成した球を撃つ練習

1. HPを持つ的を置く

BP_DamageableのDamageMeshに標準Cubeを設定し、相対Location・Rotationは0、相対Scaleは(1.5, 1.5, 2)にします。Collision PresetsはBlockAll、Simulate Physicsはオフです。

レベルに1個置き、ActorのLocation=(600, 0, 100)、Rotation=(0, 0, 0)、Scale=(1, 1, 1)にします。プレイヤーから6m前方にある、幅150cm・高さ200cmの的になります。

体力の記事で作った、次の基本処理を使います。

  • MaxHealthは100。BeginPlayでCurrentHealthへコピーする。
  • Event AnyDamageで受け取ったDamageをCurrentHealthから引く。
  • 0からMaxHealthの範囲に収め、残りHPをPrint Stringで表示する。
  • HPが0になったらDestroy Actorで的を消す。

Class DefaultsのCan Be Damagedはオンです。体力の記事の追加例で無敵時間を入れた場合は、その時間より間隔を空けて撃ちます。連射しても、受け付けたダメージだけがHPへ反映されます。

2. 弾のBlueprintを作る

Actorを親にしたBlueprint Classを作り、BP_ProjectilePracticeと名付けます。

  1. Sphere Collisionを追加し、DefaultSceneRootへドラッグしてRootにする。名前はSphere、Sphere Radiusは10、Scaleは(1, 1, 1)。
  2. Sphereの子へStatic Meshを追加し、名前をBodyにする。Engine/BasicShapesのSphereメッシュを指定する。見つからない場合は、アセット選択欄でエンジンコンテンツの表示をオンにする。
  3. Bodyの相対Location・Rotationは0、Scaleは(0.2, 0.2, 0.2)、Collision PresetsはNoCollisionにする。
  4. Projectile Movementを追加する。

標準Sphereメッシュの直径100cmを0.2倍にすると、直径20cmになります。半径10cmの当たり判定と、見た目の大きさを合わせた設定です。

SphereのMobilityはMovable、Simulate Physicsはオフにします。今回はProjectile Movementで飛ばします。Simulate Physicsをオンにすると物理シミュレーションが移動を担当するため、この練習の設定と混ぜません。

SphereのCollision PresetsをBlockAllDynamicからCustomへ変え、次の値にします。

項目
Collision EnabledQuery Only
Object TypeWorldDynamic
WorldStaticへの反応Block
WorldDynamicへの反応Block
Pawnへの反応Ignore

Query Onlyは、移動中の衝突などを調べる検索を有効にする設定です。WorldStaticは動かない地形など、WorldDynamicは動くActorなどに使う種類です。Blockで相手を遮り、Ignoreで無視します。

この設定では床や的に当たり、Pawnである自分は無視します。敵もPawnなら無視する ため、これは箱を撃つ練習用です。自分と敵を分けたい場合は、カスタムチャンネルの記事へ進めます。

3. 飛び方と寿命を設定する

Projectile Movementを選び、次の設定をそろえます。

項目
Velocity(1, 0, 0)
Initial Velocity in Local Spaceオン
Initial Speed / Max Speedどちらも1000
Projectile Gravity Scale0
Should Bounceオフ
Sweep Collision / Auto Activateどちらもオン

Sweep Collisionは、移動先だけでなく、そこへ進む経路で衝突を調べる設定です。弾が動き始めるよう、Auto Activateもオンにします。

Class Defaultsで Initial Life Spanを3 にします。Life Spanは寿命で、生成から3秒たつと弾を自動で破棄します。当たらずに飛び続けた弾が、レベルへ残り続けるのを防ぐためです。0は「寿命では自動破棄しない」という意味になります。

コンパイルして保存します。ここまでで、生成されれば前へ飛び、3秒後に消える弾の種類ができました。

Sponsored

発射する側:位置と向きを渡して生成する

次はBP_InputPracticeから弾を出します。発射する側に作る処理は、入力と生成だけです。

1. 左クリックの入力を作る

Input ActionのIA_FireProjectileを作り、Value TypeをDigital (Bool)、ModifiersとTriggersを空にします。既存のIMC_PlayerControlsのMappingsへ加え、Left Mouse Buttonを割り当てます。

BP_InputPracticeのイベントグラフにIA_FireProjectileを置き、StartedからSpawn Actor from Classへ白い線をつなぎます。ClassはBP_ProjectilePracticeです。Startedなら、押し始めたときに1発出ます。

IA_FireProjectileのStartedをSpawn Actorの実行入力へつなぐ

2. 身体の前方100cmへ出す

身体の中心に弾を出すと、見た目が重なって発射を確認しにくくなります。今回は銃口の代わりに、身体の中心から100cm前を使います。

生成位置 = 自分の位置 + 自分の前方向 × 100

Get Actor LocationとGet Actor Forward VectorのTargetはselfです。Get Actor Forward Vectorは、長さ1の前方向を返します。これに、小数を扱える数値型Floatの100をMultiplyで掛けると、前方100cmのずれになります。その結果をActor LocationへAddで足します。

前方向に100を掛けて現在位置へ足し、生成位置を計算する配線

Spawn Transformピンを右クリックして「Split Struct Pin」を選ぶと、Location・Rotation・Scaleへ分けて接続できます。

Spawnの入力接続・値
Spawn Transform Location上のAddの結果
Spawn Transform RotationGet Actor Rotation(Target=self)
Spawn Transform Scale(1, 1, 1)
Collision Handling OverrideDo Not Spawn
OwnerSelf
InstigatorSelf

ここでのSelfは、発射するBP_InputPracticeです。弾は自身の+Xへ飛ぶ設定なので、キャラクターのRotationも渡すことで、身体の向きと発射方向が合います。

3. 生成できたかを確認する

Spawn ActorのReturn Valueから、白い実行ピンがある Is Valid を作り、Input Objectへつなぎます。Spawn Actorの白い実行出力もIs Validへつなぎます。

Is Validは、その参照が使えるActorを指しているかを確かめます。Is Not Valid側だけPrint Stringへつなぎ、「生成できません」と2秒表示します。Is Valid側は、この段階では未接続で構いません。生成した弾は、自分のProjectile Movementで飛び始めます。

Spawnの実行出力とReturn ValueをIs Validへ渡し、失敗した場合だけ表示する配線

コンパイルしてPlayし、画面をクリックしてゲームへ入力を渡します。次の左クリックで白い球が前へ出るか確認してください。通常移動のIMCで試し、Fキーによる操作モード切替は使いません。

まだダメージ処理はありません。的に当たると球が止まり、生成から3秒たつと消えれば、この段階はできています。

弾の側:止まった相手へダメージを渡す

最後に、BP_ProjectilePracticeへ命中後の処理を作ります。Projectile Movementを選び、詳細パネルのイベントから On Projectile Stop を追加します。

これは、Projectile Movementによる移動が止まったときのイベントです。今回はShould Bounceがオフなので、Blockの相手にぶつかると止まります。イベントのHit Resultは、相手や衝突位置をまとめたデータです。

1. 相手があるかを分ける

On Projectile StopのHit ResultからBreak Hit Resultを作り、まとまった情報を個別の出力へ分けます。Hit Actorが、ぶつかった相手です。この出力から、Boolean(true/false)を返すIs Validを作ります。こちらは白い実行ピンがない形です。

On Projectile Stopの白い実行出力をBranchへ、Is ValidのBoolean出力をConditionへつなぎます。相手の情報がある場合だけ、ダメージを渡す 分岐です。

停止イベントのHit Resultから相手を取り出し、Is Validの結果でBranchを分ける

2. 20ダメージを渡して弾を消す

BranchのTrueからApply Damageへつなぎ、次のように指定します。

Apply Damageの入力接続・値
Damaged ActorBreak Hit ResultのHit Actor
Base Damage20
Event InstigatorGet Instigator Controller(Target=self)
Damage CauserSelf

ここでのSelfは 弾のBP_ProjectilePractice です。発射側のSelfとは、指しているActorが違います。

Get Instigator Controllerは、生成時にInstigatorへ渡したPawnを操作するControllerを取得します。Apply DamageのEvent InstigatorはPawnではなくControllerを受け取るため、このノードを間に挟みます。Damage Causerには、実際に当たった弾を渡します。

相手へ20ダメージを渡し、発射者のControllerと弾自身を指定して弾を消す配線

Apply Damageの実行出力からDestroy Actor(Target=self)へつなぎます。BranchのFalse側も同じDestroy Actorへつなぎ、相手の情報が取れない場合にも弾は消します。

BranchのFalse出力をDestroy Actorの実行入力へつなぎ、弾自身を消す

壁や床も、有効なActorです。 壁に当たったからFalseへ進むわけではありません。TrueからApply Damageを呼んでも、その相手にHPを減らす処理がなければ、箱と同じように壊れることはありません。

命中した弾はその場で消し、外れた弾は生成から3秒で消す

3. 的のHPと、外れた弾を確認する

Playして開始位置から撃ちます。球が的に当たって消え、的のHPが100→80→60と減るか確認します。ダメージが5回受け付けられると、HPが0になり的も消えます。

次はAやDで横へずれて撃ち、的に当たらなかった球が3秒後に消えるか見ます。直進して何にも当たらなければ、速さ1000cm/秒で3秒なので、生成位置から約30m進みます。寿命の確認には、その先まで障害物のない場所を使います。

Sponsored

生成できないときは、重なり方を確認する

「生成できません」が出る場合は、Classと生成位置を見直します。特に壁際では、生成する球の当たり判定が壁へ入り込んでいないか確認しましょう。

壁と生成位置が重なった場合のDo Not SpawnとAlways Spawnの違い

Collision Handling Overrideは、生成位置に衝突を遮る相手がある場合の扱いを選びます。

設定位置がふさがっている場合
DefaultClass側の設定に従う
Always Spawn, Ignore Collisions衝突を理由に生成を中止しない
Try To Adjust Location, But Always Spawn空き場所への調整を試し、見つからなくても生成する
Try To Adjust Location, Don't Spawn If Still Colliding調整を試し、解消できなければ生成しない
Do Not Spawn指定位置で衝突するなら生成しない

今回はDo Not Spawnにして、出せなかったことを画面へ表示しています。Always Spawnへ変えても、壁との重なりが自動で解消されたり、生成後の衝突が無効になったりするわけではありません。

身体の前へずらす方法も、どんな壁際でも使える銃口対策ではありません。身体と生成位置の間に薄い壁があると、その向こうへ出してしまう場合があります。本格的な武器では、銃口の位置に加え、そこまで壁に遮られていないかも確認します。

重力と跳ね返りを変えてみる

直進する弾ができたら、同じ仕組みで飛び方を比べられます。元の弾を残すため、コンテンツブラウザでBP_ProjectilePracticeを右クリックし、子Blueprint Classを作ってBP_BouncePracticeと名付けます。子は、元の部品や処理を引き継ぐ種類です。

初期方向と重力、跳ね返りの設定による飛び方の違い

子のProjectile Movementだけ、次の値へ変えます。

項目
Velocity(1, 0, 0.5)
Initial Speed700
Max Speed1000
Projectile Gravity Scale1
Should Bounceオン
Bounciness0.6
Friction0.2

VelocityのZを正にすることで、少し上向きに発射します。そこへ重力が効き、上がってから落ちる軌道になります。Bouncinessは跳ね返る強さ、Frictionは接触した面に沿う動きを弱める摩擦です。

発射側のSpawn ClassをBP_BouncePracticeへ変え、的のない方向へ横移動して、広い床の上で撃ちます。上へ飛び、床に当たって跳ね返るか見ます。元のInitial Life Span=3を引き継ぐため、動いている途中でも3秒で消えます。

On Projectile Stopは、跳ね返るたびのイベントではありません。Should Bounceがオンなら、速さが停止用のしきい値まで落ちた場合などに呼ばれます。On Component Hitで即Destroyする構成だと、最初の衝突で消える ため、跳ね返りを試すときは後始末のタイミングも合わせます。

これは飛び方の比較で、爆発する手榴弾の完成形ではありません。確認後はSpawn ClassをBP_ProjectilePracticeへ戻します。

Line Traceとの使い分け・よくあるつまずき

Line Traceは、呼び出した時点で線上に何があるかを調べます。今回の弾は、Actorが飛んでいる間に位置を変え、その経路で衝突を調べます。

すぐに命中を決めたい銃撃ならLine Trace、届くまでの時間や途中の跳ね返りを遊びに使いたいならProjectile、という選び方ができます。Line Traceの結果に光る軌跡を描くこともできるので、見た目があるかどうかだけで決める必要はありません。

Line Traceは呼び出した時点、Projectileは飛んでいる間に命中を調べる
症状確認するところ
左クリックで何も起きないIAの割当、IMCの有効化、Startedからの実行線
「生成できません」が出るClass、生成位置、Collision Handling
球は出るが飛ばないProjectile Movementの有効化、速度、SphereがRootか
意図した方向と違うVelocity、Local Space、Spawnへ渡すRotation
的を通り抜けるSphereと的のCollision、Sweep Collision、移動対象
的には当たるがHPが減らないOn Projectile Stop、Apply Damageの相手、的のAnyDamage処理と無敵時間
跳ね返る前に消えるHitで即Destroyしていないか、寿命を迎えていないか

Projectile MovementのSweepによる衝突と、物理シミュレーションによる衝突は区別します。Simulation Generates Hit Eventsは物理シミュレーションからHit通知を受け取る場合の設定で、今回のOn Projectile Stopを動かすために必須というものではありません。

高速な弾が抜ける場合も、まず当たり判定とSweep、移動対象を確認します。Sweepは移動の途中を調べるため、「1フレームの移動距離が壁の厚みを超えたから」とだけ考えると、原因を見誤ります。

おまけ:先に知っておくと良いこと

  • 自分に当たる弾: Spawn位置を撃った本人の内側に置くと、出た瞬間に自分へ当たります。銃口のソケットから 少し前 に出し、撃った本人を無視する設定を入れます
  • Collision Handling Overrideを確認する: 未設定のままだと、重なった場所で弾が生成されなかったり、逆に生成されて多重衝突したりします。弾の用途に合わせて選びます
  • Projectile Movementだけでは飛ばない: Collisionと初速の設定が要ります。寿命(Lifespan)も必ず設定して、外れた弾がレベルに残り続けないようにします
  • 数が増えたら見直す: 弾が同時に何十発も出るなら、当たり判定と描画の両方が効いてきます

まとめ

発射するキャラクターは、弾の種類・位置・向きを決めてSpawnします。弾はProjectile Movementで飛び、止まった相手へダメージを渡して消えます。外れた場合はLife Spanが後始末を担当します。

まずは1発が出る、的で止まる、HPが減る、外れても消える、という順に確かめてみてください。動く部分を一つずつ増やすと、魔法弾や投げる道具へ広げるときにも、どこを変えればよいかが分かります。

参考:Spawn Actor from ClassProjectile Movement Component初期速度と移動設定Get Instigator ControllerSet Life SpanOn Component Hit

Unreal Engine このセクションのノート98