当前位置: 首页 > news >正文

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蓝图里把更新信息绑定好,终于行辣!

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

 

相关文章:

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

1 实现思路设计 定义一个结构体记录技能树一个单元的信息&#xff0c;命名为FStrengthenCellInfo&#xff0c;一个TArray记录技能树整体信息&#xff0c;需要以下信息&#xff1a; 1.TArray前置技能index 2.FString 描述文本 3.TArray<FMyItemInfo>激活需要的物品ID和…...

Day35:字符串的大小写转换

在 Python 中&#xff0c;字符串的大小写转换是一个常见的操作&#xff0c;它可以帮助我们快速地将字符串中的字母从大写转换为小写&#xff0c;或者从小写转换为大写。Python 提供了多种方法来进行字符串大小写的转换&#xff0c;包括 upper()、lower()、capitalize()、title(…...

喜报丨迪捷软件入选2025年浙江省“重点省专”

根据《浙江省经济和信息化厅 浙江省财政厅关于进一步支持专精特新中小企业高质量发展的通知》&#xff08;浙经信企业〔2024〕232号&#xff09;有关要求&#xff0c;经企业自主申报、地方推荐、材料初审以及专家评审等程序&#xff0c;浙江省经济和信息化厅发布了2025年浙江省…...

深度剖析 PyTorch框架:从基础概念到高级应用的深度学习之旅!

目录 一、引言 二、PyTorch 简介 &#xff08;一&#xff09;诞生背景与发展历程 &#xff08;二&#xff09;核心特点 三、PyTorch 基础概念 &#xff08;一&#xff09;张量&#xff08;Tensor&#xff09;&#xff1a;数据的基石 &#xff08;二&#xff09;自动微分&…...

基于C++的DPU医疗领域编程初探

一、大型医院数据处理困境与 DPU 的崛起 在数字化浪潮的席卷下,医疗行业正经历着深刻变革,大型医院作为医疗服务的核心枢纽,积累了海量的数据,涵盖患者的基本信息、诊断记录、检验报告、影像资料等多个维度。这些数据不仅规模庞大,而且增长速度迅猛,传统的中央处理器(C…...

Linux 执行 fdisk -l 出现 GPT PMBR 大小不符 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. 问题所示 执行fdisk -l的时候出现如下提示: [root@VMS-Centos-test1 ~]# fdisk -l GPT PMBR 大小不符(419430399 != 4294967295),将用写入予以更正…...

图漾相机搭配VisionPro使用简易教程

1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0 /9.5/9.6版本经测试&#xff0c;可正常打开图漾相机&#xff0c;建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载&#xff1a;https://gitee.com/percipioxyz/camport…...

第一届“启航杯”网络安全挑战赛WP

misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…...

大模型训练策略与架构优化实践指南

标题&#xff1a;大模型训练策略与架构优化实践指南 文章信息摘要&#xff1a; 该分析全面探讨了大语言模型训练、架构选择、部署维护等关键环节的优化策略。在训练方面&#xff0c;强调了pre-training、mid-training和post-training的不同定位与目标&#xff1b;在架构选择上…...

新电脑安装系统找不到硬盘原因和解决方法来了

有不少网友反馈新电脑采用官方u盘方式装win10或win100出现找不到硬盘是怎么回事&#xff1f;后来研究半天发现是bios中开启了rst(vmd)模式。如果关闭rst模式肯定是可以安装的&#xff0c;但这会影响硬盘性能&#xff0c;有没有办法解决开启rst模式的情况安装win10或win11呢&…...

【Linux】21.基础IO(3)

文章目录 3. 动态库和静态库3.1 静态库与动态库3.2 静态库的制作和使用原理3.3 动态库的制作和使用原理3.3.1 动态库是怎么被加载的 3.4 关于地址 3. 动态库和静态库 3.1 静态库与动态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可…...

深度学习算法:从基础到实践

简介 深度学习作为人工智能领域的一个重要分支&#xff0c;近年来在多个领域取得了显著的成就。本文将从基础概念出发&#xff0c;探讨深度学习算法的核心原理&#xff0c;并介绍一些实际应用案例。 深度学习算法的核心概念 深度学习算法基于人工神经网络&#xff0c;通过构…...

27. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表服务

报表是每个记账应用所具备的功能&#xff0c;要实现报表功能就需要把账本的核心功能&#xff08;记账&#xff09;完成&#xff0c;因此报表服务作为本专栏第一部分单体应用开发中最后一个要实现的功能&#xff0c;这一篇文章很简单&#xff0c;我们一起来实现一个简单的报表服…...

coffee销售数据集分析:基于时间趋势分析的实操练习

**文章说明&#xff1a;**对coffee销售数据集的简单分析练习&#xff08;时间趋势分析练习&#xff09;&#xff0c;主要是为了强化利用python进行数据分析的实操能力。属于个人的练习文章。 **注&#xff1a;**这是我第一次使用md格式编辑博客文章&#xff0c;排版上还是不是很…...

【转帖】eclipse-24-09版本后,怎么还原原来版本的搜索功能

【1】原贴地址&#xff1a;eclipse - 怎么还原原来版本的搜索功能_eclipse打开类型搜索类功能失效-CSDN博客 https://blog.csdn.net/sinat_32238399/article/details/145113105 【2】原文如下&#xff1a; 更新eclipse-24-09版本后之后&#xff0c;新的搜索功能&#xff08;CT…...

Centos 修改历史读录( HISTSIZE)

history命令 -c #清空命令历史 -r #读历史文件附加到历史列表 -w #保存历史列表到指定的历史文件 命令历史相关环境变量 HISTSIZE #命令历史记录的条数 HISTFILE #指定历史文件&#xff0c;默认为~/.bash_history HISTFILESIZE #命令历史文件记录历史的条数 以上变量可以 exp…...

lwIP——4 网络接口

1.lwIP网络接口 网络接口&#xff08;网卡&#xff09;&#xff1a;个人理解是处理网络层和数据传输关系的接口&#xff08;tcp/ip协议栈中的网络接口层部分&#xff09;&#xff0c;直接与硬件平台打交道 lwIP协议栈支持多种不同的网络接口&#xff08;网卡&#xff09;&#…...

pytest自动化测试 - pytest夹具的基本概念

<< 返回目录 1 pytest自动化测试 - pytest夹具的基本概念 夹具可以为测试用例提供资源(测试数据)、执行预置条件、执行后置条件&#xff0c;夹具可以是函数、类或模块&#xff0c;使用pytest.fixture装饰器进行标记。 1.1 夹具的作用范围 夹具的作用范围&#xff1a; …...

FreeRtos的使用教程

定义&#xff1a; RTOS实时操作系统, (Real Time Operating System), 指的是当外界事件发生时, 能够有够快的响应速度,调度一切可利用的资源, 控制实时任务协调一致的运行。 特点&#xff1a; 支持多任务管理&#xff0c; 处理多个事件&#xff0c; 实现更复杂的逻辑。 与计算…...

yolov11 解读简记

1 文章详细介绍了YOLOv11的架构设计&#xff0c;包括以下几个关键组件&#xff1a; C3k2块&#xff1a;这是YOLOv11引入的一种新型卷积块&#xff0c;替代了之前版本中的C2f块。C3k2块通过使用两个较小的卷积核代替一个大的卷积核&#xff0c;提高了计算效率&#xff0c;同时保…...

EMQX Dashboard 5.1新手指南:从安装到安全配置的完整流程

EMQX Dashboard 5.1新手指南&#xff1a;从安装到安全配置的完整流程 在物联网和实时消息传递领域&#xff0c;EMQX作为一款高性能的MQTT消息服务器&#xff0c;已经成为众多企业构建可靠物联网平台的首选。而EMQX Dashboard作为其内置的Web管理控制台&#xff0c;在5.1版本中迎…...

JavaScript快速入门:10个基础概念让你轻松掌握编程核心

JavaScript快速入门&#xff1a;10个基础概念让你轻松掌握编程核心 【免费下载链接】You-Dont-Know-JS &#x1f4d7;&#x1f4d2; (PT-Br translation) JS Book Series. 项目地址: https://gitcode.com/gh_mirrors/you/You-Dont-Know-JS JavaScript作为现代Web开发的基…...

通道注意力与空间注意力【实战篇】

1. 通道注意力实战技巧 第一次在项目中引入通道注意力机制时&#xff0c;我对着论文反复调试了三天才跑通。现在回头看&#xff0c;其实核心代码不到20行&#xff0c;但当时确实踩了不少坑。通道注意力最实用的价值在于&#xff1a;它能自动发现哪些特征通道对当前任务更重要。…...

别急着升级glibc!解决scikit-learn的libgomp内存错误,我更推荐这个方法

生产环境避坑指南&#xff1a;如何优雅解决scikit-learn的libgomp内存分配错误 当你的AI服务突然抛出cannot allocate memory in static TLS block错误时&#xff0c;第一反应可能是升级系统库——但请先放下这个危险的念头。作为经历过三次生产环境崩溃的运维老兵&#xff0c;…...

uniapp 抖音生态集成实战:从授权登录到内容发布与社交分享

1. 为什么要在uniapp中集成抖音生态&#xff1f; 对于电商类或内容社区类的uniapp应用来说&#xff0c;抖音生态的集成价值主要体现在三个方面&#xff1a;流量获取、用户增长和内容传播。抖音作为国内最大的短视频平台之一&#xff0c;拥有庞大的用户群体和活跃的内容生态。通…...

小产后吃什么恢复快?科学修护助力身体回归健康

小产对女性身体的损伤不容忽视&#xff0c;气血亏虚、子宫损伤等问题若调理不当&#xff0c;可能留下长期健康隐患。当前&#xff0c;小产后修护已成为女性健康领域的重要关注点&#xff0c;如何通过科学方式实现高效恢复&#xff0c;避免浅层调理带来的后续问题&#xff0c;是…...

S32K144开发环境避坑指南:SDK选择与Segger JLink配置详解

S32K144开发环境避坑指南&#xff1a;SDK选择与Segger JLink配置详解 第一次接触NXP S32K144微控制器时&#xff0c;最令人头疼的莫过于开发环境的搭建。记得去年接手一个汽车电子项目&#xff0c;团队花了整整三天时间才让调试器正常工作——不是因为硬件问题&#xff0c;而是…...

Livekit Server分布式部署实测:手把手教你用Redis搞定多节点,并说清楚它和云服务的根本区别

Livekit Server分布式架构深度实战&#xff1a;Redis多节点部署与云服务本质差异解析 从单机到分布式&#xff1a;突破性能瓶颈的关键抉择 当你的Livekit单机服务开始出现CPU占用率持续超过80%、TURN服务延迟明显增加、房间创建响应时间超过500ms等现象时&#xff0c;就到了必须…...

解决B站视频收藏难题的8K超清下载解决方案:Bilidown全解析

解决B站视频收藏难题的8K超清下载解决方案&#xff1a;Bilidown全解析 【免费下载链接】bilidown 哔哩哔哩视频解析下载工具&#xff0c;支持 8K 视频、Hi-Res 音频、杜比视界下载、批量解析&#xff0c;可扫码登录&#xff0c;常驻托盘。 项目地址: https://gitcode.com/gh_…...

苹果M系列芯片用户必看:三步搞定iOS游戏在Mac上的完美运行方案

苹果M系列芯片用户必看&#xff1a;三步搞定iOS游戏在Mac上的完美运行方案 【免费下载链接】PlayCover Community fork of PlayCover 项目地址: https://gitcode.com/gh_mirrors/pl/PlayCover 还在为Mac上无法畅玩心爱的iOS游戏而烦恼吗&#xff1f;你是否想过&#xff…...