見出し画像

[UEFN&Verse]ボタンを押すとアイテムがスポーン

今回はボタンとアイテムスポナーを使ってボタンを押すとアイテムが出てくる仕組みを作ってみる
おサルの餌ボタン実験のようだ

プロジェクトの始め方など前提となる設定については以下の記事を参考にして欲しい

大まかな手順

  1. ボタンを配置

  2. Verseデバイスを作成

  3. コーディング

  4. アイテムスポナーを配置

①ボタンを配置

まずはなんでもよいのでプロジェクトをスタートする
新規のプロジェクトでも、何かすでに仕掛かっているプロジェクトでも特に問題はない

(まだ開いてなければ)コンテンツブラウザを開く

All > Fortnite > Devicesの下に[ボタン]があるのでシーンにドラッグ&ドロップする

②Verseデバイスを作成

Verse Explorerでプロジェクトルートを右クリックして
Add new Verse file to projectを選択

Device Nameを適当につけて[作成]する
ここでは"item_button_device"とした

コンテンツブラウザでAll > [プロジェクト名]コンテンツ > CreativeDevices の下に作られているVerseクラスをシーンに配置する

Verseクラス(デバイス?)はプレイ中に見せる必要はないのでユーザーオプションからゲーム中に表示をオフにしておく

③コーディング

Verse Explorerから作成たverseファイルをダブルクリックして開く

初期状態だと以下のようなプログラムになっている

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

# See https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse for how to create a verse device.

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

    # Runs when the device is started in a running game
    OnBegin<override>()<suspends>:void=
        # TODO: Replace this with your code
        Print("Hello, world!")
        Print("2 + 2 = {2 + 2}")

まずはVerseクラスとボタンを関連付けるためにクラス定義の下に
2行挿入する

item_button_device := class(creative_device):
    @editable
    Button:button_device = button_device{}

@editable はその下に定義した変数をエディタに公開するという宣言だ
Button:button_device = button_device{}
c#風に書き換えるとbutton_device Button = new button_device();
と同じで、変数を定義してインスタンスを生成している

ここで一度ファイルをセーブしてプログラムをビルドしてみる

Button という変数がエディタに公開されているのがわかる
ここで先ほど追加したボタンを選択することでVerseクラスとボタンが関連付けられることになる

ボタンが押された時の処理を書くOnBeginの下を以下のように編集する

    OnBegin<override>()<suspends> : void =
        Button.InteractedWithEvent.Subscribe(OnButtonInteracte) 

    OnButtonInteracte(Player:agent) : void =
        Print("ボタンが押されました")

まずはボタンが押されたときにコールされる関数を定義する

    OnInteracte(Player:agent) : void =
        Print("ボタンが押されました")

Verseは文法がちょっと変わっているのだがC#風に書き換えればごく普通だ

void OnButtonInteracte(Player agent)
{
	Print("ボタンが押されました");
}

定義した関数をOnBeginでButtonインスタンスに登録する

    OnBegin<override>()<suspends> : void =
        Button.InteractedWithEvent.Subscribe(OnButtonInteracte) 

C#のデリゲートみたいなものだ
Button.InteractedWithEvent = OnButtonInteracte;

ソースをビルドして動作確認してみる
ボタンを押すとメッセージがでるのが確認できる

④アイテムスポナーを配置

コンテンツブラウザからAll  > Fortnite > Devicesの下にあるアイテムスポナーをシーンに配置する

アイテムスポナーの詳細情報で、
タイマーに合わせてアイテムをスポーンをOFF
タイマーに合わせてアイテムをリスポーンをOFF
アイテムリストになんでもよいので適当にアイテムを追加

クラスにいくつかコードを追加
アイテムスポナーインスタンスを定義してエディターに公開
ボタンが押されたときにアイテムをスポーンする関数を追加

item_button_device := class(creative_device):
    @editable
    Button:button_device = button_device{}
    @editable
    ItemSpawner:item_spawner_device = item_spawner_device{}


    OnBegin<override>()<suspends> : void =
        Button.InteractedWithEvent.Subscribe(OnButtonInteracte) 

    OnButtonInteracte(Player:agent) : void =
        Print("アイテムをスポーンします")
        ItemSpawner.SpawnItem()

プログラムをビルドして、アイテムスポナーをエディタで関連付ける

ここでまた動作確認してみる
アイテムがスポーンできているはず

今回はボタンとアイテムスポナーを使ったが、デバイスはざっと数えると150種類ぐらいあるので何ができるのか探っていこうと思う

NPCや敵の動きの制御などもVerseでできるのだろうか?
しばらくUEFN&Verseシリーズを進めていこうと思う

いいなと思ったら応援しよう!