はじめに
前回に引き続き猫でも分かるシリーズを見ることに
今回はSpawnとの事。全くイメージできない英単語が出てきました。
ひたすら勉強させてもらいます!
参照元
猫でも分かる UE4を使ったゲーム開発 超初級編 #4 :Spawn ノードを使って色んなものを出してみよう!
www.youtube.com
講座の流れ
- UE4のSpawn機能について
- 前回作成した拾えるコインのBPに演出を付けていよう!
- Spawnノードを使って弾を出してみよう
UE4のSpawn機能について
- もとの意味は産卵するなどの意味だった模様
- ゲームではキャラクタが出現することに使われている
- キャラクタが出現することをリスポーンと言う
- 確かに聞いたことありますね
- キャラクタが出現することをリスポーンと言う
- Spawnで表現できること
- 魔法、爆発、ドラゴンが吐く炎、雨や波など
- UE4でSpawnするノード
- Spawn Emitter
- Spawn System
- Spawn Sound 音を再生する
- SE 衝突音や効果音などに使用できる
- Spawn Actor BluePrintを動的にレベル上に出すことができる
- 今回の実装内容 コインを拾ったら
- 音を鳴らす
- エフェクトが出てくるようにする
- なにかのアクションに対するリアクションはとても重要なのでこの議題を選びましたという説明
SEなどは機能別サンプルのものを使うとのこと
SEとエフェクトを取得
- 手に入れていなかったので赤枠のところが無料となっていたのをクリックした図
- そのままプロジェクトを作成するを押す
- 保存先を設定してクリエイトする
- 結構サイズが大きく時間がかかる模様。少し待つことに。
- ダウンロード完了。開くにも少し時間がかかったが終了。
- まず持ってくる音を見つける為にフィルターする。
- この中より今回は Text_Popを使うことに
- 右クリック→アセットアクション→移行をクリック
- コピー対象が表示される
- 今回はSE一つの為、コピーされるものは一つ
- しかし複雑なものとなると複数表示されるとの事
- 移したいプロジェクトの中のcontentsフォルダを指定
- 続けて効果を取得するためパーティクルでフィルタ
- 現在(2020/6月)UE4には2つの効果がある
- パーティクルにあるのは昔からあるカスケードという仕組みで作成したもの
- ナイアガラという仕組みで作ったものはFXでフィルタすると確認できるとの事
- ナイアガラのほうがより複雑な表現が可能
- 今回はシンプルなカスケードを使用するとの事
- MapsのEffectsを開くと効果が実際見れるマップが開ける。そこでプレイして気に入るものを見つける
- 今回はSpark burstという効果を使うという事で、マップ上より選択して更に虫眼鏡マークを押すことでコンテンツブラウザ内の該当ファイルが選択される
- 今回はSpark burstという効果を使うという事で、マップ上より選択して更に虫眼鏡マークを押すことでコンテンツブラウザ内の該当ファイルが選択される
- SEの時同様に右クリック→アセットアクション→移行をクリック
- 自分のプロジェクトを開くと2つともインポートされていた
前回作成した拾えるコインのBPに演出を付けていよう!
前回行った DestroyActor でコインを消す効果に付け足して行くとのこと
動画ではなにかの修正のたびにコンパイルしているため私も行っていますが、手順には書いていません。これを参考にする方は高頻度でコンパイルもしてください。
- BP_Coinのブループリントを開く
- spawn sounds 2d を配置して間に接続する
- 鳴らしたい音を選択
- これでプレイするとコインが消えると同時に音がなるようになっている
- Spawn Emitter at locationを配置し間に接続。アセットを選択して Spark burstを設定
- 設定してプレイしてもエフェクトは表示されない
- その理由は位置を指定していないため
- エフェクトはサウンドと違い位置を指定する必要がある
- Get Actor Locationを配置し接続する
- 効果も表示されるようになった
- 完
Spawnノードを使って弾を出してみよう
既存のものを開いてみる
弾を出すものはツインスティックシューターという名前ですでにテンプレートにあるとの事。
- コンテンツブラウザより新規追加、機能またはコンテンツパックを追加を押す
- ツインスティックシューターを選択肢、プロジェクトに追加を押す
- 追加された
- 追加された
- 開いて見るため mapsの中のTwinStickExampleをダブルクリックして開く
- プレイしてみると遊べる事がわかる
- TwinStickProjectileに弾のロジックが入っているようなのでブループリントを開く
- ノード数が少なく実装できている印象
- ノード数が少なく実装できている印象
1から実装する 1. 弾作成
- 今回はレベル上に配置された対応のようなオブジェクトが一定間隔で弾を出すギミックを作成するとの事
- 弾のアクターを作成するため新規ブループリントを作成する
- Actorを選択し、名前はBP_Bulletとする
- ダブルクリックしてブループリントを開く
- コンポーネントを追加して球モデルを選択
- スケールを調整して弾っぽくする
- 弾をレベル上に配置する
- 今のままだとただ止まっているアクタ
- UE4には一直線に飛ばすための機能がありそれを追加する
- BP_Bulletのブループリントより Projetile Movementコンポーネントを追加
- 速度を設定
- これでプレイすると弧を描いて落ちていく
- デフォルトで重力が効いている為との事
- Gravity などで検索すると Gravity Scale という項目が出てくるので0にする
- Scaleした際に Y flont Z up 基準で作成していたため、X flontに修正
- Y方向に伸びる楕円となっていたため、X方向に伸びる楕円に修正
- 進む方向に自動で回転するように Rotation Follows Velocity にチェック
- 速度を修正
- 弾が完成
1から実装する 2. 障害物にあたった弾は跳ね返らせる
- Box Collisionを配置
- SceneRootコンポーネントへドラッグする
- 結果
- 見た目の部分などはBox Collisionの子においていく事がおすすめとのこと
- 結果
- シェイプを修正してある程度弾と同じ大きさにする
- BlockAllDynamicにチェックを入れる
- Should Bounce にチェックを入れる
- 完成
- しかし大砲っぽくないためShould Bounceのチェックを外し以降の作業を行う
1から実装する 3. 大砲をつくる
- 新規ブループリント(Actor)を作成し、BP_Cannonという名前にする
- コンポーネント追加よりStaticMeshを追加
- StaticMeshより大砲っぽく見えるものを追加
- レベルに配置
- 大砲のサイズが大きかったため 0.67程度にスケールしている
- スケール変更後は ブループリントを編集→インスタンスの変更をブループリントに適用
1から実装する 4. 大砲から弾を出す
- 一定間隔で何かを実行する方法
- いくつか方法が考えられる
- set timer eventを使う
- tickを使う ←今回採用する方法
- いくつか方法が考えられる
- クラスからアクタをスポーンしますを追加する
- なぜこれは関数名ではないんだろう??
- Classにスポーンしたいアセットの名前を指定。今回は BP_Bullet
- 位置と向きを指定するため Spawn Transform 上で右クリックして構造体品を分割をクリック
- 大砲の位置を設定する為に GetActorLocation を配置し接続
- ここで試しにプレイをしてみても出てこない
- 原因はGetActorLocationで返される位置
- 赤丸の部分がGetActorLocationが返す部分でありSpawnしようとする部分
- ここにはすでに大砲が存在している為、コリジョン同士が衝突しあっていて、その場合は生成しないという設定になっているとの事
- その設定が Collision Handling Override設定との事
- default となっていると重なっていると生成しないという設定
- その為、球を出す場所をずらす必要がある
- 大砲からのオフセットを設定するのに便利なのが Arrow コンポーネントとの事で追加する事に
- おそらく矢印が見えている為視覚的に配置するのに便利という事かな
- これはBlenderで言うところのemptyみたいなイメージなのですんなりと受け入れられる
- Arrow コンポーネントを追加
- ビューポートよりArrowの位置を大砲の発射口に見立てた部分から少し離して配置
- 後はこのArrowの位置を SpawnActorノードに渡せば良いとのこと
- Arrowをイベントグラフへドラッグして配置
- GetWorldLocationを配置し接続
- このノードはレベル内のArrowの絶対位置を取得する模様
- SawnActorに接続
- これでプレイすると弾は出るのもの発射口で停止している
- 原因はTickだとものすごい勢いで弾が生成され衝突する為停止するとの事
- 確認の為一時的に BP_Bulletのコリジョンを Overlapに設定
- すごい勢いで弾が発射しているのが確認できた
- 現在大砲から出る弾は大砲の正面から見て右側に出るようになっている
- 向きがおかしいためまず向きを修正
- GetWorldRotationを配置し Arrowと接続。SpawnActorに接続
- 弾の発射向きは正しくなった
- 弾の発射頻度を落とす
- BP_Cannon(一番上)を選択しTick intervalを設定することでTickが呼ばれる頻度を変更できるとの事
- 数値は秒単位。1とすると1秒毎にTickが呼ばれるようになる
- 音を入れる。今回は音を自前で用意したものを使用する方法
- 講座同様に効果音ラボでダウンロードする事に
soundeffect-lab.info - 今回ダウンロードしたサイトは mp3形式で配布しているが UE4はmp3未対応
- wav に変換する必要があるとの事。講座ではすでに変換済みファイルを持っていた
- とりあえず検索して一番上に来た下記サイトを使いwavに変換
online-audio-converter.com
- wavファイルをコンテンツブラウザにドラッグ&ドロップ
- ダウンロードした音源のボリュームが大きいため小さく設定するため、音源をダブルクリック→出てきたウィンドウのVolumeを0.2とし保存
- Spawn Sound at Location を配置しSoundにダウンロードした音源を設定後接続
- 音もなるようになった。別の方法もあり、現状は大砲側で音を鳴らしているが、弾側でBeginPlayイベント時に音を鳴らしても同じとのこと。
- おそらく責務を分割させ一極集中しないという原理からすれば弾側につけるのが好ましいと思われる
- ということで付け替えることに
- 音もなるようになった。別の方法もあり、現状は大砲側で音を鳴らしているが、弾側でBeginPlayイベント時に音を鳴らしても同じとのこと。
- 対応側のSpawnSoundを削除、BP_Bullet側の BeginPlayに設定
- 完了
おまけ
主に視聴している方からの回答や追加で行っていたことをまとめます
弾に演出を加える
- BP_BulletにParticle System コンポーネントを追加
- 機能別サンプルから P_Trail_Traceエフェクトを移行する
- ParticleSystemのテンプレートから P_Trail_Traceを選択する
- 完了
被弾時の音を設定する
- BP_Bullet にある Box Collisionを右クリックからAdd Eventで Begin Overlapイベントを追加
- Spawn Sound 2dを追加し、被弾時に鳴らす音を選択、接続する
- ついでに弾を消すという意味を込めてDestroy Actorを配置し接続
- BP_BulletのSphereは No Collisionに設定
- 完了
雨のように広範囲に弾丸を降らせる
- 新規BluePrint → Actorを作成。名前を BP_BulletsRain とする
- BP_BulletsRainのブループリントを開く
- Arrowコンポーネントを追加。下を向くようにする
- Box Collision を追加。このボックス内の座標から雨を降らせるため、シェイプを調整し広範囲にする。
- Box をNo collisionにする
- Box をイベントグラフにドラッグする
- Boxからランダムな位置を得るため Random Point in Bounding Boxを配置し接続
- 中心情報が必要なため、Box の World Locationを取得し接続
- 拡張範囲の情報が必要なため、Boxから Box Extent を取得し接続
- クラスからアクタをスポーンしますを追加する
- Transform を右クリック→構造体ピンを分割させる
- 接続、クラス名にも BP_Bulletを指定する
- 回転を得るためArrowをイベントグラフにドラッグ
- GetWorldRotationを接続し、SpawnのRotationに接続
- レベルに配置
- 完了
弾の軌跡を曲げる
- velocityという速さのパラメータを調整する
- BP_Bullet の ProjectileMovement をイベントグラフへドラッグ
- Velocityを得るため Get Velocity を配置
- 加算するためのノードを追加、yに10を入力
- ProjectileMovementをコピー、Set Velocityを配置しそれと接続
- 上記のノードにTickとVelocityを計算した結果を接続
- 完了
ホーミングする
- CannonからThirpersonの情報を参照する必要がある
- BP_Cannonのブループリントを開き変数を追加する
- 変数の型を Third Person Characterにする
- 変数名はChracterとする
- 目玉のアイコンを有効にしてレベルエディタから参照できるようにする
- レベルでCannonを選択して、CharacterにThirdperson Characterを選択する
- BP_Bulletにも同様にThirdPerson Character型のCharaterという名前(Cannonと同じ)の変数を追加
- 目のアイコンを開いた状態で、スポーン時に公開のチェックを入れる
- BP_CannonのイベントグラフのSpawnActorにCharacterが追加される
- これにより Cannon がBulletをSpawnするときにBulletにCharacter情報を渡せるとの事
- BP_CannonのイベントグラフのSpawnActorにCharacterが追加される
- BP_CannonのイベントグラフにCharacterをドラッグ、Getして取得したCharacterを出現したピンに接続する
- Bullet側にCharacterの位置情報を教えている
- BP_Bulletのブループリントで ProjectileMovementのホーミングにチェックを入れ、速度を入力する
- 誰をホーミングするかを設定する為に、ProjectileMovementを配置しSet Homing Target Componentを配置し接続
- Spawnしたときに音を鳴らした後のピンからSet Homing Target componentへ接続
- Character を配置とGet Meshノードを配置し接続し、Homing Target Componentへ接続
- 完了
- スケルタルメッシュの原点を狙うため足元を狙ってくる
弾に寿命を設定する
- Initial Life Spanを設定する
- 0.0 は生き続ける
- 0.0より大きな数字(秒単位)を設定できる
寿命が尽きたときのエフェクトを追加する
- End Play イベントを追加
- Spawn Emitter at Locationを追加
- Get Actor Location を追加
- 接続。Emitter Template は自分好みの効果を設定
- 完了
最後に
- サンプルプロジェクトからのSEや効果の取得方法を学習
- 音や効果を挟む方法を学習
- Spawnの仕組みを学習
すごく簡単につくれる上に、SEや効果などは予めかなり使えるのでかなりお膳立てシてくれている感が嬉しい限りです。
メモ
- サンプルの効果を手軽に確認するには機能別サンプルのmapsのEffectsを開くと確認できる
- 音関係のSpawnは結構ある
- 鳴らす位置が重要な場合は2つを使用する
- 位置も関係なく鳴らす場合は Spawn soundsがおすすめとのこと
- 効果関係のSpawnの違い
- カスケードで作っているものは Spawn Emitter at Locationを使う
- ナイアガラで作っているものはSpawn System at Locationを使う
- ブループリント編集→インスタンス変更をブループリントに適用はBlenderで言う所のApplyに似ている部分があり、0,0,0から横に移動させたものを適用すると0,0,0がアクタの中心となり中心から移動した分だけずれたところに実体があるかのようになる。
- なので「インスタンス変更をブループリントに適用」はスケールのみと考えたほうがいいかもしれない
- Collision Handling Override 設定について
- Default 生成場所にコリジョンがある場合は生成しない
- Default 生成場所にコリジョンがある場合は生成しない
- GetRelativeLocation 親から見た子供の位置を取得する
- プレイについて。Alt-Sでシュミレーション。今見えている場所からレベルがプレイされる
- ProjetileMovementについて
- Projetile は弾丸という意味らしい
- Projetile Movement は弾丸運動だろうか
- ホーミング機能もある
- ホーミングについて
- アクター単位ではなくてコンポーネント単位で設定をする
- 個々はまだよくわかっていない
- アクター単位ではなくてコンポーネント単位で設定をする