ボタンを押すと弾が飛び、箱に当たって消える。この動きは、弾を出す・飛ばす・当たった結果を処理する の3つに分けると作りやすくなります。
弾を出すのが Spawn Actor from Class、飛ばすのが Projectile Movement Component です。この記事では、左クリックで白い球を撃ち、的の箱へ20ダメージを与えるところまで作ります。外れた弾も、3秒後には消えるようにしましょう。

この記事でわかること
- 作るActorの種類と、生成する位置・向きの指定
- 弾の当たり判定と見た目、移動を担当する部品の分け方
- 左クリックで発射し、命中した箱のHPを減らす手順
- 生成できない場合の確認と、外れた弾の後始末
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(大きさ)をまとめたデータです。 弾なら「銃口の位置へ、撃つ方向を向けて、等倍で出す」という指定になります。

生成した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を設定するだけで、発射者に当たらなくなったり、スコアが加算されたりするわけではありません。 当たり判定や得点の処理は、別に作ります。

弾を飛ばす役割は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 Movement | Sphereを動かす |
Rootは、Actor全体の位置の基準になる部品 です。Projectile Movementは通常、このRootを移動対象にします。移動中の経路を調べるSweepでは、移動対象の当たり判定が使われるため、見た目だけの部品をRootにしないことが大切です。
見た目のMeshはSphereに付いて動きます。今回はMeshのCollisionを切り、球形のSphereで判定をまとめます。Projectile Movementは見た目を持たない移動用の部品なので、Sphereの下へ置く立体部品とは役割が違います。

実践の準備:白い球で箱を撃つ
Enhanced Input入門のBP_InputPracticeと、体力とダメージ入門のBP_Damageableを使います。プレイヤーは白い直方体、的はHP100の箱です。
平らな床の上面をZ=0とし、PlayerStartをLocation=(0, 0, 100)、Rotation=(0, 0, 0)へ置きます。同じGameModeからBP_InputPracticeを出し、WASDで動ける状態にしてください。今回は向きを固定した練習なので、左クリックす ると身体の前方である+X方向へ撃ちます。

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と名付けます。
- Sphere Collisionを追加し、DefaultSceneRootへドラッグしてRootにする。名前はSphere、Sphere Radiusは10、Scaleは(1, 1, 1)。
- Sphereの子へStatic Meshを追加し、名前をBodyにする。Engine/BasicShapesのSphereメッシュを指定する。見つからない場合は、アセット選択欄でエンジンコンテンツの表示をオ ンにする。
- Bodyの相対Location・Rotationは0、Scaleは(0.2, 0.2, 0.2)、Collision PresetsはNoCollisionにする。
- Projectile Movementを追加する。
標準Sphereメッシュの直径100cmを0.2倍にすると、直径20cmになります。半径10cmの当たり判定と、見た目の大きさを合わせた設定です。
SphereのMobilityはMovable、Simulate Physicsはオフにします。今回はProjectile Movementで飛ばします。Simulate Physicsをオンにすると物理シミュレーションが移動を担当するため、この練習の設定と混ぜません。
SphereのCollision PresetsをBlockAllDynamicからCustomへ変え、次の値にします。
| 項目 | 値 |
|---|---|
| Collision Enabled | Query Only |
| Object Type | WorldDynamic |
| 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 Scale | 0 |
| Should Bounce | オフ |
| Sweep Collision / Auto Activate | どちらもオン |
Sweep Collisionは、移動先だけでなく、そこへ進む経路で衝突を調べる設定です。弾が動き始めるよう、Auto Activateもオンにします。
Class Defaultsで Initial Life Spanを3 にします。Life Spanは寿命で、生成から3秒たつと弾を自動で破棄します。当たらずに飛び続けた弾が、レベルへ残り続けるのを防ぐためです。0は「寿命では自動破棄しない」という意味になります。
コンパイルして保存します。ここまでで、生成されれば前へ飛び、3秒後に消える弾の種類ができました。
発射する側:位置と向きを渡して生成する
次は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発出ます。

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で足します。

Spawn Transformピンを右クリックして「Split Struct Pin」を選ぶと、Location・Rotation・Scaleへ分けて接続できます。
| Spawnの入力 | 接続・値 |
|---|---|
| Spawn Transform Location | 上のAddの結果 |
| Spawn Transform Rotation | Get Actor Rotation(Target=self) |
| Spawn Transform Scale | (1, 1, 1) |
| Collision Handling Override | Do Not Spawn |
| Owner | Self |
| Instigator | Self |
ここでの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で飛び始めます。

コンパイルして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へつなぎます。相手の情報がある場合だけ、ダメージを渡す 分岐です。

2. 20ダメージを渡して弾を消す
BranchのTrueからApply Damageへつなぎ、次のように指定します。
| Apply Damageの入力 | 接続・値 |
|---|---|
| Damaged Actor | Break Hit ResultのHit Actor |
| Base Damage | 20 |
| Event Instigator | Get Instigator Controller(Target=self) |
| Damage Causer | Self |
ここでのSelfは 弾のBP_ProjectilePractice です。発射側のSelfとは、指しているActorが違います。
Get Instigator Controllerは、生成時にInstigatorへ渡したPawnを操作するControllerを取得します。Apply DamageのEvent InstigatorはPawnではなくControllerを受け取るため、このノードを間に挟みます。Damage Causerには、実際に当たった弾を渡します。

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

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

3. 的のHPと、外れた弾を確認する
Playして開始位置から撃ちます。球が的に当たって消え、的のHPが100→80→60と減るか確認します。ダメージが5回受け付けられると、HPが0になり的も消えます。
次はAやDで横へずれて撃ち、的に当たらなかった球が3秒後に消えるか見ます。直進して何にも当たらなければ、速さ1000cm/秒で3秒なので、生成位置から約30m進みます。寿命の確認には、その先まで障害物のない場所を使います。
生成できないときは、重なり方を確認する
「生成できません」が出る場合は、Classと生成位置を見直します。特に壁際では、生成する球の当たり判定が壁へ入り込んでいないか確認しましょう。

Collision Handling Overrideは、生成位置に衝突を遮る相手がある場合の扱いを選びます。
| 設定 | 位置がふさがっている場合 |
|---|---|
| Default | Class側の設定に従う |
| 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 Speed | 700 |
| Max Speed | 1000 |
| Projectile Gravity Scale | 1 |
| Should Bounce | オン |
| Bounciness | 0.6 |
| Friction | 0.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の結果に光る軌跡を描くこともできるので、見た目があるかどうかだけで決める必要はありません。

| 症状 | 確認するところ |
|---|---|
| 左クリックで何も起きない | 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 Class、Projectile Movement Component、初期速度と移動設定、Get Instigator Controller、Set Life Span、On Component Hit。