UE求职Demo开发日志#7 强化属性完善

1 实现思路设计

        定义一个结构体记录技能树一个单元的信息,命名为FStrengthenCellInfo,一个TArray记录技能树整体信息,需要以下信息:

1.TArray前置技能index

2.FString 描述文本

3.TArray<FMyItemInfo>激活需要的物品ID和数量

4.bool 是否已经激活

        一个新的Save类记录技能树信息

        强化条件:所有前置技能激活,消耗物品全部都够

        强化时:扣除消耗物品-->修改属性-->保存属性-->更新技能树信息-->保存技能树信息-->更新UI显示

        设计一个道具用来测试,ID:1 DisplayName:源能结晶 CurrentOwnedCnt:1000 

2 实现过程

2.1 UStrengthenInfoSave

用来保存数据的类,实现了GetSet

.cpp:

// Fill out your copyright notice in the Description page of Project Settings.#include "StrengthenSystem/StrengthenInfoSave.h"TArray<FStrengthenCellInfo> UStrengthenInfoSave::GetStrengthenTreeInfo()
{return StrengthenTreeInfo;
}
void UStrengthenInfoSave::SetStrengthenTreeInfo(TArray<FStrengthenCellInfo> 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.h"USTRUCT(BlueprintType)
struct ARPG_CPLUS_API FStrengthenCellInfo
{GENERATED_USTRUCT_BODY()UPROPERTY(EditAnywhere, BlueprintReadOnly)TArray<int32> PreIndex;UPROPERTY(EditAnywhere, BlueprintReadOnly)FString DescriptionText;UPROPERTY(EditAnywhere, BlueprintReadOnly)TArray<FMyItemInfo> NeededItems;UPROPERTY(EditAnywhere, BlueprintReadOnly)bool bIsActive=false;FStrengthenCellInfo(){PreIndex=TArray<int32>();NeededItems=TArray<FMyItemInfo>();DescriptionText = FString("Default");bIsActive=false;}
};
/*** */
UCLASS()
class ARPG_CPLUS_API UStrengthenInfoSave : public USaveGame
{GENERATED_BODY()
private:TArray<FStrengthenCellInfo> StrengthenTreeInfo;
public:UFUNCTION(BlueprintCallable)TArray<FStrengthenCellInfo> GetStrengthenTreeInfo();UFUNCTION(BlueprintCallable)void SetStrengthenTreeInfo(TArray<FStrengthenCellInfo> InStrengthenTreeInfo);
};

呜呜出现了一个难以解决的bug,正在努力找。。。,改完回来更新

(1.22补充)2.2 UStrengthenManager

继承的UObject

实现了下边这几个函数:

        Save、Load读取和保存到文件里

        GetStrengthedCellInfo是按照index读取技能树里的一个单位的信息,这里暂时只有一个技能树,就是这个StrengthedTree_1

UPROPERTY(EditDefaultsOnly)TArray<FStrengthenCellInfo> StrengthenTree_1;UFUNCTION(BlueprintCallable)void Save();UFUNCTION(BlueprintCallable)void Load();UFUNCTION(BlueprintCallable)FStrengthenCellInfo GetStrengthenCellInfo(int index);

具体实现:

void UStrengthenManager::Save()
{UStrengthenInfoSave* SaveData=Cast<UStrengthenInfoSave>(UGameplayStatics::CreateSaveGameObject(UStrengthenInfoSave::StaticClass()));SaveData->SetStrengthenTreeInfo(StrengthenTree_1);UGameplayStatics::SaveGameToSlot(SaveData,FString("StrengthenInfo"), 0);
}void UStrengthenManager::Load()
{UStrengthenInfoSave* SaveData=Cast<UStrengthenInfoSave>(UGameplayStatics::LoadGameFromSlot(FString("StrengthenInfo"), 0));StrengthenTree_1=SaveData->GetStrengthenTreeInfo();
}
FStrengthenCellInfo UStrengthenManager::GetStrengthenCellInfo(int index)
{if(index>=0&&index<StrengthenTree_1.Num()){return StrengthenTree_1[index];}return FStrengthenCellInfo();
}

还有就是测试用的技能树在构造的时候初始化了:

	FStrengthenCellInfo SCI_1=FStrengthenCellInfo();SCI_1.bIsActive = false;SCI_1.DescriptionText=FString("BaseAttack+10");TArray<FMyItemInfo>NeededItems;NeededItems.Add(FMyItemInfo(1,10,FString("源能结晶")));SCI_1.NeededItems=NeededItems;SCI_1.PreIndex=TArray<int32>();StrengthenTree_1.Add(SCI_1);SCI_1.bIsActive = false;SCI_1.DescriptionText=FString("MaxHealth+100");NeededItems.Empty();NeededItems.Add(FMyItemInfo(1,15,FString("源能结晶")));SCI_1.NeededItems=NeededItems;SCI_1.PreIndex={0};StrengthenTree_1.Add(SCI_1);SCI_1.bIsActive = false;SCI_1.DescriptionText=FString("BaseResistance+10");NeededItems.Empty();NeededItems.Add(FMyItemInfo(1,15,FString("源能结晶")));SCI_1.NeededItems=NeededItems;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)StrengthenManager=NewObject<UStrengthenManager>();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 temp=StrengthenManager->GetStrengthenCellInfo(index);bool bCanStrengthen=true;for(int i=0;i<temp.NeededItems.Num();i++){int OwnedCnt=WarehouseManager->GetItemInfoByItemId(temp.NeededItems[i].ItemId).CurrentOwnedCnt;if(temp.NeededItems[i].CurrentOwnedCnt>OwnedCnt)//需要的比有的大,则不能强化{bCanStrengthen=false;}}if(bCanStrengthen){//这里处理强化逻辑,注意不要错if(index==0){StrengthenByName(FString("BaseAttack"),10);for(int i=0;i<temp.NeededItems.Num();i++){WarehouseManager->RemoveItemFromWarehouse(temp.NeededItems[i].ItemId,temp.NeededItems[i].CurrentOwnedCnt);}WarehouseManager->SaveData();UpdatePadInfo();SaveToSlot();return true;}if(index==1){StrengthenByName(FString("MaxHealth"),100);for(int i=0;i<temp.NeededItems.Num();i++){WarehouseManager->RemoveItemFromWarehouse(temp.NeededItems[i].ItemId,temp.NeededItems[i].CurrentOwnedCnt);}WarehouseManager->SaveData();UpdatePadInfo();SaveToSlot();return true;}if(index==2){StrengthenByName(FString("BaseResistance"),10);for(int i=0;i<temp.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蓝图里把更新信息绑定好,终于行辣!

        对比一下这俩图,相关的参数变化都对(其实调了挺久的)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7297.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt中QVariant的使用

1.使用QVariant实现不同类型数据的相加 方法&#xff1a;通过type函数返回数值的类型&#xff0c;然后通过setValue来构造一个QVariant类型的返回值。 函数&#xff1a; QVariant mainPage::dataPlus(QVariant a, QVariant b) {QVariant ret;if ((a.type() QVariant::Int) &a…

做Midjourney最好图文教程-提示词公式以及高级参数讲解

先说Midjourney万能公式 填写在绘图提示词框里的内容就是提示词&#xff0c;也叫prompt 用途&#xff1a;让Midjourney生成对应图片&#xff08;符合提示词所描述内容的图片&#xff09;&#xff0c;控制图片生成方向种类&#xff1a;文本提示、图像提示、参数提示&#xff0…

【论文阅读】RAG-Reward: Optimizing RAG with Reward Modeling and RLHF

研究背景 研究问题&#xff1a;这篇文章要解决的问题是如何优化检索增强生成&#xff08;RAG&#xff09;系统&#xff0c;特别是通过奖励建模和人类反馈强化学习&#xff08;RLHF&#xff09;来提高大型语言模型&#xff08;LLMs&#xff09;在RAG任务中的效果。研究难点&…

《Trustzone/TEE/安全从入门到精通-标准版》

CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…

Pyecharts之地图图表的强大功能

在数据可视化领域中&#xff0c;地图图表是一种强大的工具&#xff0c;能够直观地展现与地理位置相关的数据信息&#xff0c;帮助我们更好地洞察数据的地域特征和分布规律。Pyecharts 为我们提供了丰富的地图图表功能&#xff0c;让我们可以轻松实现各种地理信息的可视化展示。…

政安晨的AI大模型训练实践三:熟悉一下LF训练模型的WebUI

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 启动WebUI 微调模型 LLaMA-Factory 支持通过 WebUI 零代码微调大语言模型。 启动Web…

【2024年华为OD机试】(A卷,200分)- 创建二叉树 (JavaScriptJava PythonC/C++)

一、问题描述 构建二叉树并返回根节点 题目描述 请按下列描述构建一颗二叉树,并返回该树的根节点: 先创建值为-1的根结点,根节点在第0层;然后根据operations依次添加节点:operations[i] = [height, index] 表示对第 height 层的第 index 个节点 node,添加值为 i 的子节…

有限元分析学习——Anasys Workbanch第一阶段_终篇_齿轮整体强度案例分析

目录 0 序言 1 齿轮整体强度分析案例 1.1 模型简化 1.2 前处理 1&#xff09;分析类型选择 2&#xff09;设置平面参数 3&#xff09;约束、载荷及接触 2 控制网格 a.初次生成网格&#xff0c;对局部网格不做控制 b.第一次调整接触网格&#xff0c;接触面网格控制为…

Final2x--开源AI图片放大工具

Final2x--开源AI图片放大工具 链接&#xff1a;https://pan.xunlei.com/s/VOHSklukQAquUn3GE7eHJXfOA1?pwdr3r3#

【由浅入深认识Maven】第2部分 maven依赖管理与仓库机制

文章目录 第二篇&#xff1a;Maven依赖管理与仓库机制一、前言二、依赖管理基础1.依赖声明2. 依赖范围&#xff08;Scope&#xff09;3. 依赖冲突与排除 三、Maven的仓库机制1. 本地仓库2. 中央仓库3. 远程仓库 四、 版本管理策略1. 固定版本2. 版本范围 五、 总结 第二篇&…

HTML一般标签和自闭合标签介绍

在HTML中&#xff0c;标签用于定义网页内容的结构和样式。标签通常分为两类&#xff1a;一般标签&#xff08;也称为成对标签或开放闭合标签&#xff09;和自闭合标签&#xff08;也称为空标签或自结束标签&#xff09;。 以下是这两类标签的详细说明&#xff1a; 一、一般标…

(5)STM32 USB设备开发-USB键盘

讲解视频&#xff1a;2、USB键盘-下_哔哩哔哩_bilibili 例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为使用使用STM32模拟USB键盘的例程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的USB键盘。本例子是…

[SUCTF 2018]MultiSQL1

进去题目页面如下 发现可能注入点只有登录和注册,那么我们先注册一个用户&#xff0c;发现跳转到了/user/user.php&#xff0c; 查看用户信息,发现有传参/user/user.php?id1 用?id1 and 11,和?id1 and 12,判断为数字型注入 原本以为是简单的数字型注入&#xff0c;看到大…

阿里云-银行核心系统转型之业务建模与技术建模

业务领域建模包括业务建模和技术建模&#xff0c;整体建模流程图如下&#xff1a; 业务建模包括业务流程建模和业务对象建模 业务流程建模&#xff1a;通过对业务流程现状分析&#xff0c;结合目标核心系统建设能力要求&#xff0c;参考行业建 模成果&#xff0c;形成结构化的…

接口(完)

大家好&#xff0c;今天我们着重来总结一下接口的知识&#xff0c;并且将接口和抽象类的区别罗列一下&#xff0c;帮助我们更好的认识抽象类和接口。 2.7 抽象类和接口的区别. 抽类和接口都是Java中多态的常见使用方式,都需要重点掌握,同时又要认清两者的区别(重要!!&#xf…

windows11关闭系统更新详细操作步骤

文章目录 1.打开注册表2.修改注册表内容2.1 新建文件2.2 修改值 3.修改设置 1.打开注册表 winR输入regedit(如下图所示) 2.修改注册表内容 进HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 2.1 新建文件 右侧界面右键即可 2.2 修改值 重命名为如下…

改进候鸟优化算法之二:基于混沌映射的候鸟优化算法(MBO-CM)

基于混沌映射的候鸟优化算法(Migrating Birds Optimization based on Chaotic Mapping,MBO-CM)是一种结合了混沌映射与候鸟优化算法(Migrating Birds Optimization,MBO)的优化方法。 一、候鸟优化算法(MBO)简介 候鸟优化算法是一种自然启发的元启发式算法,由Duman等人…

Linux学习笔记——网络管理命令

一、网络基础知识 TCP/IP四层模型 以太网地址&#xff08;MAC地址&#xff09;&#xff1a; 段16进制数据 IP地址&#xff1a; 子网掩码&#xff1a; 二、接口管命令 ip命令&#xff1a;字符终端&#xff0c;立即生效&#xff0c;重启配置会丢失 nmcli命令&#xff1a;字符…

力扣hot100-->滑动窗口、贪心

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

Linux_线程控制

线程控制的相关接口 进程创建相关 之前我们已经认识到了pthread_create函数用来创建线程&#xff0c;这里不再赘述。 pthread_self函数 void* routine(void* args) {std::cout << "我是新线程..." << pthread_self() << std::endl;return null…