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

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java常量池

目录 1 Class常量池 2 运行时常量池 3 字符串常量池 3.1 为什么要设计字符串常量池 3.2 字符串对象三种创建姿势 3.3 字符串的操作 3.4 字符串的不可变性 4 包装类型常量池 1 Class常量池 class 文件的资源仓库javap命令可以查看class常量池 主要包含字面量和符号引用字面量 由…

C语言-内存管理

1、malloc()函数 用于动态分配一块指定大小的内存&#xff0c;并返回指向这块内存的指针。如果分配失败&#xff0c; 返回 NULL。 int* ptr (int*)malloc(sizeof(int) * 10); // 分配一个包含 10 个整数的内存 if (ptr NULL) {printf("Memory allocation failed!\n&q…

基于ESP32-IDF驱动GPIO输出控制LED

基于ESP32-IDF驱动GPIO输出控制LED 文章目录 基于ESP32-IDF驱动GPIO输出控制LED一、点亮LED3.1 LED电路3.2 配置GPIO函数gpio_config()原型和头文件3.3 设置GPIO引脚电平状态函数gpio_set_level()原型和头文件3.4 代码实现并编译烧录 一、点亮LED 3.1 LED电路 可以看到&#x…

YOLOv5训练自己的数据及rknn部署

YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…

MATLAB 如何避免复杂shp文件对inpolygon的影响

**任务描述&#xff1a;**当我想用inpolygon函数将属于非洲的pixel选出来时&#xff0c;发现因为周边小岛的影响&#xff0c;pixel选取有问题&#xff0c;如下图。 第一种解决办法&#xff1a; 首先将复杂shp文件查分成简单的shp文件&#xff0c;即将不相交的元素分离开 [QGIS…

2025.01春节可用两个带源的TV直播软件

电视直播pro 2.612 论坛的分享: https://tieba.baidu.com/p/9183010315 我的网盘 http://pan.ezdial.cn/nasone/tvbox/%E7%94%B5%E8%A7%86%E7%9B%B4-pro.apk 这个软件挺牛逼的,因为虽然有直播购物,但是里面的频道是真好,有电影解说有电视剧, 最后还能自定义播放源. 唯一不足找…

Ubuntu24.04初始化MySQL报错 error while loading shared libraries libaio.so.1

Ubuntu24.04初始化MySQL报错 error while loading shared libraries: libaio.so.1 问题一&#xff1a;libaio1不存在 # 提示libaio1不存在 [rootzabbix-mysql-master.example.com x86_64-linux-gnu]#apt install numactl libaio1 Reading package lists... Done Building depe…

【Linux】其他备选高级IO模型

其他高级 I/O 模型 以上基本介绍的都是同步IO相关知识点&#xff0c;即在同步I/O模型中&#xff0c;程序发起I/O操作后会等待I/O操作完成&#xff0c;即程序会被阻塞&#xff0c;直到I/O完成。整个I/O过程在同一个线程中进行&#xff0c;程序在等待期间不能执行其他任务。下面…

RV1126+FFMPEG推流项目源码

源码在我的gitee上面&#xff0c;感兴趣的可以自行了解 nullhttps://gitee.com/x-lan/rv126-ffmpeg-streaming-projecthttps://gitee.com/x-lan/rv126-ffmpeg-streaming-project

VMware虚拟机克隆或复制linux后无法上网的解决方案

1.首先转移虚拟机到另一台电脑 【虚拟机转移】超详细的将虚拟机&#xff08;ubuntu&#xff09;从一台电脑复制到另一台电脑教程_虚拟机复制到另一台电脑-CSDN博客 1.先把虚拟机整个文件拷贝到另一台电脑 2。打开vmware&#xff0c;选择打开虚拟机&#xff0c;选择 .vmx 就可…

具有CLI命令和Web界面的WOL

简介 什么是 wol &#xff1f; wol 是一个命令行工具&#xff0c;用于发送唤醒网络上设备的 Wake-On-LAN&#xff08;WOL&#xff09;魔法包。具有命令行界面和网页界面两种功能。本文只介绍了网页界面。 主要特点 功能&#xff1a;通过发送 Wake-On-LAN&#xff08;WOL&…

Vue2:使用sortablejs实现el-table中行拖拽调整顺序

如图,实现拖拽表格中的行来调整行顺序,但是其中的编号仍然是1、2、3、4的顺序,不跟着变化。 实现如下: 一、导入sortablejs import Sortable from "sortablejs";export default { components: {Sortable},data() {return {//数据中的id很重要,拖拽行重新排序…

分布式光纤应变监测是一种高精度、分布式的监测技术

一、土木工程领域 桥梁结构健康监测 主跨应变监测&#xff1a;在大跨度桥梁的主跨部分&#xff0c;如悬索桥的主缆、斜拉桥的斜拉索和主梁&#xff0c;分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况&#xff0c;能够精确捕捉到车辆荷载、风荷…

智能手机“混战”2025:谁将倒下而谁又将突围?

【潮汐商业评论原创】 “去年做手机比较艰难&#xff0c;几乎每个品牌都在调价、压货&#xff0c;像华为这种以前都不给我们分货的厂商&#xff0c;也开始成为我的主要库存。不过今年开头比较好&#xff0c;20号国补一开始&#xff0c;店里的人流和手机销量就明显涨了不少&…

OpenCV文字绘制支持中文显示

OpenCV版本&#xff1a;4.4 IDE&#xff1a;VS2019 功能描述 OpenCV绘制文本的函数putText()不支持中文的显示&#xff0c;网上很多方法推荐的都是使用FreeType来支持&#xff0c;FreeType是什么呢&#xff1f;FreeType的官网上有介绍 FreeType官网 https://www.freetype.or…

MyBatis-Plus的条件构造器和常用接口

一、wrapper介绍 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 ​ AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 ​ QueryWrapper &#xff1a; 查询条件封装 ​ UpdateWrapper &#xff1a; Update 条件封装 ​ Abst…

结合实例分析A2DP SBC帧结构和编解码算法

SBC也就是Sub band codec&#xff0c;俗称子带编码&#xff0c;是蓝牙A2DP必须支持的唯一编码。下面结合实例看看SBC编码数据在蓝牙传输中帧结构以及SBC的编解码算法流程&#xff1a; AVDTP Frame 首先AVDTP Frame是基于L2CAP协议&#xff0c;所以会包含有4个字节的L2CAP头部&…

接口(3)

大家好&#xff0c;今天我们接着上一篇的内容继续往下来看看&#xff0c;了解一下如何实现多个接口&#xff0c;与继承父类不同&#xff0c;一个类可以实现接口&#xff0c;那么话不多说&#xff0c;来看。 2.5实现多个接口. 在Java中,类和类之间是单继承的,一个类只能有一个…

MATLAB提供的颜色映射表colormap——伪彩色

图像处理领域的一个习惯&#xff1a;不是真实的颜色&#xff0c;一般用伪彩色。一是说明不是物体本身的颜色&#xff0c;二是彩色更容易分辨。 MATLAB陆续提供了16种颜色映射表colormap。 之前的都很丑&#xff0c;近5年新增的4种还可以。总的说来还是丑。 这是一种鸟的名字。…

网络安全 | 入侵检测系统(IDS)与入侵防御系统(IPS):如何识别并阻止威胁

网络安全 | 入侵检测系统&#xff08;IDS&#xff09;与入侵防御系统&#xff08;IPS&#xff09;&#xff1a;如何识别并阻止威胁 一、前言二、入侵检测系统&#xff08;IDS&#xff09;2.1 IDS 的工作原理2.2 IDS 的技术类型2.3 IDS 的部署方式 三、入侵防御系统&#xff08;…