UEFN Verse言語 メタバース

【UEFN】RPGゲームのような俯瞰視点の作り方【Verseも解説】

【UEFN】RPGゲームのような俯瞰視点の作り方【Verseも解説】
みなみ

RPGゲームのような俯瞰視点の作り方を教えてください!

りゅう

初心者向けにわかりやすく解説してほしいですね!

こんなお悩みを解決します。

 本記事の内容
 本記事の信頼性

この記事を書いている僕は、クリエイター兼ブロガーです。実際にUEFNを使っており、現在進行形で学んでいます。

今回は、RPGゲームのような俯瞰視点の作り方についてスクショ画像を使って解説します。

なお、RingoGames様のブログを参考にさせていただきました。

私の解釈に誤りがありましたらその際はご了承ください。(o_ _)o))

さっそく、やっていきましょう。

あすか

RPGゲームのような俯瞰視点の作り方

※音量にご注意ください。

▼ UEFNを開き、画面左上の青枠にあるボタンをクリックします。

UEFN RPGゲームのような視点の作り方 1
※クリックすると拡大表示できます。

▼ 「シネマティック」を選択し、「Cine カメラ アクタ」をクリックします。

UEFN RPGゲームのような視点の作り方 2

▼ 次に、画面左下のコンテンツドロワーを選択します。

UEFN RPGゲームのような視点の作り方 3

▼ CreativePropの作成に入ります。

今回は破壊されない小道具(Indestructible props)を作りましょう。

破壊されない小道具

破壊されない小道具(Indestructible props)の作り方は以下の記事にて詳しく解説していますので、参考にしてください。

>>【UEFN】破壊されない小道具を作る方法【初心者さんでも簡単】

【UEFN】破壊されない小道具を作る方法【初心者さんでも簡単】
【UEFN】破壊されない小道具を作る方法【初心者さんでも簡単】

続きを見る

▼ 破壊されない小道具を作成したら、propをシーン上に配置します。

UEFN RPGゲームのような視点の作り方 4

▼ propをシーン上に配置したら、カメラをpropの子供にします。

画面右の「アウトライナー」で、カメラをドラッグし、propにドロップしましょう。

UEFN RPGゲームのような視点の作り方 5

▼ 以下のようにpropの下にカメラがあればOK

UEFN RPGゲームのような視点の作り方 6

▼ カメラの設定をいじります。

以下のとおり。

位置0.00.00.0
回転0.0-45.00.0
拡大・縮小1.01.01.0
UEFN RPGゲームのような視点の作り方 7

シーケンス

▼ コンテンツドロワーを開き、コンテンツブラウザ上で右クリック。

「シネマティック」→「レベル シーケンス」を選択します。

UEFN RPGゲームのような視点の作り方 8

▼ レベルシーケンスをダブルクリックします。

UEFN RPGゲームのような視点の作り方 9

▼ 画面下にシーケンサーが開いたら、右上の「アウトライナー」からカメラをドラッグし、シーケンサーにドロップします。

UEFN RPGゲームのような視点の作り方 10

▼ 以下のようになればOKです。

UEFN RPGゲームのような視点の作り方 11

▼ 「コンテンツドロワー」→「All」をクリックし、『Cinematic Sequence Device』と検索。

「ムービーシーケンスの仕掛け」をシーン上に配置します。

UEFN RPGゲームのような視点の作り方 12

▼ 配置したら、画面右の詳細で以下のように変更します。

シーケンス「なし」→「レベル シーケンス」を選択
ループ再生チェックを入れる
オートプレイチェックを入れる
UEFN RPGゲームのような視点の作り方 13

▼ ムービーシーケンスの仕掛けを変更したら、「Verse」→「Verse Explorer」をクリックします。

UEFN RPGゲームのような視点の作り方 14

▼ Verse Explorerに移動し、一番上の箱のようなアイコンをクリック。

「Add new Verse file to project」をクリックしましょう。

UEFN RPGゲームのような視点の作り方 15

▼ 「track_player_manager」を入力し、「作成」をクリック。

UEFN RPGゲームのような視点の作り方 16

▼ Verse Explorerで「track_player_manager.verse」をダブルクリック。

UEFN RPGゲームのような視点の作り方 17

▼ 以下のようにコードを入力します。

UEFN RPGゲームのような視点の作り方 18
 コード

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


# A Verse-authored creative device that can be placed in a level
track_player_manager := class(creative_device):

# 変数 _Target を creative_prop のインスタンスで初期化
    @editable
    _Target : creative_prop = creative_prop{}

# _OffsetX、_OffsetY、_OffsetZ という名前の変数を定義し、それぞれの初期値を設定
    @editable
    _OffsetX : float = -3000.0
    @editable
    _OffsetY : float = 0.0
    @editable
    _OffsetZ : float = 3000.0

# Offset という名前の vector3 型の変数を定義し、それに _OffsetX、_OffsetY、_OffsetZ の値を代入。UpdateTargetPosition(Offset) を別スレッドで実行
    OnBegin<override>()<suspends>:void=
        Offset:vector3 = vector3{X:=_OffsetX, Y:=_OffsetY, Z:=_OffsetZ}

        ## ループ機能を開始させるための起爆剤
        spawn{UpdateTargetPosition(Offset)}

    UpdateTargetPosition(Offset:vector3)<suspends>:void=
        loop:
            ## プレイヤーとポジションを取得
            Players : []player = GetPlayspace().GetPlayers()
            if(Player : player = Players[0]):

                if(FortniteCharacter : fort_character = Player.GetFortCharacter[]):
                    PlayerPosition : vector3 = FortniteCharacter.GetTransform().Translation

                    TargetPositionX : float = PlayerPosition.X
                    TargetPositionY : float = PlayerPosition.Y
                    TargetPositionZ : float = PlayerPosition.Z

                    TargetPosition:vector3 = vector3{X:=TargetPositionX, Y:=TargetPositionY, Z:=TargetPositionZ} + Offset
                    
                    # ターゲットをプレイヤーの位置に移動:位置・回転・時間
                    _Target.MoveTo(TargetPosition, IdentityRotation(), 0.5)
                    
                    # コメントアウト
                    # if(_Target.TeleportTo[TargetPosition, IdentityRotation()]):
                    #     void

# 0.5秒間プログラムの実行を一時停止
            Sleep(0.5)

            # コメントアウト
            # Sleep(0.0)

▼ コードを入力したら、コンテンツドロワーを開き、「Creative Devices」をクリック。

UEFN RPGゲームのような視点の作り方 19

▼ 「track_player_manager」をシーン上に配置しましょう。

UEFN RPGゲームのような視点の作り方 20

▼ こんな感じで配置できればOKです。

UEFN RPGゲームのような視点の作り方 21

▼ 「Verse」→「Verseコードをビルド」をクリックしましょう。

UEFN RPGゲームのような視点の作り方 22

▼ Verseコードをビルドすると、Track Player manager欄が表示されます。

以下のように設定しましょう。

ゲーム中に表示チェックなし
ゲーム開始時に有効化チェックあり
_Targetpropを選択
_OffsetX-300.0
_OffsetY0.0
_OffsetZ300.0
UEFN RPGゲームのような視点の作り方 23

▼ 設定が完了したら、いざ試してみましょう。

「セッションを開始」をクリック。

UEFN RPGゲームのような視点の作り方 24

▼ 以下のような画面になっていれば完了です。

UEFN RPGゲームのような視点の作り方 25

▼ さらにゾンビスポナーや武器を配置すると、RPGゲームっぽくなります。

UEFN RPGゲームのような視点の作り方 26

以上。お疲れ様でした。🍵

あすか
みなみ

お疲れさまでした!

りゅう

お疲れです😎

 リンゴさんのTwitter account 🍎
 My Twitter account 🍀

RPGゲームのような俯瞰視点のVerseコードを解説

RPGゲームのような俯瞰視点のVerseコードを解説
 コード

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


# A Verse-authored creative device that can be placed in a level
track_player_manager := class(creative_device):

# 変数 _Target を creative_prop のインスタンスで初期化
    @editable
    _Target : creative_prop = creative_prop{}

# _OffsetX、_OffsetY、_OffsetZ という名前の変数を定義し、それぞれの初期値を設定
    @editable
    _OffsetX : float = -3000.0
    @editable
    _OffsetY : float = 0.0
    @editable
    _OffsetZ : float = 3000.0

# Offset という名前の vector3 型の変数を定義し、それに _OffsetX、_OffsetY、_OffsetZ の値を代入。UpdateTargetPosition(Offset) を別スレッドで実行
    OnBegin<override>()<suspends>:void=
        Offset:vector3 = vector3{X:=_OffsetX, Y:=_OffsetY, Z:=_OffsetZ}

        ## ループ機能を開始させるための起爆剤
        spawn{UpdateTargetPosition(Offset)}

    UpdateTargetPosition(Offset:vector3)<suspends>:void=
        loop:
            ## プレイヤーとポジションを取得
            Players : []player = GetPlayspace().GetPlayers()
            if(Player : player = Players[0]):

                if(FortniteCharacter : fort_character = Player.GetFortCharacter[]):
                    PlayerPosition : vector3 = FortniteCharacter.GetTransform().Translation

                    TargetPositionX : float = PlayerPosition.X
                    TargetPositionY : float = PlayerPosition.Y
                    TargetPositionZ : float = PlayerPosition.Z

                    TargetPosition:vector3 = vector3{X:=TargetPositionX, Y:=TargetPositionY, Z:=TargetPositionZ} + Offset
                    
                    # ターゲットをプレイヤーの位置に移動:位置・回転・時間
                    _Target.MoveTo(TargetPosition, IdentityRotation(), 0.5)
                    
                    # コメントアウト
                    # if(_Target.TeleportTo[TargetPosition, IdentityRotation()]):
                    #     void

# 0.5秒間プログラムの実行を一時停止
            Sleep(0.5)

            # コメントアウト
            # Sleep(0.0)

注意:以下のコードの解説文はプログラミング初心者の主が解説したものです。

誤りがありましたら大変恐縮です。

あすか

参考程度にどうぞ。

▼ クラス内にいくつかの変数が定義されています。

_Targetは、ターゲットの位置を表すcreative_propオブジェクトです。

_OffsetX_OffsetY_OffsetZは、プレイヤーの位置に対するオフセット値を表す変数です。

※オフセット値とは、基準点からの距離で表した位置のこと。

    @editable
    _Target : creative_prop = creative_prop{}

    @editable
    _OffsetX : float = -3000.0
    @editable
    _OffsetY : float = 0.0
    @editable
    _OffsetZ : float = 3000.0
 _Targetの意義

▼ その後、UpdateTargetPosition関数が呼び出されます。この関数は、プレイヤーの位置を定期的に更新し、ターゲットの位置を変更するためのループ処理を行います。

        Offset:vector3 = vector3{X:=_OffsetX, Y:=_OffsetY, Z:=_OffsetZ}

        ## start update loop
        spawn{UpdateTargetPosition(Offset)}
 Offset:vector3 = vector3{X:=_OffsetX, Y:=_OffsetY, Z:=_OffsetZ}の詳細
 spawn{UpdateTargetPosition(Offset)}の詳細
 spawnを使う理由
 loopを実現できる理由

UpdateTargetPositionメソッドは、プレイヤーの情報と位置情報を取得して更新します。

具体的には、プレイスペース内のプレイヤーを取得し、そのプレイヤーがFortniteキャラクターを持っている場合にキャラクターの位置を取得します。

ループ構造を持つため、UpdateTargetPositionメソッドは定期的に実行されます。

これにより、プレイヤーの位置情報を定期的に更新し、ターゲットの位置を適切に追従させることができます。

    UpdateTargetPosition(Offset:vector3)<suspends>:void=
        loop:
            ## プレイヤーとポジションを取得
            Players : []player = GetPlayspace().GetPlayers()
            if(Player : player = Players[0]):

                if(FortniteCharacter : fort_character = Player.GetFortCharacter[]):
                    PlayerPosition : vector3 = FortniteCharacter.GetTransform().Translation
 各コードの役割
 関数の呼び出しと定義の違い
 loopの詳細
 if(条件式)を使う理由
 spawnとUpdateTargetPositionの関係
 suspendsを使う意味
 ()の意味
 PlayerPosition~の詳細
 前提:オブジェクトとメソッドの関係
 Translationだけが抽出される理由
 GetFortCharacter[]が配列の要素を指定しない理由

▼ キャラクター情報からプレイヤーの位置を取得し、TargetPositionXTargetPositionYTargetPositionZに代入します。

そして、TargetPositionという名前のベクトルオブジェクトを作成し、TargetPositionOffsetを加えた値を代入します。

これにより、プレイヤーの位置にオフセットを加えた位置がターゲットの新しい位置となります。

                    TargetPositionX : float = PlayerPosition.X
                    TargetPositionY : float = PlayerPosition.Y
                    TargetPositionZ : float = PlayerPosition.Z

                    TargetPosition:vector3 = vector3{X:=TargetPositionX, Y:=TargetPositionY, Z:=TargetPositionZ} + Offset
 例

▼ このコードは、ターゲットオブジェクトをプレイヤーに追従させるために使用されます。

最初の行では、_Targetを指定した位置に0.5秒かけて移動させます。

2つ目の行では、0.5秒の待機を行います。

これにより、一定の間隔でプレイヤーの位置を取得し、ターゲットオブジェクトをプレイヤーに移動させる動作が実現されます。

                    # ターゲットをプレイヤーの位置に移動:位置・回転・時間
                    _Target.MoveTo(TargetPosition, IdentityRotation(), 0.5)
                    
                    # コメントアウト
                    # if(_Target.TeleportTo[TargetPosition, IdentityRotation()]):
                    #     void

# 0.5秒間プログラムの実行を一時停止
            Sleep(0.5)

            # あまりいい動きにならないためコメントアウト
            # Sleep(0.0)
 回転は適用されるのか?
 spawnを使うか否か
 Sleepの意義
 数字の入力だけで移動速度が変更される理由

以上、このコードは、Fortniteのレベル内でプレイヤーの位置を追跡し、ターゲットの位置を更新する機能を持つクリエイティブデバイスを定義しています。

まとめ

UEFN RPGゲームのような俯瞰視点 まとめ

今回は、RPGゲームのような俯瞰視点の作り方について解説しました。

 完全なスクリプト

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


# A Verse-authored creative device that can be placed in a level
track_player_manager := class(creative_device):

# 変数 _Target を creative_prop のインスタンスで初期化
    @editable
    _Target : creative_prop = creative_prop{}

# _OffsetX、_OffsetY、_OffsetZ という名前の変数を定義し、それぞれの初期値を設定
    @editable
    _OffsetX : float = -3000.0
    @editable
    _OffsetY : float = 0.0
    @editable
    _OffsetZ : float = 3000.0

# Offset という名前の vector3 型の変数を定義し、それに _OffsetX、_OffsetY、_OffsetZ の値を代入。UpdateTargetPosition(Offset) を別スレッドで実行
    OnBegin<override>()<suspends>:void=
        Offset:vector3 = vector3{X:=_OffsetX, Y:=_OffsetY, Z:=_OffsetZ}

        ## ループ機能を開始させるための起爆剤
        spawn{UpdateTargetPosition(Offset)}

    UpdateTargetPosition(Offset:vector3)<suspends>:void=
        loop:
            ## プレイヤーとポジションを取得
            Players : []player = GetPlayspace().GetPlayers()
            if(Player : player = Players[0]):

                if(FortniteCharacter : fort_character = Player.GetFortCharacter[]):
                    PlayerPosition : vector3 = FortniteCharacter.GetTransform().Translation

                    TargetPositionX : float = PlayerPosition.X
                    TargetPositionY : float = PlayerPosition.Y
                    TargetPositionZ : float = PlayerPosition.Z

                    TargetPosition:vector3 = vector3{X:=TargetPositionX, Y:=TargetPositionY, Z:=TargetPositionZ} + Offset
                    
                    # ターゲットをプレイヤーの位置に移動:位置・回転・時間
                    _Target.MoveTo(TargetPosition, IdentityRotation(), 0.5)
                    
                    # コメントアウト
                    # if(_Target.TeleportTo[TargetPosition, IdentityRotation()]):
                    #     void

# 0.5秒間プログラムの実行を一時停止
            Sleep(0.5)

            # コメントアウト
            # Sleep(0.0)
 詳細なコメント付き
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/SpatialMath }


# A Verse-authored creative device that can be placed in a level
track_player_manager := class(creative_device):

# 変数 _Target を creative_prop のインスタンスで初期化
    @editable
    _Target : creative_prop = creative_prop{}

# _OffsetX、_OffsetY、_OffsetZ という名前の変数を定義し、それぞれの初期値を設定
    @editable
    _OffsetX : float = -3000.0
    @editable
    _OffsetY : float = 0.0
    @editable
    _OffsetZ : float = 3000.0

# Offset という名前の vector3 型の変数を定義し、それに _OffsetX、_OffsetY、_OffsetZ の値を代入。UpdateTargetPosition(Offset) を別スレッドで実行
    OnBegin<override>()<suspends>:void=
        Offset:vector3 = vector3{X:=_OffsetX, Y:=_OffsetY, Z:=_OffsetZ}
    # ループ機能を開始させるための起爆剤
        spawn{UpdateTargetPosition(Offset)}
# ターゲットの位置の更新:関数の定義
    UpdateTargetPosition(Offset:vector3)<suspends>:void=
        loop:
        # プレイヤーとポジションを取得
            Players : []player = GetPlayspace().GetPlayers()
            if(Player : player = Players[0]):
                # 現在のプレイヤーがフォートナイトキャラクターを制御しているかどうかを確認
                # 条件式がTrue(キャラクターオブジェクトが存在する)の場合、次の行でキャラクターの位置情報を取得
                if(FortniteCharacter : fort_character = Player.GetFortCharacter[]):
                # フォートナイトキャラクターの位置情報のみ取得
                    PlayerPosition : vector3 = FortniteCharacter.GetTransform().Translation
                # PlayerPositionベクトルのX、Y、Zの各成分を個別の変数に格納
                    TargetPositionX : float = PlayerPosition.X
                    TargetPositionY : float = PlayerPosition.Y
                    TargetPositionZ : float = PlayerPosition.Z
                # OffsetベクトルをTargetPositionベクトルに加算して、最終的なターゲットの位置を計算
                # 計算されたターゲットの位置は、変数"TargetPosition"に代入される
                    TargetPosition : vector3 = vector3{X:=TargetPositionX, Y:=TargetPositionY, Z:=TargetPositionZ} + Offset

                    # ターゲットをプレイヤーの位置に移動:位置・回転・時間
                    _Target.MoveTo(TargetPosition, IdentityRotation(), 0.5)
                    
                    # コメントアウト
                    # if(_Target.TeleportTo[TargetPosition, IdentityRotation()]):
                    #     void

# 0.5秒間プログラムの実行を一時停止
            Sleep(0.5)

            # あまりいい動きにならないためコメントアウト
            # Sleep(0.0)

今回もお疲れさまでした。

地道にコツコツと積み上げていきましょう😌

  • この記事を書いた人
  • 最新記事

あすか(Asuka)

自己紹介:UEFNクリエイター兼ブロガー
Verse言語独学中 | UE・プログラミング・3Dモデリング完全初心者 | 備忘録として学習記録をブログに残しています。
■好きな言葉
徳は弧ならず必ず隣あり.
■ひとこと
まだまだ未熟者ですが、
よろしくお願いします。

-UEFN, Verse言語, メタバース
-, ,