これは現在、実験的状態です。したがって、それらを試したり、フィードバックを提供したり、計画を確認したりできます。 現時点では、カスタム インベントリとアイテムを使用するプロジェクトを公開することはできません。
実験段階でアセットを作成した場合、下位互換性は保証されません。これらの機能の API は変更される場合があります。実験的機能の全てや特定の機能は当社独自の裁量で削除される場合がありますので、ご注意ください。 この機能を使い始める前に、既知の問題のリストを確認してください。
このチュートリアルでは、プレイヤーがカスタム アイテムをピックアップできるようにし、ピックアップされたアイテムをプレイヤーのインベントリに追加するカスタム「アイテム ピックアップ」インタラクト可能コンポーネントを作成する方法を紹介します。
開始する前に
このチュートリアルを正常に完了するには、UEFN、シーン グラフおよび Verse コードについて十分に理解している必要があります。
プロジェクトを設定する
次の手順に従ってプロジェクトを設定し、カスタム インベントリとアイテムを有効にします。
UEFN を開き、任意の島のテンプレートからプロジェクトを作成します。 島のテンプレートでは、平らな領域を確保して作業したい場合、ブランク プロジェクトを使用することができます。 新しいプロジェクトに名前を付けて、[Create (作成)] をクリックするとエディタで開きます。
ツールバーから、[Project (プロジェクト)] をクリックし、[Project Settings (プロジェクト設定)] を選択します。
[Experimental Access (実験的アクセス)] セクションで、[Custom Items and Inventory (カスタム アイテムとインベントリ)] のボックスをオンにします。
Verse コードを書く
interactable_component は、一般的なインタラクションの処理に使用されるシーングラフ コンポーネントです。 デフォルトでは、プレイヤーは、コンポーネントがあるエンティティとインタラクトする入力を押すことができます。 以下の手順に従って、このコンポーネントをカスタマイズしてください。
interactable_component では、エンティティがインタラクトする mesh_component を持つ必要があります。 オブジェクトが、何かがエンティティとインタラクトしようとしているときに照合できるコリジョンを持っている必要があります。
カスタム インタラクト可能コンポーネントを追加するエンティティを選択します。 [詳細] パネルで + コンポーネントをクリックして、新規 Verse コンポーネントを選択します。 [Create Verse Component (Verse コンポーネントを作成)] ウィンドウが開きます。
Verse Explorer を使用して新しい Verse ファイルを追加することで、Verse コンポーネントを作成することもできます。
テンプレートを選択でシーン グラフ コンポーネントを選択します
下部で、コンポーネント名フィールドに item_interactable_component と入力します。 次に、[Create (作成)] をクリックします。
メニュー バーで、[Verse] > [Verse Explorer] の順にクリックします。 新しい Verse コンポーネントを見つけて右クリックし、Visual Studio Code で開くを選択します。
このチュートリアルでは全体を書くため、新しい Verse ファイルで既存のコードを削除します。 まず、必須モジュールを追加します。 下のスニペットからコピーして貼り付けることができます。
Verseusing { /Verse.org/Simulation } using { /Verse.org/SceneGraph } using { /UnrealEngine.com/Itemization }次に、指定されたプレイヤーからルート インベントリを取得するヘルパー関数を追加します。
VerseGetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component = Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]新しいカスタム コンポーネントを作成する前に、クラスの範囲外の新しいメッセージ タイプ定数を宣言します。 関数がアイテムの
item_details_componentから名前を取得できなかった場合、このメッセージがデフォルト値となります。 通常、Verse ファイルの一番下にこのメッセージ タイプが書かれています。VerseDefaultInteractionMessage<localizes>:message = "Interact"interactable_componentから継承する新しいシーングラフを定義します。 これは、item_interactable_componentです。Verseitem_interactable_component := class(interactable_component) :オプションの
cancelable変数を追加します。 このカスタム コンポーネントは、いつプレイヤーがアイテムとインタラクトしたかを知るためにイベントをサブスクライブする必要があります。 この変数は、そのサブスクリプションへの参照を保存し、必要に応じてキャンセルします。Versevar SucceededEventHandler : ?cancelable = false次に、
OnAddedToScene関数をオーバーライドして、このコンポーネントを所有するエンティの親が変わったとき (ワールド内に配置されたときなど) にオプション変数を設定するようにします。SucceededEventHandlerがSucceededEventでサブスクライブ関数を呼び出すように設定します。 これによって、インタラクションが発生したときに発生するようにOnSucceededEvent関数が定義されます。VerseOnAddedToScene<override>():void = if(not SucceededEventHandler?): set SucceededEventHandler = option{SucceededEvent.Subscribe(OnSucceededEvent)}SucceededEventサブスクリプションは、アイテムがピックアップされるとクリーンアップする必要があり、クリーンアップしないと、アイテムがインベントリ内に入ると他のコードと干渉する可能性があります。 あなた これは、OnRemovingFromScene関数をオーバーライドすることで行うことができます。 これは、アイテム エンティティの親が変わったときにアクティブになります。 ここでは、それを使用して、イベント サブスクリプションにcancel()を実行します。 成功すると、SucceededEventHandlerも無効になります。VerseOnRemovingFromScene<override>():void = if(SucceededEventHandler?.Cancel()): set SucceededEventHandler = falseステップ 10 では、
OnSucceededEvent関数がSucceededEventにサブスクライブされますが、まだコードには存在しません。 そのため、同じ署名で新しい関数を書く必要があります。 ステップ 6 では、ヘルパー関数GetInventoryRoot[]を使用して、インタラクトしているプレイヤーからルート インベントリを取得しました。AddItemDistribute()を呼び出して、このコンポーネントを所有するエンティティを与えましょう。VerseOnSucceededEvent(Agent:agent):void = if(PickupInventory := GetInventoryRoot[Agent]): if(PickupInventory.AddItemDistribute(Entity).GetSuccess[]):このコンポーネントに必要なコードの最後のビットは、
InteractMessage[]関数のオーバーライドです。 これによって、ピックアップする前にプレイヤーがそのアイテムを見た時点で画面に表示されるメッセージが返されます。 これは、item_details_componentもあるかどうかを確認するため、このコンポーネントを所有するエンティティをチェックします。 ある場合、そのアイテムの名前を取得します。 ない場合、エンティティにitem_details_componentがないか、何らかの理由で削除されていれば、すでに宣言したDefaultInteractionMessageを使用します。VerseInteractMessage<override>(Agent:agent)<reads><decides>:message = if(Details := Entity.GetComponent[item_details_component]): Details.Name else: DefaultInteractionMessage
プレハブを設定する
item_interactable_component を書いたので、それを示すためのサンプル アイテムを作成できます。 以下の手順に従って、シーングラフ プレハブを作成し、新しいコンポーネントをアタッチしましょう。
コンテンツブラウザで右クリックし、コンテキスト メニューから [Entity Prefab Definition (エンティティ プレハブ定義)] を選択します。 新しいプレハブ Item_Cube に名前を付けます。
新しいプレハブを開き、[Details (詳細)] パネルで [+Component (+コンポーネント)] をクリックして以下のコンポーネントを追加します。
item_componentitem_details_component- このコンポーネントのフィールドを埋めてください。名前
説明
短い説明
mesh_component- キューブ形プリミティブまたは他のキューブを選択します。item_interactable_component
以下の動画は、item_interactable_component の挙動を示しています。 作成した Item_Cube プレハブにプレイヤーがインタラクトすると、そのアイテムがプレイヤーのインベントリに追加されます。
次にこのチュートリアルの完全なスクリプトを示します。
using { /Verse.org/Simulation }
using { /Verse.org/SceneGraph }
using { /UnrealEngine.com/Itemization }
# This function returns the first subentity with an inventory_component. Use this to get the root inventory of an agent.
GetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component =
Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]