|
執筆バージョン: Unreal Engine 5.6
|
こんにちは!
今日さまざまなゲームが登場しています。
筆者は特にアクションゲームを好みますが、中でも「時を操る」をコンセプトにしたアクションやキャラクターが大好きです。
ということで今回は、スプラインを使用して数秒前の位置に戻るスキルを作成していきます。

①なにを作る?
まずはざっくり仕様を考えます
- Eキーを押してスキルを準備
- もう一度Eキーを押すとスキル発動して時を戻す
- 初期地点に戻るとき、移動した道筋をなぞる
- 5秒経ったら強制発動
②どう作る?
今回はSplineを用いてスキルを作成します
- スキル待機中は○○秒ごとに、プレイヤーの現在地にSplinePointを打つ
- スキル発動時は××秒ごとにSplinePointのIndex[X]の地点からIndex[X-1]に戻る、を繰り返す
- SplinePointのIndex[0]の地点に戻ったらスキル終了
③実際に作ってみる
まずはFirstPersonのテンプレートを選択します

プロジェクトが開けたら、
All>Game>FirstPerson>Blueprints 内の、BP_FirstPersonCharacterを開きます。

CompornentsウィンドウでAddを押し、Splineを追加します。
今回は名前を「SkillSpline」としました

次に変数を作成します

| NowSetting |
Boolean型 |
スキル準備中ならTrue |
| NowUsing |
Boolean型 |
スキル発動中ならTrue |
| MaxSkillTime |
Float型 |
スキルの準備時間の最大秒数
今回は5秒 |
| TimeToAddKey |
Float型 |
1つのスプラインポイントを打つ間隔
今回は0.1秒 |
| MoveTimeToKey |
Float型 |
1つのスプラインポイントへ移動する間隔
今回は0.02秒 |
| ToSplineNum |
Integer型 |
スプラインポイントのIndexを保存する |
次に、ブループリントを書いていきます
Keyboard EventsでEキーを押したときにイベントが発火され、スキルを準備または発動するようにします。
カスタムイベントを2つ作成し、スキルの発動準備が整っているか否かで分岐させます

Set Skill Eventを作成していきます
NowSettingをTrueにセットし、スプラインポイントをClearSplinePointノードで削除して初期化します

【Set Timer by Event】ノードを作成し、プレイヤーの現在の地点にスプラインポイントを作成するカスタムイベント「AddSplinePointEvent」につなげます。
Loopingにチェックを入れ、Timeに「Time to Add Key」(0.1)を参照します。
こうすることで、停止させるまで「AddSplinePointEvent」イベントが0.1秒ごとにイベントが呼び出されます。
また、これに続けて別のSet Timer by Eventノードをつなげます。
こちらは「MaxSkillTime」(5.0)秒に1度だけ、スキルを強制発動させるカスタムイベント「StopTimer」起動します。

AddSplinePointEventイベント
※【Clear and Invalidate Timer by Handle】ノードにSet Timer by Eventの戻り値を参照すると、タイマーを止めることができます。

StopTimerイベント

続いて実際にスプラインポイントを逆行するカスタムイベントUse Skill Eventを作成していきます
【Get Number of Spline Points】ノードで、スキル準備中に作成されたスプラインポイントの総数を調べ、「To Spline Num」に保存しておきます

こちらでもSet Timer by Eventノードを使用します。
「Move Time To Key」(0.02)秒ごとにSkillイベントを回します

スプラインポイントの地点にプレイヤーを移動させ、その後ポイントのインデックスを-1します

「To Spline Num」が0以下になったらSet Timer by Eventのタイマーを止めます

完成!

おまけ
スキル発動中に「戻ってるよ!」的な演出が欲しいと思いました
まず、過去の記事を漁って、ちょうどいい感じのポストを作ります
https://historia.co.jp/archives/27973/

次に、記事の通りにPostProcessVolumeを配置して、Skillイベントの開始と終了の間に表示されるようにします。
↓ポストを置く

↓ポストを見えるようにする


本当の完成!
