小道具のスポーン

ボタンを押したり、何かイベントを受け取ったり、ゲーム内の状況に応じて「建築小道具(creative_prop)」をスポーンさせるには「SpawnProp関数」を使用します。

# Spawns a `creative_prop` at the specified `Position` and `Rotation`. `Position` and `Rotation` units are in cm.
# Returns tuple:
#  0: Instance of a `creative_prop`. False if no `creative_prop` could be created. See `spawn_prop_result` for failure cases.
#  1: Success or failure results.
SpawnProp<native><public>(Asset:creative_prop_asset, Position:(/UnrealEngine.com/Temporary/SpatialMath:)vector3, Rotation:(/UnrealEngine.com/Temporary/SpatialMath:)rotation)<transacts>:tuple(?creative_prop, spawn_prop_result)

# Spawns a `creative_prop` at the specified `Transform`. `Units are in cm.
# Returns tuple:
#  0: Instance of a `creative_prop`. False if no `creative_prop` could be created. See `spawn_prop_result` for failure cases.
#  1: Success or failure results.
SpawnProp<native><public>(Asset:creative_prop_asset, Transform:(/UnrealEngine.com/Temporary/SpatialMath:)transform)<transacts>:tuple(?creative_prop, spawn_prop_result)

SpawnPropの実装は上記の通りです。第一引数にはcreative_prop_asset型の変数を入れ、それ以降はどの場所にどの回転軸でスポーンさせるかを指定します。

creative_prop_asset

spawn_prop_device := class(creative_device):

    @editable
    PropAsset:creative_prop_asset = DefaultCreativePropAsset

creative_prop_assetはeditableの変数として使用することを前提に作られたクラスとなります。初期値はDefaultCreativePropAssetという専用の定数が用意されているため使用します。

PropAsset:creative_prop_asset = creative_prop_asset{}

のようなものや、DefaultCreativePropAsset以外のアセットを初期値に入れることはできません。

デバイスを設置すると、フォートナイト標準の小道具、もしくは自作の建築小道具が選べる状態となります。ここで選択したアセットが、SpawnProp関数でスポーンされる見た目となります。

SpawnProp

spawn_prop_device := class(creative_device):

    @editable
    PropAsset:creative_prop_asset = DefaultCreativePropAsset

    OnBegin<override>()<suspends>:void=
        SpawnVector:vector3 = vector3{X := 100.0, Y := 100.0, Z := 100.0}
        SpawnRotation:rotation = MakeRotationFromYawPitchRollDegrees(0.0, 0.0, 0.0)

        SpawnProp(PropAsset, SpawnVector, SpawnRotation)

SpawnProp関数に対して、creative_prop_assetの入った変数、座標としてのvector3、回転としてのrotationをいれてあげると、指定した位置に指定した角度でスポーンされます。

実際にゲーム内で確認してみるとこんな感じです。何もない場所にゲーム開始とともに小道具がスポーンします。

二つのSpawnProp

spawn_prop_device := class(creative_device):

    @editable
    PropAsset:creative_prop_asset = DefaultCreativePropAsset

    OnBegin<override>()<suspends>:void=
        SpawnTransform := transform:
            Translation := vector3{X := 100.0, Y := 100.0, Z := 100.0}
            Rotation := MakeRotationFromYawPitchRollDegrees(0.0, 0.0, 0.0)
            Scale := vector3{X := 5.0, Y := 5.0, Z := 5.0}

        SpawnProp(PropAsset, SpawnTransform)

SpawnProp関数は「vector3, rotation」を渡す版と、「transform」を渡す版の二つが用意されています。

transform型を渡す場合はscaleの指定も行えるため、スポーンと同時に5倍の大きさの小道具を出現させることもできます。

戻り値

tuple(?creative_prop, spawn_prop_result)

SpawnProp関数の戻り値は「オプション型のcreative_prop」と「列挙型のspawn_prop_result」のタプルが返ってきます。0番目の?creative_propには、スポーンが成功した際にその小道具を参照するcreative_propのインスタンスが入ります。

このcreative_propに対してMoveTo関数やSetMaterial関数を呼び出すなどをして、スポーン後に小道具の操作を行えます。

spawn_prop_device := class(creative_device):

    @editable
    PropAsset:creative_prop_asset = DefaultCreativePropAsset

    OnBegin<override>()<suspends>:void=
        SpawnTransform := transform:
            Translation := vector3{X := 100.0, Y := 100.0, Z := 100.0}
            Rotation := MakeRotationFromYawPitchRollDegrees(0.0, 0.0, 0.0)
            Scale := vector3{X := 5.0, Y := 5.0, Z := 5.0}

        Result := SpawnProp(PropAsset, SpawnTransform)

        case(Result(1)):
            spawn_prop_result.Ok=>
                Print("成功")
            spawn_prop_result.UnknownError=>
                Print("未知のエラー")
            spawn_prop_result.InvalidSpawnPoint=>
                Print("無効なスポーン地点")
            spawn_prop_result.SpawnPointOutOfBounds=>
                Print("スポーン地点が島の境界外")
            spawn_prop_result.InvalidAsset=>
                Print("無効なアセット")
            spawn_prop_result.TooManyProps=>
                Print("スポーン可能なプロップの数を超えています")

        if(Prop := Result(0)?):
            Prop.MoveTo(vector3{X := 500.0, Y := 100.0, Z := 100.0}, IdentityRotation(), 1.0)
        else:
            Print("プロップがスポーンされませんでした")

簡単な例を紹介します。戻り値の1番目はspawn_prop_resultと呼ばれる列挙型であるため、caseやifを用いてスポーンしなかった場合の原因を特定できます。

0番目はオプション型であるため、一度if内で実体化させる必要があります。もし、スポーンに失敗していればifは実行されません。

実体化させたcreative_propに対して、例えばMoveToを呼び出すとスポーン直後に400.0だけ上に移動させることもできます。

例1. マテリアル差し替え

spawn_prop_device := class(creative_device):

    @editable
    PropAsset:creative_prop_asset = DefaultCreativePropAsset

    OnBegin<override>()<suspends>:void=
        SpawnTransform := transform:
            Translation := vector3{X := 100.0, Y := 100.0, Z := 100.0}
            Rotation := MakeRotationFromYawPitchRollDegrees(0.0, 0.0, 0.0)
            Scale := vector3{X := 5.0, Y := 5.0, Z := 5.0}

        Result := SpawnProp(PropAsset, SpawnTransform)

        if(Prop := Result(0)?):
            Prop.SetMaterial(M_UI_Color{})

https://gorosuke.net/verse-material-parameter-control/

詳細はこちらのリンクを参照してほしいですが、例えばスポーンと同時にマテリアルを上書きさせることもできます。

例2. ダメージを与えられるかの切り替え

spawn_prop_device := class(creative_device):

    @editable
    PropAsset:creative_prop_asset = DefaultCreativePropAsset

    OnBegin<override>()<suspends>:void=
        SpawnTransform := transform:
            Translation := vector3{X := 100.0, Y := 100.0, Z := 100.0}
            Rotation := MakeRotationFromYawPitchRollDegrees(0.0, 0.0, 0.0)
            Scale := vector3{X := 5.0, Y := 5.0, Z := 5.0}

        Result := SpawnProp(PropAsset, SpawnTransform)

        if(Prop := Result(0)?):
            set Prop.CanBeDamaged = true
            set Prop.CanBeDamaged = false

スポーンした小道具を破壊可能かどうかを切り替える変数が用意されています。スポーン時点では破壊負荷だけど、条件を満たすと壊せるようになるなどといった実装ができます。

例3. ボタンを押したらプレイヤーの位置にスポーン

spawn_prop_device := class(creative_device):

    @editable
    PropAsset:creative_prop_asset = DefaultCreativePropAsset

    @editable
    SpawnButton:button_device = button_device{}

    OnBegin<override>()<suspends>:void=
        SpawnButton.InteractedWithEvent.Subscribe(OnSpawn)

    OnSpawn(Agent:agent):void=
        if(FortCharacter := Agent.GetFortCharacter[]):
            SpawnProp(PropAsset, FortCharacter.GetTransform())

SpawnPropはOnBegin以外の場所でも当然使うことができます。ボタンを押した際の呼び出される関数内でSpawnPropをすれば、ボタンを押すと同時に小道具を出現させることもできます。