Open8

[UEFN]自キャラについてくるPropを実現するVerseを作る

tamfoitamfoi

まとめ

動作

https://twitter.com/tamfoi/status/1639971805963386880

Verse

using { /Verse.org/Simulation }
using { /Fortnite.com/Devices}
using { /Fortnite.com/Characters }
using { /Fortnite.com/Playspaces }
using { /UnrealEngine.com/Temporary/SpatialMath }

chase := class<concrete>(creative_device): 
    @editable
    Prop:creative_prop = creative_prop{}

    @editable
    AdjustmentZ:float = 75.0
    
    OnBegin<override>()<suspends> : void =
      AllPlayers := Self.GetPlayspace().GetPlayers() #フィールド中のプレイヤーを全て取得
      if (FirstPlayer := AllPlayers[0]): #一人目のプレイヤーを取得
        if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]): # fort_characterクラスにGetTransform()があるので取得
          loop:
            Prop.MoveTo(FortniteCharacter.GetTransform().Translation - vector3{X:=0.0, Y:=0.0, Z:=AdjustmentZ}, rotation{}, 1.0) #FortniteCharacter.GetTransform().TranslationでとれるZが腰辺りの高さになってるので一旦無理やり合わせる
            Sleep(0.0)

問題点

  • キャラの方向を向いていない
  • 障害物に弱い(ただ単にまっすぐこちらに向かってくるため)
  • 一人目のプレイヤーしか追いかけない
tamfoitamfoi

とりあえず移動をさせるには

creative_propクラスにMoveToとTeleportToがあるのでこれを利用する

tamfoitamfoi

Propを行ったり来たりさせるDeviceを作成してみた

using { /Verse.org/Simulation }
using { /Fortnite.com/Devices}
using { /UnrealEngine.com/Temporary/SpatialMath }

back_and_forth := class<concrete>(creative_device): 
    @editable
    Prop:creative_prop = creative_prop{}

    MoveToOverTime: float = 2.0
    var DefaultPosition: vector3 = vector3{} #初期位置
    var MovementX: float = 200.0 #行ったり来たりさせる距離
    
    OnBegin<override>()<suspends> : void =
      set DefaultPosition = Prop.GetTransform().Translation #初期位置を取得

      loop:
        set MovementX = MovementX * -1.0 #ループごとに目的地を反転
        Prop.MoveTo(DefaultPosition + vector3 {X:=MovementX, Y:=0.0, Z:=0.0}, rotation{}, MoveToOverTime)
        Sleep(1.0)
tamfoitamfoi

自キャラの位置をとるには

チュートリアルでキャラクター情報まで辿っていく方法がのっているのでこれを利用する
https://dev.epicgames.com/documentation/ja-jp/uefn/learn-code-basics-5-practice-time-in-verse

下記のような感じで辿っていく

AllPlayers := Self.GetPlayspace().GetPlayers() #フィールド中のプレイヤーを全て取得
      if (FirstPlayer := AllPlayers[0]): #一人目のプレイヤーを取得
        if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]): # fort_characterクラスにGetTransform()があるので取得