设计素材网站解析,seo 优化一般包括哪些内容,北京市建设工程质量监督网站,建设网站要服务器吗1 将用到的图标找好#xff0c;放一起 DataTable里对应好图标 测试一下能正确获取#xff1a; 2 装备增强属性思路
给FMyItemInfo添加一个枚举变量记录类型#xff08;物品#xff0c;道具#xff0c;装备#xff0c;饰品#xff0c;武器#xff09;--
扩展DataT…1 将用到的图标找好放一起 DataTable里对应好图标 测试一下能正确获取 2 装备增强属性思路
给FMyItemInfo添加一个枚举变量记录类型物品道具装备饰品武器--
扩展DataTable新建行结构继承FMyItemData增加属性增强数组数组元素为Struct其中的属性为FString,bool isPercent增强百分比或加数值,float value和GA数组(待完善赋予的能力)--
用属性初始化AS时--倍率属性不参与读取的是固定增幅额外增幅应该记录在FMyItemInfo中
获取基础属性--临时的结构体数组记录每个属性增强的百分比和数值
遍历装备列表--
读取并计算装备增幅--获取并赋予GA--
遍历装备列表--
读取并计算饰品增幅--获取并赋予GA--
获取武器id--
读取并计算武器增幅--获取并赋予GA--
每个属性最终先总数值再*总百分比1总增幅百分比
最终属性赋予AS
3 实现过程
3.1 增加枚举类型变量
UENUM(BlueprintType)
enum class EMyItemType : uint8
{None0,Item UMETA(DisplayName Item),Prop UMETA(DisplayName Prop),Arm UMETA(DisplayName Arm),Accessory UMETA(DisplayName Accessory),Weapon UMETA(DisplayName Weapon),
}; 结构体里增加表示类型的变量
struct ARPG_CPLUS_API FMyItemInfo
{GENERATED_USTRUCT_BODY()UPROPERTY(EditAnywhere, BlueprintReadOnly)int32 ItemId;UPROPERTY(EditAnywhere, BlueprintReadOnly)int64 CurrentOwnedCnt;UPROPERTY(EditAnywhere, BlueprintReadOnly)FString DisplayName;UPROPERTY(EditAnywhere, BlueprintReadOnly)EMyItemType ItemType{EMyItemType::Item};FMyItemInfo(int32 ItemId,int64 CurrentOwnedCnt,FString DisplayName) : ItemId(ItemId), CurrentOwnedCnt(CurrentOwnedCnt), DisplayName(DisplayName){}FMyItemInfo(){ItemId 0;CurrentOwnedCnt0;DisplayNameFString(Default);}
};
3.2 添加修改器的结构体并创建要使用的行结构继承FMyItemData
USTRUCT(BlueprintType)
struct ARPG_CPLUS_API FAttributeModifier
{GENERATED_USTRUCT_BODY()UPROPERTY(EditAnywhere, BlueprintReadWrite)FString AttributeName;UPROPERTY(EditAnywhere, BlueprintReadWrite)bool bIsPercent;UPROPERTY(EditAnywhere, BlueprintReadWrite)float PercentValue;UPROPERTY(EditAnywhere, BlueprintReadWrite)float AddedValue;
};
USTRUCT(BlueprintType)
struct ARPG_CPLUS_API FAttrModItemData:public FMyItemData
{GENERATED_USTRUCT_BODY()UPROPERTY(EditAnywhere, BlueprintReadWrite)TArrayFAttributeModifier AttributeMods;UPROPERTY(EditAnywhere, BlueprintReadWrite)TArrayTSubclassOfUGameplayAbility GAsToAdd;
};
3.3 MyPlayerAttributeSet里的计算逻辑
话不多说了逻辑太长了
核心逻辑
传入的是要检查的所有装备饰品等的Id
考虑所有物品的所有属性的修改幅值最后应用修改器
void UMyPlayerAttributeSet::ModAttribute(TArrayint ItemsId)
{LogBaseValueMes();TArrayFAttributeModifier Sum{};//不受bIsPercent限制for(int i:ItemsId){CalModMagnitude(i,Sum);}UE_LOG(LogTemp,Warning,TEXT(Sum[0]--ModName%s PercentValue%f AddedValue%f),*Sum[0].AttributeName,Sum[0].PercentValue,Sum[0].AddedValue);for(FAttributeModifier Modifier:Sum){UE_LOG(LogTemp,Warning,TEXT(Sum--ModName%s PercentValue%f AddedValue%f),*Modifier.AttributeName,Modifier.PercentValue,Modifier.AddedValue);ApplyModifier(Modifier);}LogBaseValueMes();
}
以下是功能的具体实现
void UMyPlayerAttributeSet::CalModMagnitude(int ItemId,TArrayFAttributeModifier Modifiers)
{if(!BuffItemsDataTable)return;// 获取DataTable的所有行TArrayFName RowNames BuffItemsDataTable-GetRowNames();// 遍历找到ItemId对应的装备for (const auto RowName : RowNames){FAttrModItemData* RowData BuffItemsDataTable-FindRowFAttrModItemData(RowName,FString(),true);if (RowData-ItemId ItemId){for(FAttributeModifier ModifierToCal:RowData-AttributeMods)//遍历ItemId对应的装备的所有增强属性{//对于每一个要增强的属性bool bIsFind{false};//先记录最终修改器里有没有这个属性for(FAttributeModifier Modifier:Modifiers){if(Modifier.AttributeName.Equals(ModifierToCal.AttributeName))//找到了对应的属性{bIsFindtrue;//标记为找到了if(ModifierToCal.bIsPercent)//根据是否百分比增幅累加对应值{Modifier.PercentValueModifierToCal.PercentValue;UE_LOG(LogTemp,Warning,TEXT(Percent%f),Modifier.PercentValue);}else{Modifier.AddedValueModifierToCal.AddedValue;}//UE_LOG(LogTemp,Warning,TEXT(ModName%s PercentValue%f AddedValue%f),*Modifier.AttributeName,Modifier.PercentValue,Modifier.AddedValue);break;}}if(!bIsFind){//要保证没用到的值为0Modifiers.Add(ModifierToCal);}//UE_LOG(LogTemp,Warning,TEXT(ModToCal--ModName%s PercentValue%f AddedValue%f),*ModifierToCal.AttributeName,ModifierToCal.PercentValue,ModifierToCal.AddedValue);//UE_LOG(LogTemp,Warning,TEXT(OnEveryModAttribute));}//TODO:赋予能力}}
}void UMyPlayerAttributeSet::ApplyModifier(FAttributeModifier Modifier)
{if(Modifier.AttributeName.Equals(FString(MaxHealth))){FinalModAttribute(Modifier,MaxHealth);return;}if(Modifier.AttributeName.Equals(FString(MaxStamina))){FinalModAttribute(Modifier,MaxStamina);return;}if(Modifier.AttributeName.Equals(FString(BaseAttack))){FinalModAttribute(Modifier,BaseAttack);return;}if(Modifier.AttributeName.Equals(FString(BaseStagger))){FinalModAttribute(Modifier,BaseStagger);return;}if(Modifier.AttributeName.Equals(FString(BaseResistance))){FinalModAttribute(Modifier,BaseResistance);return;}if(Modifier.AttributeName.Equals(FString(CRT))){FinalModAttribute(Modifier,CRT);return;}if(Modifier.AttributeName.Equals(FString(CriticalDamage))){FinalModAttribute(Modifier,CriticalDamage);return;}UE_LOG(LogTemp,Warning,TEXT(ApplyModifier--Attribute is mistake));
}void UMyPlayerAttributeSet::FinalModAttribute(const FAttributeModifier Modifier,FGameplayAttributeData Attribute)
{//UE_LOG(LogTemp,Warning,TEXT(FinalModAttribute--ModName%s PercentValue%f AddedValue%f),*Modifier.AttributeName,Modifier.PercentValue,Modifier.AddedValue);Attribute.SetBaseValue((Attribute.GetBaseValue()Modifier.AddedValue)*(1Modifier.PercentValue));Attribute.SetCurrentValue(Attribute.GetBaseValue());
}
3.4 测试
测试调用
ModAttribute(TArrayint {100});
对应的测试数值 修改前后属性变化 4 背包模块中添加装备栏
暂定三个装备栏头胸甲鞋先不管设定
还是FMyItemInfo类型的数组012记录
先把组件创建在脚本里
//MyPlayer.h
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UBagManager* BagManager;
//MyPlayer.cpp
AMyPlayer::AMyPlayer(){......BagManagerCreateDefaultSubobjectUBagManager(TEXT(BagManager));//......
}
更新以下Bag保存相关的函数例如
Save-SetItemsInBag(ItemsInBag,Armor);
BeginPlay里调用计算并修改属性逻辑
TArrayint ModsId{};
for(FMyItemInfo info:BagManager-Armor)
{ModsId.Add(info.ItemId);
}
CastUMyPlayerAttributeSet(AttributeSet)-ModAttribute(ModsId);
BagUI里添加一个栏位显示相关信息 运行测试 还好没啥问题属性也对不然今天不知道要调到啥时候了之后的装备和卸下装备的操作和逻辑就简单了只要修改Armor数组然后重新调用ModAtrribute就行了