文山网站建设兼职,类似于百度快照的网站,建筑项目查询平台,阿里云邮箱企业版登录1 实现思路设计 定义一个结构体记录技能树一个单元的信息#xff0c;命名为FStrengthenCellInfo#xff0c;一个TArray记录技能树整体信息#xff0c;需要以下信息#xff1a;
1.TArray前置技能index
2.FString 描述文本
3.TArrayFMyItemInfo激活需要的物品ID和…1 实现思路设计 定义一个结构体记录技能树一个单元的信息命名为FStrengthenCellInfo一个TArray记录技能树整体信息需要以下信息
1.TArray前置技能index
2.FString 描述文本
3.TArrayFMyItemInfo激活需要的物品ID和数量
4.bool 是否已经激活 一个新的Save类记录技能树信息 强化条件所有前置技能激活消耗物品全部都够 强化时扣除消耗物品--修改属性--保存属性--更新技能树信息--保存技能树信息--更新UI显示 设计一个道具用来测试ID1 DisplayName源能结晶 CurrentOwnedCnt1000
2 实现过程
2.1 UStrengthenInfoSave
用来保存数据的类实现了GetSet
.cpp:
// Fill out your copyright notice in the Description page of Project Settings.#include StrengthenSystem/StrengthenInfoSave.hTArrayFStrengthenCellInfo UStrengthenInfoSave::GetStrengthenTreeInfo()
{return StrengthenTreeInfo;
}
void UStrengthenInfoSave::SetStrengthenTreeInfo(TArrayFStrengthenCellInfo InStrengthenTreeInfo)
{StrengthenTreeInfo InStrengthenTreeInfo;
} .h:
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include CoreMinimal.h
#include GameFramework/SaveGame.h
#include Items/WarehouseManager.h
#include StrengthenInfoSave.generated.hUSTRUCT(BlueprintType)
struct ARPG_CPLUS_API FStrengthenCellInfo
{GENERATED_USTRUCT_BODY()UPROPERTY(EditAnywhere, BlueprintReadOnly)TArrayint32 PreIndex;UPROPERTY(EditAnywhere, BlueprintReadOnly)FString DescriptionText;UPROPERTY(EditAnywhere, BlueprintReadOnly)TArrayFMyItemInfo NeededItems;UPROPERTY(EditAnywhere, BlueprintReadOnly)bool bIsActivefalse;FStrengthenCellInfo(){PreIndexTArrayint32();NeededItemsTArrayFMyItemInfo();DescriptionText FString(Default);bIsActivefalse;}
};
/*** */
UCLASS()
class ARPG_CPLUS_API UStrengthenInfoSave : public USaveGame
{GENERATED_BODY()
private:TArrayFStrengthenCellInfo StrengthenTreeInfo;
public:UFUNCTION(BlueprintCallable)TArrayFStrengthenCellInfo GetStrengthenTreeInfo();UFUNCTION(BlueprintCallable)void SetStrengthenTreeInfo(TArrayFStrengthenCellInfo InStrengthenTreeInfo);
};
呜呜出现了一个难以解决的bug正在努力找。。。改完回来更新
1.22补充2.2 UStrengthenManager
继承的UObject
实现了下边这几个函数 Save、Load读取和保存到文件里 GetStrengthedCellInfo是按照index读取技能树里的一个单位的信息这里暂时只有一个技能树就是这个StrengthedTree_1
UPROPERTY(EditDefaultsOnly)TArrayFStrengthenCellInfo StrengthenTree_1;UFUNCTION(BlueprintCallable)void Save();UFUNCTION(BlueprintCallable)void Load();UFUNCTION(BlueprintCallable)FStrengthenCellInfo GetStrengthenCellInfo(int index);
具体实现
void UStrengthenManager::Save()
{UStrengthenInfoSave* SaveDataCastUStrengthenInfoSave(UGameplayStatics::CreateSaveGameObject(UStrengthenInfoSave::StaticClass()));SaveData-SetStrengthenTreeInfo(StrengthenTree_1);UGameplayStatics::SaveGameToSlot(SaveData,FString(StrengthenInfo), 0);
}void UStrengthenManager::Load()
{UStrengthenInfoSave* SaveDataCastUStrengthenInfoSave(UGameplayStatics::LoadGameFromSlot(FString(StrengthenInfo), 0));StrengthenTree_1SaveData-GetStrengthenTreeInfo();
}
FStrengthenCellInfo UStrengthenManager::GetStrengthenCellInfo(int index)
{if(index0indexStrengthenTree_1.Num()){return StrengthenTree_1[index];}return FStrengthenCellInfo();
}
还有就是测试用的技能树在构造的时候初始化了 FStrengthenCellInfo SCI_1FStrengthenCellInfo();SCI_1.bIsActive false;SCI_1.DescriptionTextFString(BaseAttack10);TArrayFMyItemInfoNeededItems;NeededItems.Add(FMyItemInfo(1,10,FString(源能结晶)));SCI_1.NeededItemsNeededItems;SCI_1.PreIndexTArrayint32();StrengthenTree_1.Add(SCI_1);SCI_1.bIsActive false;SCI_1.DescriptionTextFString(MaxHealth100);NeededItems.Empty();NeededItems.Add(FMyItemInfo(1,15,FString(源能结晶)));SCI_1.NeededItemsNeededItems;SCI_1.PreIndex{0};StrengthenTree_1.Add(SCI_1);SCI_1.bIsActive false;SCI_1.DescriptionTextFString(BaseResistance10);NeededItems.Empty();NeededItems.Add(FMyItemInfo(1,15,FString(源能结晶)));SCI_1.NeededItemsNeededItems;SCI_1.PreIndex{0};StrengthenTree_1.Add(SCI_1);
1.22补充2.3 UUserWidget_StrengthenPad中的修改
添加了一个接口函数来调用Manager里的Get
FStrengthenCellInfo UUserWidget_StrengthenPad::GetStrengthenCellInfoInterface(int index)
{if(!StrengthenManager)StrengthenManagerNewObjectUStrengthenManager();if(StrengthenManager!nullptr){return StrengthenManager-GetStrengthenCellInfo(index);}return FStrengthenCellInfo();
}
强化的核心是这个函数 所有的需要物品的数量都够了才能进行强化 强化属性 移除消耗物品 更新UI信息 保存数据
//TODO前置技能条件检查
bool UUserWidget_StrengthenPad::TryStrengthenByCellIndex(int index)
{if(!WarehouseManager){UE_LOG(LogTemp,Warning,TEXT(WarehouseManager ptr in UUserWidget_StrengthenPad is Not Valid));return false;}FStrengthenCellInfo tempStrengthenManager-GetStrengthenCellInfo(index);bool bCanStrengthentrue;for(int i0;itemp.NeededItems.Num();i){int OwnedCntWarehouseManager-GetItemInfoByItemId(temp.NeededItems[i].ItemId).CurrentOwnedCnt;if(temp.NeededItems[i].CurrentOwnedCntOwnedCnt)//需要的比有的大则不能强化{bCanStrengthenfalse;}}if(bCanStrengthen){//这里处理强化逻辑注意不要错if(index0){StrengthenByName(FString(BaseAttack),10);for(int i0;itemp.NeededItems.Num();i){WarehouseManager-RemoveItemFromWarehouse(temp.NeededItems[i].ItemId,temp.NeededItems[i].CurrentOwnedCnt);}WarehouseManager-SaveData();UpdatePadInfo();SaveToSlot();return true;}if(index1){StrengthenByName(FString(MaxHealth),100);for(int i0;itemp.NeededItems.Num();i){WarehouseManager-RemoveItemFromWarehouse(temp.NeededItems[i].ItemId,temp.NeededItems[i].CurrentOwnedCnt);}WarehouseManager-SaveData();UpdatePadInfo();SaveToSlot();return true;}if(index2){StrengthenByName(FString(BaseResistance),10);for(int i0;itemp.NeededItems.Num();i){WarehouseManager-RemoveItemFromWarehouse(temp.NeededItems[i].ItemId,temp.NeededItems[i].CurrentOwnedCnt);}WarehouseManager-SaveData();UpdatePadInfo();SaveToSlot();return true;}return false;}return false;
}
3 测试 在UI蓝图里把更新信息绑定好终于行辣 对比一下这俩图相关的参数变化都对其实调了挺久的