前書き
Verse言語では乗り物(fort_vehicle)の操作を行うことができます。現状では機能はそこまで多くはないですが、イベントバインディングを用いた操作よりも(少しだけ)高度なことができるので紹介します。
fort_vehicleの取得
Verse上で乗り物を操作するためには、乗り物を指す「fort_vehicle」という型のインスタンスを取得する必要があります。方法は様々だと思いますが、今回は代表的な二点をピックアップして紹介します。
SpawnedEvent
using { /Fortnite.com/Devices }
using { /Fortnite.com/Vehicles }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
hello_world_device := class(creative_device):
@editable
SportsCarSpawner:vehicle_spawner_sports_car_device = vehicle_spawner_sports_car_device{}
OnBegin<override>()<suspends>:void=
SportsCarSpawner.SpawnedEvent.Subscribe(OnSpawnedVehicle)
OnSpawnedVehicle(InVehicle:fort_vehicle):void=
FuelCapacity := InVehicle.GetFuelCapacity()
Print("FuelCapacity: {FuelCapacity}")
乗り物スポナー全般に搭載されている「SpawnedEvent」を使うことでfort_vehicleを取得することができます。listenableのためSubscribeで関数を呼び出します。対象の関数は「fort_vehicleを引数に持つ戻り値がvoid」である必要があり、非同期関数<suspends>などは対象外となります。
GetVehicle
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Vehicles }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
hello_world_device := class(creative_device):
@editable
InputTrigger:input_trigger_device = input_trigger_device{}
OnBegin<override>()<suspends>:void=
InputTrigger.PressedEvent.Subscribe(OnInput)
OnInput(InAgent:agent):void=
if:
FortCharacter := InAgent.GetFortCharacter[]
FortVehicle := FortCharacter.GetVehicle[]
then:
FuelCapacity := FortVehicle.GetFuelCapacity()
Print("FuelCapacity: {FuelCapacity}")
fort_characterから、対象者が乗っている乗り物を取得することもできます。GetVehicleは失敗関数のためif内で呼び出す必要があります。
機能例
では、実際にVerseで乗り物操作をすると行えることを紹介します。
条件
if(FortVehicle.IsOnGround[]):
Print("乗り物が接地している際に呼び出される")
if(FortVehicle.IsInAir[]):
Print("乗り物が空中にいる際に呼び出される")
if(FortVehicle.IsInWater[]):
Print("乗り物が水の中にいる際に呼び出される")
fort_vehicleに対してこれらの失敗関数を呼び出すと、乗り物の状態を取得することができます。InOnGroundは地面についている際に成功しif内の処理が呼び出されます。同様に、IsInAirは宙に浮いている際に、IsInWaterは水の中にいる際にif内の処理が実行されます。
GetPassengers
AllPassengers := FortVehicle.GetPassengers()
for(Passenger : AllPassengers):
Passenger.Damage(200.0)
乗り物に乗っているプレイヤー(fort_character型)を配列で取得する関数が用意されています。ある条件を満たすと乗り物に乗っているプレイヤーにダメージを与えたり、逆に回復したりと、fort_characterの操作が行えます。
燃料
FuelRemaining := FortVehicle.GetFuelRemaining()
FuelCapacity := FortVehicle.GetFuelCapacity()
燃料の容量を取得できます。乗り物スポナー全般には「燃料を消費 / 開始時の燃料」といったオプションが用意されており、0.0から100.0(今後仕様変更される可能性もある)の間で取得できます。
位置と体力、それからダメージ
VehicleTransform := FortVehicle.GetTransform()
VehicleMaxHealth := FortVehicle.GetMaxHealth()
VehicleHealth := FortVehicle.GetHealth()
FortVehicle.SetHealth(100.0)
FortVehicle.SetMaxHealth(10000.0)
FortVehicle.Damage(100.0)
FortVehicle.Damagedevent().Subscribe(OnDamaged)
fort_vehicleは「positional/healful/damageable」を継承しているため、これらの関数を呼び出すことができます。状況に応じでダメージで破壊をしたり、体力の最大値を増やしたりと、様々なことができます。
TeleportTo
if:
FortVehicle.TeleportTo[TeleportPoint, TeleportRotation]
then:
TeleportTo関数が搭載されているため、ゲーム内の状況に合わせて乗り物を転送させることができます。これはテレポーターの仕掛けではできないことなので、Verseを使う大きなメリットかも!
使用例: キーを押し体力が50%以下で破壊
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Vehicles }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
hello_world_device := class(creative_device):
@editable
InputTrigger:input_trigger_device = input_trigger_device{}
@editable
HUDMessage:hud_message_device = hud_message_device{}
FuelToMessage<localizes>(InRemaining:float, InCapacity:float):message="燃料: {InRemaining} / {InCapacity}"
OnBegin<override>()<suspends>:void=
InputTrigger.PressedEvent.Subscribe(OnInput)
OnInput(InAgent:agent):void=
if:
FortCharacter := InAgent.GetFortCharacter[]
FortVehicle := FortCharacter.GetVehicle[]
then:
FuelRemaining := FortVehicle.GetFuelRemaining()
FuelCapacity := FortVehicle.GetFuelCapacity()
Print("燃料: {FuelRemaining} / {FuelCapacity}")
HUDMessage.Show(InAgent, FuelToMessage(FuelRemaining, FuelCapacity))
if(FuelRemaining / FuelCapacity < 0.5):
FortVehicle.Damage(2000000.0)