サンタのおもちゃ工場へようこそ!これはレゴ® のテンプレートであり、次の機能を使用した魅力的なゲームプレイのループを通じてプレイヤーの定着率を向上させることに重点が置かれています。
永続性:ゲーム セッション間でプレイヤー データが保存されます。
オフラインでの進行:工場ではプレイヤーがゲームに参加していないときでも、工場のコンテナに余裕がある限りおもちゃが生産され続けていて、キャンディ ケインの森はプレイヤーがいてもいなくても成長し続けています。
これらの両方を組み合わせることによって、プレイヤーが継続的に島に戻ってくるようにする日常的なメカニクスを作り出すこともできます。 このテンプレートを使用して、独自の居心地の良い休日の島でこれらのメカニクスを実装する方法について説明します。
このテンプレートには、次の 3 つの短いチュートリアルが入っています。
初心者向け:キャンディ ケインの森の増加時間を Verse で変更する方法を示します。
中級者向け:Verse で変数を編集する方法について説明します。
上級者向け:Verse コードを変更および追加します。
プロジェクト内の各チュートリアルでは、使用されているメカニクスを、Verse を使用して実現する方法が示されています。
このテンプレートは次の 3 つのパートに分かれています。
プレイする:ゲームを 5 ~ 10 分間プレイして、その仕組みの感覚をつかむことから始めます。
作成する:次に、チュートリアルでの課題に従って 3 つの変更を行います。
探索する:最後に、自分で探索し、文書化されているコードを徹底的に調べて、その仕組みを確認し、クリスマスに相応しい独自のゲームを作成します。
Play (再生)
UEFN からテンプレートをロードします。 他の LEGO テンプレートもあります。 そのゲームをプレイしましょう。
ゲーム内でクエストに従い、Pawlar 卿に近づくと、何をすべきかを説明してくれます。
ゲーム内での指示に従います。
ある時点で、ゲームを終了するようにチュートリアルから求められます。 Esc キーを押し、[End Game] を選択します。
2 分間待ちます。
2 分経過したら、もう一度 Esc キーを押し、[Start Game] を選択します。
これは奇妙なことのように思えるかもしれませんが、非常に重要な点が示されています。 このゲームでは、プレイしていない間もさまざまなことが起きています!工場では生産が続けられ、キャンディ ケインの森は成長し続けています。
これらは、時間の経過とともに成長した作物を収穫したり、生産された素材を集めたりするために、プレイヤーがゲームに戻ってくるようにすることができる、重要なメカニクスです。
ゲームに戻ると、ゲームにいない間に生産されたものを確認できます。
これは「factory_manager.verse」ファイル内で行われています。 永続データと実時間時計の仕掛けを使用して、プレイヤーがいない間に経過した時間が測定されます。 そして、その期間に工場で生産された量が計算されます。
2 つ目の工場が造られると、UEFN に戻るように指示するメッセージが表示されます。
最初のチュートリアルが終わりました。 次はクリエイティブの課題に進みましょう。
作成
楽しいことをする時間です。 3 つの課題が待ち構えています。
最初の課題である新入生 Flapjack を見つけます。 彼は、3 つの黄色い正方形のいずれかで待ち構えています。
初心者向けの課題:キャンディ ケインの再成長時間を変更する
最初の課題はわかりやすいものです。 値を調整するだけでゲームをどれだけ変えることができるかがわかります。ここでは、キャンディケイン畑の再成長時間を調整します。
新入生 Flapjack の横に、Verse で作成されたキャンディ ケインの仕掛けがあります。
それを選択し、[Details] パネルも選択しておきます。
CandyCaneRegrowthTimeパラメータを調整します。試してみて、それがゲームプレイにどのように影響を及ぼすかを確認します。
中級者向けの課題:アップグレード価格を変更する
2 つ目の課題では、Verse コード自体を編集します。
ここでも、工場のアップグレード価格を調整するだけで、ゲームのペースや感触をどれだけ変えることができるかを確認します。
Verse Explorer から「upgrade_config.verse」ファイルを開きます。
工場のさまざまな要素をアップグレードするためのすべての価格を確認できます。 価格の最初のまとまりは、工場のベルトの価格です。 工場にはベルトが 4 つあるため、価格表に 4 つの列があります。 表の各行は、1 つのベルトをそのレベルのにアップグレードするための価格です。
Verse# This file contains the data used to configure the factory in the game. # This includes upgrade prices, max levels, production speeds, storage capacities and more. # It also contains functions for getting all this data. using { /Verse.org/Simulation } using { Persistence } # Blubberchops: "Looks like this is the place to modify the upgrade prices for belts."Blubberchops のアドバイスに従って、ベルトのアップグレード価格をもっと安くします。 価格を高くして、ゲームのペースを遅くすることを試してみることもできます。
準備が整ったら、Verse コードをビルドし、Verse の変更内容をプッシュして変更を試してみます。
この手順で行っていることの詳細については、「初めての Verse プログラムを変更して実行する」を参照してください。
なお、変更をセッションにプッシュするたびに、工場の進行状況がリセットされます。
エキスパート向けの課題:デイリー ギフト
3 つ目で最後の課題では、Flopkins 教授の横にあるデイリー ギフトに取り組んでもらいます。
これを行うには、ギフトが最後に開けられたときに、特別な持続可能データをストアに追加する必要があります。 Verse で作成されたデイリー ギフトの仕掛けにあるロジックも修正する必要があります。
Verse での持続可能データの詳細については、「Using Persistable Data」を参照してください。
この課題に関してちょっとした手助けが必要であれば、後述の「デイリー ギフトの仕掛け」セクションを見てください。
Verse Explorer から「player_info.verse」ファイルを開きます。
ファイルの先頭近くにある Flopkins 教授のコメントを探します。
ギフトが開けられた最終日時を格納するための
date_and_time配列フィールドをplayer_infoクラスに追加していることを確認します。 また、フィールド値はMakePlayerInfoコンストラクタ内で設定されるようにします。Verse# This file defines player_info, the collection of persistable information stored for each player. # It also contains functions for creating, updating and returning information about a player. using { /Verse.org/Simulation } using { Config } using { Time } # Maps each player to their persisted information. var PlayerInfoMap:weak_map(player, player_info) = map{}新しく追加されたフィールドを取得および設定するために、この関数を修正します。 今度は、ファイルの終わり近くにある Flopkins 教授のコメントを探します。
関数が正しく動作するように、欠落している行を記述します。 ヒントを得るために、このファイルにある他の関数をいくつか見ることもできます。
Verse# This file defines player_info, the collection of persistable information stored for each player. # It also contains functions for creating, updating and returning information about a player. using { /Verse.org/Simulation } using { Config } using { Time } # Maps each player to their persisted information. var PlayerInfoMap:weak_map(player, player_info) = map{}持続可能データの新しい関数が準備できたら、「daily_gift.verse」ファイルを開いて、ギフトが 1 日に 1 回だけ表示されるようにロジックを変更します。
次の 2 つの極めて重要な要素が欠落しているのがわかります。
ギフトが開けられたときに、現在時刻を格納する
ギフトが最後に開けられた後に日付が変わったかどうかをチェックする
教授のコメントに従って、欠落しているコードを追加します。
Verse# When the gift is opened (harvested), give the selected player gold. OnHarvesting(Agent:agent):void= # Hide gift. set Opened = true PropManipulator.HideProps() # Show effect. spawn: ShowGiftEffect()Verse# Succeeds if the current date is different from the opening time. IsDateRolledOver()<decides><transacts>:void= # Get the current date. Now := RealTime.GetDateAndTime() # Professor Flopkins: "Hmm, the code to determine if the date has rolled over is also missing." # "Let's see.. first we'll get the selected player." # "Look in the OnHarvesting function to see how to do that."これで、自分の解決方法を試してみる準備が整いました! Verse コードをビルドし、Verse の変更内容をプッシュしてセッションで試してみます。
サブゼロのデバッグ ボタンを、時刻を進めることをスキップするためのショートカットとして使用して、日付が変わっている場合にギフトがリスポーンされるかどうかをテストすることができます。
探索
ここまでで、課題に対応できたので、このテンプレートで使用されている他の仕掛けをいくつか詳しく見ていきます。
実時間時計の仕掛け
実時間時計の仕掛けは、現在の時刻を協定世界時 (UTC) で取得します。 また、時計の針をアニメートします。
これを使用して、毎日の特定の時刻に発生する必要があるイベントを駆動することや、経過時間を追跡することができます。
現在の時刻をオフセットできる組み込みのテスト関数が付属しています。 「real_time_device.verse」ファイル、「date_and_time.verse」ファイル、「time_interval.verse」ファイルを確認してください。
キャンディ ケイン畑の仕掛け
Verse で作成されたキャンディ ケイン畑の仕掛けは、収穫可能なキャンディ ケインの畑を追跡します。 この仕掛けは、素材が収穫されるタイミングを素材に提供し、時間の経過とともに素材を再成長させます。 この仕掛けは、すべての種類の再成長する素材に使用できます。 「candy_cane_field.verse」ファイルを調べます。
永続モジュール
このモジュールは、各プレイヤーと関連付けられているすべての永続可能データを保持します。 メインのクラスは、「player_info.verse」ファイルにある player_info クラスです
このファイルには、そのデータを読み取りおよび操作するためのすべての関数も入っています。 このモジュールにある他のクラスでは、各プレイヤーに対して格納されている一部のデータが個別に定義されているため、それらのクラスもチェックする必要があります。 必要に応じて、それらを変更することも、データを追加することもできます。
# This file defines player_info, the collection of persistable information stored for each player.
# It also contains functions for creating, updating and returning information about a player.
using { /Verse.org/Simulation }
using { Config }
using { Time }
# Maps each player to their persisted information.
var PlayerInfoMap:weak_map(player, player_info) = map{}
# This tracks all persistable information for a player.
player_info := class<final><persistable>:
# The version of the current player info.
デイリー ギフトの仕掛け
この仕掛けは、デイリー ギフトをスポーンします。言い換えれば、仕掛けが機能すればそうなるはずです。
Verse で作成されたデイリー ギフトの仕掛けを十分に活用できるように、エキスパート向けの課題の解決方法を以下に示しています。 この仕掛けは、すべての種類のデイリー イベントや報酬に使用できます。
まず、必要なデータを
player_infoクラスに追加し、「player_info.verse」ファイルにあるMakePlayerInfoコンストラクタを変更しますVerse# This tracks all persistable information for a player. player_info := class<final><persistable>: # The version of the current player info. Version:int = 0 # Latest harvest times of all candy canes. CandyCaneHarvestTimes:[]date_and_time = array{date_and_time{}, date_and_time{}, date_and_time{}, date_and_time{}, date_and_time{}, date_and_time{}, date_and_time{}, date_and_time{}, date_and_time{}, date_and_time{}} # The amount of gold the player has.SetGiftOpeningTime関数とGetGiftOpeningTime関数に入力します。Verse# Sets the gift opening time for the player. SetGiftOpeningTime<public>(Player:player, GiftOpeningTime:date_and_time)<decides><transacts>:void= CheckPlayerInfoForPlayer[Player] SourceInfo := PlayerInfoMap[Player] set PlayerInfoMap[Player] = player_info: MakePlayerInfo<constructor>(SourceInfo) GiftOpeningTime := GiftOpeningTime # Gets the gift opening time for the player.「daily_gift.verse」ファイルにある
daily_giftクラスに注目します。 まず、ギフトが開けられたときに、現在時刻を格納することを記述します。Verse# When the gift is opened (harvested), give the selected player gold. OnHarvesting(Agent:agent):void= # Hide gift. set Opened = true PropManipulator.HideProps() # Show effect. spawn: ShowGiftEffect()IsDateRolledOver関数を実装します。Verse# Succeeds if the current date is different from the opening time. IsDateRolledOver()<decides><transacts>:void= # Get the current date. Now := RealTime.GetDateAndTime() SelectedPlayer := MaybeSelectedPlayer? GiftOpeningTime := GetGiftOpeningTime[SelectedPlayer] Now.Years <> GiftOpeningTime.Years or Now.Months <> GiftOpeningTime.Months or Now.Days <> GiftOpeningTime.Days
工場長の仕掛け
Verse で作成された工場長の仕掛けは、工場を初期化して運営します。 プレイヤーが離れている間に商品が作られた数の計算を処理します。
工場の貯蔵庫は工場の複数のベルトで共有されているため、この計算は複雑になることがあります。 単純なセットアップでは、直近の生産からの経過時間を計算し、それを生産速度で除算することによって、作られる商品の数を計算できます。