フォートナイトクリエイティブで、初の島を公開しました。
フォートナイトの銃のリロードをもっといろいろなアングルで眺めたいなぁ、という気持ちで作ったものです。
分らないことだらけで、できあがったものは簡単そうに見えるのに、実際の制作時間はえらく時間がかかりました。
目次
I Love Reload
下記の島コードでプレイすることができます。
島コード: 9683-5544-3032
I Love Reload 2.0 [2023/10/01 公開]
初期バージョンは一人用として作っていましたが、最大4人までプレイできる複数人用にアップデートしました。
バージョン管理せずに作っていたので、メモ代わりとしてどういう風に作ったかここに記載しておきます。
島の設定
UEFN の島設定は下記のものです。
- 最大プレイヤーを4人に設定
- チームサイズを1人に設定(1人で1チーム)
- チームインデックスを4に設定
仕掛けの設定
UEFN で下記の仕掛けを用意しました。
- キャプチャーエリアの仕掛け
※リロード鑑賞用の場所に1つ設置
※カメラアングルを変更するトリガーとして使用します - ムービーシーケンスの仕掛けを4つ
※プレイヤーの人数分を用意
※カメラアングルを変更するシーケンスを各ムービーシーケンスの仕掛けに紐づけておきます - HUD制御の仕掛けを4つ
※プレイヤーの人数分を用意
※カメラアングルを変更している間は画面上のHUDを非表示にしたいので、色々なHUDを表示しないように設定しておきます
キャプチャーエリアの仕掛け
- サイズなどいい感じに設定しておきます
ムービーシーケンスの仕掛け
- ループ再生をONに設定
※ムービーシーケンスの仕掛けを再生中は、シーケンスで設定したカメラアングルを維持します - オートプレイはOFFに設定
※再生のタイミングはこちらで制御します - 視認性は「発信者のチーム」に設定
※島設定で1チームに1人としているので、実質プレイヤー1人だけが対象になります
HUD制御の仕掛け
- 「影響を受けるチーム」を「チームインデックス」に設定
※チームインデックスの値は、HUD制御の仕掛けを4つにそれぞれ1~4を設定しておきます
Verse で制御していること
やっていることは下記のことです。
- キャプチャーエリアに入ったプレイヤーのみ、HUDを非表示にする
- キャプチャーエリアに入ったプレイヤーのみ、ムービーシーケンスを再生してプレイヤーの視点をシネマティックカメラからの視点にする
- キャプチャーエリアから出たプレイヤーのHUDを表示する
- キャプチャーエリアから出たプレイヤーのムービーシーケンスを停止して視点を通常に戻す
Verse のコード
コードを見たら、大体なにをやっているかはわかると思います。
using { /Fortnite.com/UI }
using { /Fortnite.com/Game }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Playspaces }
using { /Fortnite.com/Teams }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/UI }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
# See https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse for how to create a verse device.
# A Verse-authored creative device that can be placed in a level
player_camera_device := class(creative_device):
# ムービーシーケンスの仕掛け
# NOTE: 複数プレイヤーがいる場合、各プレイヤーそれぞれでムービーを再生するため、人数分の仕掛けを配列として受け取る
@editable
var SequenceDeviceAry:[]cinematic_sequence_device = array{}
# キャプチャーエリアデバイスの仕掛け
@editable
CaptureAreaDevice : capture_area_device = capture_area_device{}
# HUD制御の仕掛け
# NOTE: 複数プレイヤーがいる場合、各プレイヤーそれぞれでHUDを非表示にしたいため、人数分の仕掛けを配列として受け取る
@editable
HudControllerDeviceAry: []hud_controller_device = array{}
# 初期化
InitFunc() : void =
# 初期表示では、すべてのHUD制御の仕掛け(HUDを非表示にする設定済)を無効にする
DisableAllHudController()
# キャプチャーエリアに入った時のイベント登録
CaptureAreaDevice.AgentEntersEvent.Subscribe(OnEnterCaptureArea)
# キャプチャーエリアから出た時のイベント登録
CaptureAreaDevice.AgentExitsEvent.Subscribe(OnExitCaptureArea)
# キャプチャーエリアに入った時の処理
OnEnterCaptureArea(PlayerAgent:agent) : void =
# ムービーシーケンスを再生
PlaySequenceDevice(PlayerAgent)
# 画面上のUIを非表示
HideHUD(PlayerAgent)
# キャプチャーエリアから出た時の処理
OnExitCaptureArea(PlayerAgent:agent) : void =
# ムービーシーケンスを停止
StopSequenceDevice(PlayerAgent)
# 画面上のUIを表示
ShowHUD(PlayerAgent)
# ムービーシーケンスを停止
StopSequenceDevice(PlayerAgent:agent) : void =
# プレイヤーが属しているチームの index 番号を取得
var TeamIndex:int = FindTeamIndex(PlayerAgent)
if (0 <= TeamIndex):
# index 番号と同じムービーシーケンスを停止する
if (SequenceDevice := SequenceDeviceAry[TeamIndex]):
SequenceDevice.Stop(PlayerAgent)
# ムービーシーケンスを再生
PlaySequenceDevice(PlayerAgent:agent) : void =
# プレイヤーが属しているチームの index 番号を取得
var TeamIndex:int = FindTeamIndex(PlayerAgent)
if (0 <= TeamIndex):
# index 番号と同じムービーシーケンスを再生する
if (SequenceDevice := SequenceDeviceAry[TeamIndex]):
SequenceDevice.Play(PlayerAgent)
# HUD非表示
HideHUD(PlayerAgent:agent) : void =
# プレイヤーが属しているチームの index 番号を取得
var TeamIndex:int = FindTeamIndex(PlayerAgent)
if (0 <= TeamIndex):
# index 番号と同じ HUD を有効化
if (HudController := HudControllerDeviceAry[TeamIndex]):
HudController.Enable()
# HUD表示
ShowHUD(PlayerAgent:agent) : void =
# プレイヤーが属しているチームの index 番号を取得
var TeamIndex:int = FindTeamIndex(PlayerAgent)
if (0 <= TeamIndex):
# index 番号と同じ HUD を無効化
if (HudController := HudControllerDeviceAry[TeamIndex]):
HudController.Disable()
# チームの index 番号を取得して返す。取得できなかった場合は -1 を返す。
FindTeamIndex(PlayerAgent:agent) : int =
# プレイヤーが属しているチームを取得
if (Team := GetPlayspace().GetTeamCollection().GetTeam[PlayerAgent]):
# 全チーム取得
AllTeamAry := GetPlayspace().GetTeamCollection().GetTeams()
for (Index := 0..(AllTeamAry.Length - 1)):
if (AllTeamAry[Index] = Team):
return Index
return -1
# すべての HUD制御の仕掛け(HUDを非表示にする設定済) を無効にする
DisableAllHudController() : void =
for (Index := 0..(HudControllerDeviceAry.Length - 1), HudController := HudControllerDeviceAry[Index]):
HudController.Disable()
# すべての HUD制御の仕掛け(HUDを非表示にする設定済) を有効にする
EnableAllHudController() : void =
for (Index := 0..(HudControllerDeviceAry.Length - 1), HudController := HudControllerDeviceAry[Index]):
HudController.Enable()
# すべての ムービーシーケンスの仕掛けを非表示にする
StopAllSequenceDevice() : void =
for (Index := 0..(SequenceDeviceAry.Length - 1), SequenceDevice := SequenceDeviceAry[Index]):
SequenceDevice.Stop()
# すべての ムービーシーケンスの仕掛けを表示する
PlayAllSequenceDevice() : void =
for (Index := 0..(SequenceDeviceAry.Length - 1), SequenceDevice := SequenceDeviceAry[Index]):
SequenceDevice.Play()
# Runs when the device is started in a running game
OnBegin<override>()<suspends>:void=
# 初期化
InitFunc()
UEFN 上での Verse のデバイス設定
Verse で操作したい各仕掛けを紐づけるための設定をしています。