前書き

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)