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

作成: 2026-07-20

UE5で実行中にアクターを出す方法を図解。Spawn Actor from Classの5つのピン、弾が出ない原因になるCollision Handling Override、Projectile Movement Componentの主要パラメータ、Life Spanでの後始末、そしてLine Traceとの使い分けまで。

敵に向かって弾を撃ちたい。倒した敵の場所にアイテムを落としたい。ボタンを押したら足元にトラップを置きたい。やりたいことは違いますが、必要な処理は共通しています。 実行中に、レベルへアクターを1つ増やす ことです。

UE5でこれを担当するのが Spawn Actor from Class です。さらに、出したアクターを「弾らしく」動かす Projectile Movement Component が標準で用意されています。この記事では、Spawn Actorの各ピンの意味、初心者が最初にぶつかる「弾が出ない」問題、Projectile Movementの主要パラメータ、そしてLine Traceとの使い分けを解説します。

キャラクターの前方に生成された弾が、曲線を描いて飛んでいく図

この記事でわかること

  • Spawn Actor from Class の5つのピンが何を決めているか
  • 「弾が出ない」の原因になる Collision Handling Override
  • OwnerInstigator を埋めておく意味
  • Projectile Movement Component で速度・重力・跳ね返りを決める
  • Initial Life Span で撃ちっぱなしの弾を掃除する
  • Line Trace と実体の弾、どちらを選ぶか
  • 実践: 弾を撃ち、当たった相手にダメージを与えて弾は消える

Sponsored

Spawn Actor from Classの5つのピン

Blueprintのグラフで右クリックし、 Spawn Actor from Class を追加します。 Class に何かを選ぶまでピンの一部は出てこないので、まず先にクラスを選んでください。

Spawn Actor from Classノードの各ピンに、Class・Spawn Transform・Collision Handling Override・Owner・Instigatorの役割を吹き出しで示した図
ピン決めていること
Classclass何を出すか
Spawn TransformTransformどこに、どの向きで、どの大きさで出すか
Collision Handling Overrideenum出そうとした場所に何かあったときどうするか
OwnerActorこのアクターの持ち主
InstigatorPawnこの行為の主体(誰が出したか)

戻り値の Return Value には、生成されたアクターの参照が入ります。ここで押さえておきたいのは、 生成に失敗すると Return Value が空になる ことです。生成直後に変数へ代入したり関数を呼んだりするなら、 Is Valid で確認してから使ってください。

Spawn Transformの作り方

Spawn TransformはTransform構造体なので、そのままでは位置だけを渡せません。方法は2つあります。

方法手順
Make Transform を使うMake Transform ノードを追加し、Location / Rotation / Scale を個別に繋いでSpawn Transformへ入れる
ピンを分解するSpawn Transformピンを右クリックし、 Split Struct Pin を選ぶ。ピンが3本に分かれる

慣れると Split Struct Pin のほうが速く、ノードも増えません。分解したピンは、右クリックの Recombine Struct Pin で元に戻せます。

位置は、Line Traceと同じ考え方で作ります。

生成位置 = 自分の位置 + (前方ベクトル × 距離)+ (0, 0, 高さ)

キャラクターの中心にそのまま出すと、生成した瞬間に自分自身へ当たります。 前方へ100〜150cm、高さを50cmほど足して、体の外側に出すのが基本形です。この計算の詳しい組み方はLine Traceの記事で扱っています。

回転は忘れがちですが、弾では極めて重要です。理由は次の節以降で分かります。

Sponsored

「弾が出ない」の犯人:Collision Handling Override

Spawn Actorを組んだのに何も出ない。この症状の多くは、このピンが原因です。

UEは、アクターを生成しようとした位置に すでに何かが重なっている 場合、どう振る舞うかを選べるようになっています。選択肢は5つです。

5つのCollision Handling Overrideの挙動を、重なった状態から「必ず出す」「ずらして出す」「出さない」の3系統で示した図
選択肢挙動
Default生成するアクターのクラス側の設定に従う
Always Spawn, Ignore Collisions重なっていても必ず生成する
Try To Adjust Location, But Always Spawn重ならない場所を探してずらす。見つからなくても生成する
Try To Adjust Location, Don't Spawn If Still Colliding重ならない場所を探し、それでも駄目なら生成しない
Do Not Spawn重なっていたら生成しない

既定は Default で、これは生成される側のクラスが持つ Spawn Collision Handling Method (Class Defaultsの Actor カテゴリ)に従うという意味です。 出ないときは、まずここを確認してください。

弾のように「絶対に出したい」ものは、Spawn Actor側で Always Spawn, Ignore Collisions を明示するのが確実です。逆に、敵のリスポーンやアイテムの配置では Try To Adjust Location, But Always Spawn が便利です。壁にめり込む位置を指定してしまっても、エンジンが少しずらして置いてくれます。

補足: 「必ず生成する」を選んでも、生成したアクターが壁の中に居ることに変わりはありません。物理シミュレーションを有効にしていれば、次のフレームで押し出されて吹き飛ぶことがあります。 生成できたかどうかと、生成した後に破綻しないかは別の問題 です。

OwnerとInstigatorを埋める意味

この2つは空のままでも生成できてしまうため、放置されがちです。ただ、後から効いてきます。

プレイヤーのControllerからキャラクター、キャラクターから弾へ矢印が伸び、OwnerとInstigatorがそれぞれどこを指すかを示した図
ピン指すもの弾の場合に渡すもの
OwnerActor所有関係の親撃ったキャラクター(Self
InstigatorPawn行為の主体撃ったキャラクター(Self

キャラクターから弾を撃つ場合は、どちらにも Self を渡して構いません。型が違うだけで、指しているものは同じです。

埋めておく実利は、 弾の側から撃った本人を辿れるようになる ことです。弾のBlueprintで Get Instigator を呼べば、撃ったPawnが返ります。 Get Instigator Controller なら、そのPawnを操作しているControllerが取れます。

これが要るのは、たとえば次の場面です。

  • スコアやキルログ : 誰が倒したかを記録する
  • 自分の弾で自分が死ぬのを防ぐ : 当たった相手がInstigatorと同じかを確認する
  • ダメージの責任者を渡す : Apply DamageEvent InstigatorController 型なので、 Get Instigator Controller の結果をそのまま繋げます

最後の項目が実務では一番効きます。Instigatorを空のままにすると、爆発で敵を倒してもスコアが誰にも入らない、という不具合になります。ダメージ側の詳しい仕組みは体力とダメージの記事を参照してください。

Sponsored

Projectile Movement Componentで飛ばす

アクターを出しただけでは、その場に立っているだけです。飛ばすのは Projectile Movement Component の仕事です。

Blueprintエディタの左上「Add」から Projectile Movement を追加します。このコンポーネントは、 同じアクターのルートコンポーネントを毎フレーム動かします 。自分で Set Actor Location を書く必要はありません。

主要なパラメータは5つです。

項目既定値意味
Initial Speed0.0発射時の速さ(cm/秒)
Max Speed0.0速さの上限。 0.0は「上限なし」
Projectile Gravity Scale1.0重力の効き具合。0.0で直進、1.0で通常の落下
Should Bounceオフ当たったときに跳ね返るか
Bounciness0.6跳ね返りの強さ(Should Bounceがオンのとき)
Initial SpeedとProjectile Gravity Scaleの組み合わせで軌道が直線・放物線・跳ね返りに変わることを示した比較図

Initial Speed が既定で 0.0 である点に注意してください。 「弾は出るのに動かない」の原因はほぼこれです。まっすぐ飛ぶ弾なら 3000.0 あたりが扱いやすい値です。

飛ぶ方向はアクターの回転が決める

Projectile Movementには「方向」の項目がありません。では何を見て飛ぶのかというと、 アクターのローカル +X 方向(前方) です。

つまり、Spawn Transformの Rotation にキャラクターの向きを渡さないと、弾は常にワールドの +X 方向へ飛びます。 「撃つたびに同じ方向へ飛んでいく」ときは、Rotationピンを繋ぎ忘れています。

キャラクターの向きに飛ばすなら Get Actor Rotation 、カメラで狙った方向に飛ばすなら Get Control Rotation を渡します。

用途別の設定

作りたいものInitial SpeedGravity ScaleShould Bounce
まっすぐ飛ぶ弾3000.00.0オフ
弓矢・投擲物1500.01.0オフ
手榴弾1200.01.0オン
ふわりと浮く魔法弾800.00.1オフ

同じコンポーネントで、数値を変えるだけでこれだけの動きが作り分けられます。ベースとなる BP_ProjectileBase を1つ作り、そこから子Blueprintを派生させて数値だけ変える形にすると管理が楽になります。

補足: 追尾する弾も作れます。 Is Homing Projectile をオンにし、 Homing Target Component に追いかける相手のコンポーネントを、 Homing Acceleration Magnitude に追尾の強さを入れます。強さを大きくしすぎると相手の周りを回り続けるので、小さめの値から試してください。

弾のActor構成とHitイベント

弾のBlueprintは、Actorを親クラスにして作ります。中身は3点セットです。

コンポーネント役割設定のポイント
Sphere Collision(ルート)当たり判定Simulation Generates Hit Events をオン
Static Mesh見た目Collision Presets を NoCollision にする
Projectile Movement動きInitial Speed と Gravity Scale を設定
Sphere Collisionをルートに、見た目のStatic MeshとProjectile Movementをぶ�ら下げた弾のコンポーネント構成図

ここで重要なのが 見た目のStatic Meshからコリジョンを外す ことです。外さないと、球のコリジョンとメッシュのコリジョンが二重に当たり、Hitイベントが2回走ります。 当たり判定は1つのコンポーネントに任せる のが原則です。

弾のコリジョン形状は 必ずSimple(単純形状)にしてください。 高速で動く小さな物にComplex Collisionを使うと、負荷が跳ね上がります。この違いはSimple/Complexコリジョンの記事で詳しく扱っています。

当たったことを受け取る

Sphere Collisionを選択した状態で、詳細パネル下部のイベント一覧から On Component Hit を追加します。当たった瞬間に呼ばれ、次の情報が取れます。

ピン内容
Other Actor当たった相手のアクター
Hit当たった位置や面の向きを含むHit Result
Normal Impulseぶつかった勢い

Other Actor にダメージを送り、エフェクトを出し、最後に Destroy Actor で自分を消す。これが弾の基本の流れです。

注意: Hitイベントは、 相手側のコリジョン設定が Block になっている場合にだけ 発生します。相手が Overlap の設定なら、Hitではなく On Component Begin Overlap を使ってください。「当たっているように見えるのにイベントが呼ばれない」ときは、両者のコリジョンプリセットを確認します(→ コリジョンプロファイルの記事)。

Life Spanで撃ちっぱなしを掃除する

空に向かって撃った弾は、何にも当たりません。 Destroy Actor が呼ばれないので、 飛び続けたまま永久に残ります。 連射するゲームなら、数分でアクターが数千個になります。

対策は1行です。弾のBlueprintで Class Defaults を開き、Actorカテゴリの Initial Life Span に値を入れます。

挙動
0.0(既定)自動では消えない
3.0生成から3秒後に自動でDestroyされる

速さ3000cm/秒の弾なら、3秒で90m飛びます。屋内のゲームなら1〜2秒でも十分です。 「消える処理を書き忘れる」ではなく「最初から時間で消える」形にしておく と、後から探しにくい負荷の原因を1つ潰せます。

実行中に変えたい場合は Set Life Span ノードで同じことができます。当たった瞬間に消さず、破片が転がるのを0.5秒見せてから消す、といった使い方に向いています。

Line Traceと実体の弾、どちらを使うか

同じ「撃つ」でも、UEには2つのやり方があります。

左は線が一瞬で相手に届くLine Trace、右は実体の弾が時間をかけて飛ぶProjectileを対比した図
Line Trace(ヒットスキャン)実体の弾(Projectile)
当たるタイミングその瞬間飛んでいって届いたとき
飛行中の見た目無い(自分で描く)ある
避けられるか避けられない避けられる
放物線・跳ね返り作りにくい得意
負荷軽いアクターが増えるぶん重い

判断の軸は1つです。 飛んでいる途中を見せたいかどうか。

  • Line Traceが向くもの : 現代銃、レーザー、遠距離のスナイパー、視線判定
  • 実体の弾が向くもの : 弓矢、手榴弾、魔法弾、ロケットランチャー、避けゲーの弾幕

多くのゲームは両方を使います。プレイヤーの銃はLine Trace、ボスの攻撃は避けられる実体の弾、という組み合わせが典型的です。 弾速の遅い攻撃は、プレイヤーに「避ける」という選択肢を渡します。 見た目の話だけでなく、ゲームの手触りが変わる選択です。

Line Trace側の作り方はLine Traceの記事にまとめています。

Sponsored

実践:弾を撃って敵を倒す

2Dシューティングの自機弾、TPSのハンドガン、見下ろしARPGの魔法弾。 撃つ → 飛ぶ → 当たる → 相手のHPが減る → 弾が消える という一連は、ジャンルを問わず同じ骨組みで作れます。ここではその全部を最後まで組みます。

完成形

E キーを押すと、キャラクターの前方から白い球が飛び出し、まっすぐ進んでCubeに当たります。当たった瞬間に球は消え、CubeのHPが100から20減ります。5発当てるとCubeが消えます。

キャラクターが撃った球が前方へ飛び、Cubeに当たって消え、HP表示が80に変わる様子を示した図

再現条件

Third Person テンプレート (Blueprint)で新規プロジェクトを作り、次の3つを用意します。

1. 的(BP_Damageable

Actorを親クラスにBlueprintを作り、StaticMesh コンポーネントに Cube を割り当てます。詳細は体力とダメージの記事と同じものです。

変数名初期値
CurrentHealthFloat100.0

Event AnyDamageCurrentHealth から Damage を引き、 Print String で値を出し、0以下なら Destroy Actor を呼ぶだけの内容です。StaticMeshの Collision Presets は BlockAll にしてください。 弾は Block する相手にしかHitを起こしません。

配置は、キャラクターの 正面600cm以内、かつ腰の高さ にしてください。床に直接置くと、弾が上を通り抜けます。

2. 弾(BP_Projectile

Actorを親クラスに新しいBlueprintを作り、次の構成にします。

コンポーネント設定
Sphere Collision(ルート)Sphere Radius 16.0 / Collision Presets BlockAllDynamicSimulation Generates Hit Events オン
Static Mesh(Sphereの子)Static Mesh に Shape_Sphere / Scale 0.3 / Collision Presets NoCollision
Projectile MovementInitial Speed 3000.0 / Max Speed 3000.0 / Projectile Gravity Scale 0.0

Class Defaults の Initial Life Span3.0 にします。

Sphere Collisionをルートにするには、コンポーネントを追加したあとで DefaultSceneRoot の上へドラッグ します。Static Meshは、そのSphereの上へドラッグして子にします。

3. 撃つ側

BP_ThirdPersonCharacter を開きます。入力は動作確認を優先して E キーの直接入力(グラフで右クリック →「Keyboard Events > E」)で組みます。Enhanced Inputで組む場合はEnhanced Inputの記事を参照してください。

弾のグラフ

BP_Projectile のイベントグラフに、当たったときの処理を組みます。

On Component Hitから Branch・Apply Damage・Destroy Actorへつながるノードグラフ全体図
On Component Hit (Sphere)
  ├ Other Actor ─→ Is Valid ─→ Branch
  │
  → Branch (True)
      → Apply Damage
            Damaged Actor    : Other Actor
            Base Damage      : 20.0
            Event Instigator : Get Instigator Controller
            Damage Causer    : Self
      → Destroy Actor (Target: Self)
  → Branch (False)
      → Destroy Actor (Target: Self)

Get Instigator Controller は、Spawn ActorのInstigatorピンに Self を渡していれば、撃ったプレイヤーのControllerを返します。ここが空だと、誰が倒したのか分からなくなります。

Falseの側でもDestroyしているのは、床や壁に当たったときも弾を消すためです。

撃つ側のグラフ

BP_ThirdPersonCharacter のイベントグラフに、次を組みます。

E (Pressed)
  → Spawn Actor from Class
        Class                       : BP_Projectile
        Spawn Transform(Split Struct Pin で分解)
          Location : Get Actor Location
                     + (Get Actor Forward Vector × 150.0)
                     + (0, 0, 50)
          Rotation : Get Actor Rotation
          Scale    : (1, 1, 1)
        Collision Handling Override : Always Spawn, Ignore Collisions
        Owner                       : Self
        Instigator                  : Self

組む順番は次のとおりです。

  1. グラフの空白を右クリックし、 E と入力して Keyboard Events > E を追加する
  2. Spawn Actor from Class を追加し、 Class に BP_Projectile を選ぶ 。ここを先に選ばないと他のピンが出てきません
  3. Spawn Transform ピンを右クリックし、Split Struct Pin を選ぶ
  4. Get Actor LocationGet Actor Forward VectorMultiply(Vector × Float、Bに 150.0)・ Add(Vector + Vector)を並べ、Locationへ繋ぐ
  5. 高さを足すため、もう1つ Add を挟み、Bに Make Vector(X 0 / Y 0 / Z 50)を繋ぐ
  6. Get Actor Rotation を Rotation へ繋ぐ
  7. Collision Handling OverrideAlways Spawn, Ignore Collisions にする
  8. Owner と Instigator に Self を繋ぐ

確認する

Playして、Cubeの正面に立って E を押してください。

キャラクターの少し前から白い小さな球が現れ、まっすぐ水平に飛び、Cubeに当たった瞬間に消えます。同時に画面左上へ 80.0 と表示されれば成功です。 5回当てると 80 → 60 → 40 → 20 → 0 と並び、5発目でCubeが消えます。何もない方向へ撃つと、球は3秒間飛んでから静かに消えます。

  • 何も出ないCollision Handling OverrideDefault のまま、かつ生成位置がキャラクターと重なっている。前方150cmのオフセットも確認する
  • 球は出るがその場に止まるInitial Speed が既定の 0.0 のまま
  • 撃つたびに同じ方向へ飛ぶ → Spawn Transform の RotationGet Actor Rotation を繋いでいない
  • 撃った瞬間に消える → 生成位置が自分の体の中。オフセットを 200.0 に増やす
  • 球が床に落ちるProjectile Gravity Scale1.0 のまま
  • 当たっても何も起きない → Sphere Collision の Simulation Generates Hit Events がオフ。または的の Collision Presets が Block になっていない
  • 1発でHPが40減る → 見た目のStatic Meshにコリジョンが残っていて、Hitが2回走っている

ここで Projectile Gravity Scale を 1.0 に、Initial Speed を 1200.0 に変えて みてください。同じBlueprintのまま、弾が放物線を描く投擲物になります。さらに Should Bounce をオンにすれば手榴弾です。 弾の性格は、コンポーネントの数値だけで決まっています。

ポイントは2つです。

  • 飛ぶ向きは Spawn Transform の Rotation が決める: Projectile Movementはアクターのローカル +X 方向へ進むだけです。狙った方向へ飛ばす責任は、生成する側にあります。カメラで狙うゲームなら Get Control Rotation に差し替えるだけで済みます
  • 消す責任は弾自身に持たせる: Initial Life Span を最初に設定しておけば、当たらなかった弾を撃った側が気にする必要はありません。撃つ側と弾の役割を分けておくと、武器を増やしても後始末のコードが増えません

当たったときの火花や爆発はNiagaraの記事へ続きます。 On Component HitDestroy Actor の直前に1ノード足すだけで繋がります。

Sponsored

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

  • Expose on Spawnで初期値を渡せる: 弾のBlueprintで変数を作り、詳細パネルの Expose on Spawn にチェックを入れると、Spawn Actorノードにその変数の入力ピンが生えます。ダメージ量や色を弾ごとに変えたいときは、生成した後に Set するのではなくこの方法を使ってください。 生成直後の Event BeginPlay より前に値が入る ため、BeginPlayの中でその値を使えます
  • 速い弾はすり抜けることがある: 1フレームで進む距離が壁の厚みを超えると、通り抜けます。Projectile Movementはスイープ移動なので基本的には防げますが、極端に速い弾では Sweep の設定や、Line Traceとの併用を検討してください
  • 大量に撃つなら生成と破棄が負荷になる: 弾幕シューティングのように毎フレーム何十発も出す場合、生成と破棄そのものが重くなります。作ったものを使い回す設計に切り替える判断は、まず計測してからにしてください(→ 計測の記事
  • Spawn Actorは弾だけのものではない: アイテムのドロップ、敵のリスポーン、設置型のトラップ、破壊時の破片。 「実行中に増える物」はすべて同じノードで出します 。弾で覚えた形がそのまま使い回せます
  • 生成したアクターを配列で持っておくと管理が楽: 出した弾やアイテムをまとめて消したい、数を制限したい、という要求は後から必ず出てきます。Return Valueを配列に追加しておくと対応できます(→ 配列とMapの記事
  • Rotation Follows Velocityで見た目が整う: Projectile Movementの Rotation Follows Velocity をオンにすると、アクターの向きが進行方向へ自動で合います。矢やミサイルのように 細長い見た目の弾 では、これをオンにしないと横を向いたまま飛びます

まとめ

  • 実行中にアクターを増やすのは Spawn Actor from Class 。Spawn Transformは Split Struct Pin で分解すると扱いやすい
  • 「出ない」の犯人は Collision Handling Override 。確実に出すなら Always Spawn, Ignore Collisions
  • Owner と Instigator に Self を渡す 。弾の側から撃った本人を辿れるようになる
  • Projectile Movement の Initial Speed は既定 0.0 。動かないのはほぼこれ
  • 飛ぶ方向は アクターのローカル +X 。Spawn TransformのRotationが実質の照準
  • Initial Life Span を設定して、当たらなかった弾を自動で掃除する
  • 一瞬で当てるなら Line Trace 、飛行中を見せたいなら 実体の弾

いま作っているゲームで、プレイヤーが撃つ攻撃は「避けられるべき」ものでしょうか。その答えが、Line Traceと実体の弾のどちらを選ぶかを決めてくれます。