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

UE求职Demo开发日志#16 实现物品合成表读取和合成逻辑

1 搭建交互Trigger(跟主题无关,一个小改动)

添加枚举定义:

UENUM(BlueprintType)
enum class EMyInterActType : uint8
{
	None=0,
	OpenStrengthenPad UMETA(DisplayName = "OpenStrengthenPad"),
	OpenWareHousePad UMETA(DisplayName = "OpenWareHousePad"),
	PickUpProp UMETA(DisplayName = "PickUpProp"),
};

 在角色类里添加变量记录当前应该响应的类型:

//交互相关
UPROPERTY(EditDefaultsOnly,BlueprintReadWrite,Category = "MyPlayer|InterAct")
EMyInterActType CurrentInterActType=EMyInterActType::None;

在交互时要关闭某些功能的时候,添加对应的逻辑,例如:

if(CurrentInterActType!=EMyInterActType::None)return; 

新建一个Actor放置在场景里,添加重叠事件:

 角色蓝图里的响应逻辑整合一下:

2 搭建合成表信息显示UI (未绑定数据)

空面板:

 将要动态生成的单元:

 

3 创建UInventoryManager

UInventoryManager现在继承的是Actor组件类,以后可能会改

3.1 创建行结构继承FTableRowBase

USTRUCT(BlueprintType)
struct FRecipeRow : public FTableRowBase
{
	GENERATED_BODY()
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	int32 RecipeId;
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	TArray<FMyItemInfo> RequiredMaterials;
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	FMyItemInfo ResultItem;
};

3.2 两个工具函数,一个读取数据表行,一个执行合成逻辑

UFUNCTION(BlueprintCallable)
FRecipeRow GetRecipeRowById(int RecipeId);
UFUNCTION(BlueprintCallable)
bool CraftItem(int RecipeId);

实现:

WarehouseManager的引用先在BeginPlay中设置,先将组件放在Player身上测试

其中打印信息的函数是测试用的

FRecipeRow UInventoryManager::GetRecipeRowById(int RecipeId)
{

	TArray<FName> RowNames= RecipeDataTable->GetRowNames();

	
	for (const auto& RowName : RowNames)
	{
		FRecipeRow* RowData = RecipeDataTable->FindRow<FRecipeRow>(RowName,FString(""),true);

		if (RowData->RecipeId == RecipeId)
		{
			return *RowData;
		}
	}
	return FRecipeRow();
}

bool UInventoryManager::CraftItem(int RecipeId)
{
	FRecipeRow Recipe = GetRecipeRowById(RecipeId);
	if (Recipe.RecipeId==0) return false;
	if(!WarehouseManager)return false;
	WarehouseManager->LogMes();
	for (const FMyItemInfo& Material : Recipe.RequiredMaterials)
	{
		if (!WarehouseManager->RemoveItemFromWarehouse(Material.ItemId, Material.CurrentOwnedCnt))
		{
			return false; // 某种材料不足,合成失败
		}
	}
	WarehouseManager->AddItemToWarehouse(Recipe.ResultItem.ItemId, Recipe.ResultItem.CurrentOwnedCnt, Recipe.ResultItem.DisplayName);
	WarehouseManager->LogMes();
	return true;
}

在数据表中设置测试用的第一行:

 调用测试:

 测试结果:

数据层面是对的,DisplayName先不用管,逻辑还没完善


http://www.kler.cn/a/526336.html

相关文章:

  • 【深度分析】DeepSeek 遭暴力破解,攻击 IP 均来自美国,造成影响有多大?有哪些好的防御措施?
  • 【Block总结】动态蛇形卷积,专注于细长和弯曲的局部结构|即插即用
  • S4 HANA明确税金本币和外币之间转换汇率确定(OBC8)
  • JavaScript系列(50)--编译器实现详解
  • 算法每日双题精讲 —— 前缀和(【模板】一维前缀和,【模板】二维前缀和)
  • 【视频+图文详解】HTML基础3-html常用标签
  • [LeetCode]day4 977.有序数组的平方
  • 【Python】深入理解Python中的装饰器链:创建组合装饰器的技巧与实践
  • 【Block总结】动态蛇形卷积,专注于细长和弯曲的局部结构|即插即用
  • STM32 PWMI模式测频率占空比
  • (持续更新中~~)3、原来可以这样理解C语言_分⽀和循环上(3)条件操作符
  • 使用Python进行大模型的测试与部署
  • 8642 快速排序
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.18 逻辑运算引擎:数组条件判断的智能法则
  • Java中的注解与反射:深入理解getAnnotation(Class<T> annotationClass)方法
  • 在 Linux 上安装 Microsoft TrueType 字体:ttf-mscorefonts-installer 指南
  • 数据结构:线性表查找的三种方式
  • 向下调整算法(详解)c++
  • 指针空值——nullptr(C++11)——提升指针安全性的利器
  • Hive:静态分区(分区语法,多级分区,分区的查看修改增加删除)
  • 无公网IP 外网访问 本地部署夫人 hello-algo
  • 【赵渝强老师】K8s中Pod探针的TCPSocketAction
  • 新年手搓--本地化部署DeepSeek-R1,全程实测
  • Pandas进行MongoDB数据库CRUD
  • 题海拾贝:二叉树遍历
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》028-组件Props属性的高级用法