jpnInventory - B477042/GraduationProject GitHub Wiki
Inventoryと関連するアイテムに対する実装説明です。
ゲームでアイテムをどのように保存するかについて分析·実装してみました。
アイテム固有のIDが必要だと思い、「FName Tag」という変数を宣言しました。
このとき、UE4のTagシステムが分からなかったので、同じ名前の変数を作ってしまいました。
後で知りはしましたが、そのまま使うことにしました。
Back to Planning & Implementation
class ESCAPEGAME_API UComponent_Inventory : public UActorComponent
{
UPROPERTY(EditAnywhere, Category = "Items")
TMap<FName, FItemDataInfo> Items;
}
USTRUCT(BlueprintType, meta = (ToolTip = "インベントリに保存されるアイテムに関する情報"))
struct FItemDataInfo
{
GENERATED_BODY()
public:
FItemDataInfo() { Item = nullptr; n_item = 0; }
private:
//Sort of this item
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
TWeakObjectPtr<AItemActor> Item;
UPROPERTY(Transient, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
int n_item;
};
Inventory内部にアイテムIDとして使用されている「FName Tag」変数を利用して、アイテム情報をMapを利用して保存する方法が用いられました。
- Key値のアイテムが存在する場合、FItemDataInfoの数の値を調節します。
- Key値のアイテムをすべて使用した場合は、Itemsから除外することにしました。
- Key値のアイテムがない場合、新たに追加されるようにしました。
アイテムに対する情報を得るため、そのアイテムをWeak pointerにアクセスしました。
class ESCAPEGAME_API AItemActor : public AActor
{
public:
//子供たちでtagを必ず定義しないといけません。
virtual FName GetTag()PURE_VIRTUAL(AItemActor::GetTag,return TEXT("Default") ;);
protected:
//このアイテムを持っているエクトルです。
UPROPERTY(VisibleAnywhere)
ACharacter* OwnerActor;
//アイテムをPlayerが拾った場合、有効にならなくなります。
UPROPERTY(VisibleAnywhere)
bool bIsItemVaild;
}
Item Actorの親クラスですので、Purevirtualを利用してTagに対する部分を必ず作るようにしました。
Vaildしないアイテムはレベルで無効化されました。
Save & Loadを実現するのが思ったより難しかったです。
FItemDataInfoの構造上、アイテムを使用するためには当該アイテムのうち一つを指し示す必要があったからです。
構造を変えるべきか悩んだ末、アイテムを指せばいいのでInventoryにあるアイテムリストを保存しました。
その後、Loadするときにリストにあるアイテムならスポンサーさせて、そのアイテムを指さしました。
無効化状態にしておくと、ゲームに影響を与えにくいからです。
そして、ItemActorでPlayerに拾われたときは無効化状態でLoadされるようにしました。
ゲームをしながら観察したものを基に作ったので、本来の役割を果たすことに集中していました。