UE5 模仿生存建造类游戏创建的过程
一、大概流程如下
点击界面按钮生成Actor->移动鼠标Actor的位置随着鼠标移动移动->点击鼠标左键确定Actor的位置
使用了盒体检测GetWorld()->SweepSingleByChannel()函数检测是否发生碰撞通过 FCollisionQueryParams CollisionParams;CollisionParams.AddIgnoredActor(AActor*);将盒体附加在某个Actor忽略
SweepSingleByChannel参数是 当起始位置和结束位置相同时检测当前物体和其他物体是否重叠,参数不同检测从位置开始到位置结束的这段距离根据碰撞形状检测物体是否会发生碰撞
FCollisionQueryParams CollisionParams;
CollisionParams.AddIgnoredActor(PreviewBuilding); // 忽略附加到的ActorFHitResult HitResult;
bool bHit = World->SweepSingleByChannel(HitResult, // 碰撞结果Location, // 起始位置Location, // 结束位置Rotation.Quaternion(), // 旋转ECC_WorldDynamic, // 使用适合你项目的碰撞通道FCollisionShape::MakeBox(Extents), // 碰撞的形状CollisionParams // 碰撞参数
);
关于使用SetHiddenInGame();SetVisibility();的一点问题
当多次调用这两个函数,并且函数的参数没有改变,在另一个地方想改变参数比如SetHiddenInGame(false)变成SetHiddenInGame(true),SetHiddenInGame(true)函数会设置成功,但是游戏中不会产生对应的反应,也就是注意不要把etHiddenInGame();SetVisibility();放在循环中去执行多变
如何在点击按钮后知道生成Actor的位置
使用FHitResult HitResult;GetHitResultUnderCursor(ECC_Visibility, false, HitResult); 本质上GetHitResultUnderCursor也是一种射线检测的方法
获得鼠标的位置的方法(在PlayController中)
DeprojectMousePositionToWorld(); // 获得三维世界中鼠标的位置
GetMousePosition();// 获得屏幕上鼠标的位置
鼠标左键确定actor位置的方法
因为我在点击按钮后直接生成了Actor,在鼠标移动时使用SetActorLocation();函数改变了Actor的位置,所以在点击鼠标左键后使用 InputComponent->RemoveAxisBinding("BuildMouseXY");将鼠标移动的处理函数接触绑定即可
被生成的Actor有哪些组件,一个UStaticMeshComponent和一个UBoxComponent,手动调整UBoxCompnent的大小和包围的物体
改进完善可以创建碰撞和无碰撞的两种材质,通过SetMetrial进行设置
二、创建子系统
我想实现一个用于整个游戏专门处理建造逻辑的类,创建类UBuildSubsystem父类是UGameInstanceSubsystem,
UGameInstanceSubsystem的声明周期是游戏开始到游戏结束,在UE编辑器中对游戏进行调试时点击结束按钮UGameInstanceSubsystem不会被销毁
获得方法
1.使用PlayController中
PlayerController->GetGameInstance()->GetSubsystem<UBuildSubsystem>();
2.使用World指针
World->GetGameInstance()->GetSubsystem<UBuildSubsystem>();
3.使用Gengine
GEngine->GetCurrentPlayWorld()->GetGameInstance()->GetSubsystem<UBuildSubsystem>();
三、在BuildSubSystem中实现生成Actor,改变Actor的碰撞框颜色,进行碰撞查询,设置Actor的位置的功能
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "BuildSubsystem.generated.h"/*** */
UCLASS()
class AFARMSIMULATION_API UBuildSubsystem : public UGameInstanceSubsystem
{GENERATED_BODY()public:virtual void Initialize(FSubsystemCollectionBase& Collection) override;virtual void Deinitialize() override;private:// 执行碰撞检测bool CheckBuildLocation(const FVector& Location, const FRotator& Rotation, const FVector& Extents) const;UPROPERTY()AActor* PreviewBuilding; // 生成的Actor// 建造系统生成Actor函数bool BuildSystemSpawnActor(TSubclassOf<AActor> BuildingTemplate, const FVector& Location, const FRotator& Rotation, FActorSpawnParameters SpawnParams);// 设置碰撞框的颜色void SetCollisionBoxColor();public:// 生成ActorUFUNCTION(BlueprintCallable, Category = "Build System")bool ShowPreview(TSubclassOf<AActor> BuildingTemplate, const FVector& Location, const FRotator& Rotation);//销毁ActorUFUNCTION(BlueprintCallable, Category = "Build System")void DestoryCurrentActor();// 改变Actor的位置UFUNCTION(BlueprintCallable, Category = "Build System")void ChangePreviewActorPosition(FVector position);// 设置碰撞框在游戏中的可见性void SetCollisionBoxVisibilityHide();// 获得当前的位置是否合适bool GetCurrentIsRight();// 记录Actor的位置UPROPERTY(VisibleAnywhere, Category = "Build System")FVector SpawnLocation;
};
#include "BuildSubsystem.h"
#include "Components/BoxComponent.h"
#include "Kismet/GameplayStatics.h"
#include "Engine/World.h"void UBuildSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{Super::Initialize(Collection);SpawnLocation = FVector::ZeroVector;
}void UBuildSubsystem::Deinitialize()
{Super::Deinitialize();
}bool UBuildSubsystem::CheckBuildLocation(const FVector& Location, const FRotator& Rotation, const FVector& Extents) const
{UWorld* World = GetWorld();if (!World) return false;//UE_LOG(LogTemp, Warning, TEXT("Location is : %s -- Extents is : %s"), *Location.ToString() , *Extents.ToString());// 设置碰撞查询参数FCollisionQueryParams CollisionParams;CollisionParams.AddIgnoredActor(PreviewBuilding); // 忽略自身// 执行盒体追踪检测FHitResult HitResult;bool bHit = World->SweepSingleByChannel(HitResult,Location,Location,Rotation.Quaternion(),ECC_WorldDynamic, // 使用适合你项目的碰撞通道FCollisionShape::MakeBox(Extents),CollisionParams);//if (HitResult.GetActor())//{// UE_LOG(LogTemp, Warning, TEXT("%s hitname = %s") , *HitResult.BoneName.ToString() , *HitResult.GetActor()->GetName());//}//DrawDebugBox(GetWorld(), Location, Extents , FColor::Blue);//if (bHit)//{// UE_LOG(LogTemp, Warning, TEXT("bHit is true"));//}//else//{// UE_LOG(LogTemp, Warning, TEXT("bHit is false"));//}//UBoxComponent* BoxComponent = PreviewBuilding->GetComponentByClass<UBoxComponent>();//if (BoxComponent)//{// BoxComponent->OnComponentHit//}return bHit;
}bool UBuildSubsystem::BuildSystemSpawnActor(TSubclassOf<AActor> BuildingTemplate, const FVector& Location, const FRotator& Rotation, FActorSpawnParameters SpawnParams)
{UWorld* World = GetWorld();if (!World) return false;PreviewBuilding = World->SpawnActor<AActor>(BuildingTemplate,Location,Rotation,SpawnParams);if (PreviewBuilding){TArray<UBoxComponent*> BoxComponents;PreviewBuilding->GetComponents<UBoxComponent>(BoxComponents);for (auto ite : BoxComponents){ite->SetHiddenInGame(false); // 关键:在游戏中显示ite->SetVisibility(true, true);ite->SetLineThickness(2.0f); // 设置线框粗细}return true;}return false;
}void UBuildSubsystem::SetCollisionBoxColor()
{TArray<UBoxComponent*> BoxComponents;PreviewBuilding->GetComponents<UBoxComponent>(BoxComponents);for (int i = 0; i < BoxComponents.Num(); i++){FVector BoxExtents = BoxComponents[i]->GetScaledBoxExtent();FVector BoxLocation = BoxComponents[i]->GetComponentLocation();FRotator BoxRotation = BoxComponents[i]->GetComponentRotation();bool bFlag = CheckBuildLocation(BoxLocation, BoxRotation, BoxExtents);// 检查位置是否可用if (bFlag){// 有碰撞 红色BoxComponents[i]->ShapeColor = FColor::Red;//UE_LOG(LogTemp, Warning, TEXT("有碰撞"));}else{// 无碰撞 绿色BoxComponents[i]->ShapeColor = FColor::Green;}}
}bool UBuildSubsystem::ShowPreview(TSubclassOf<AActor> BuildingTemplate, const FVector& Location, const FRotator& Rotation)
{if (!BuildingTemplate) return false; //if (PreviewBuilding) PreviewBuilding->Destroy();// 创建预览建筑FActorSpawnParameters SpawnParams;SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;if (BuildSystemSpawnActor(BuildingTemplate, Location, Rotation, SpawnParams)){SpawnLocation = Location;}else{SpawnLocation = FVector::ZeroVector;return false;}SetCollisionBoxColor();return true;
}void UBuildSubsystem::DestoryCurrentActor()
{if (PreviewBuilding){PreviewBuilding->Destroy();PreviewBuilding = nullptr;}
}void UBuildSubsystem::ChangePreviewActorPosition(FVector position)
{if (PreviewBuilding == nullptr) return;PreviewBuilding->SetActorLocation(position);SpawnLocation = position;SetCollisionBoxColor();
}void UBuildSubsystem::SetCollisionBoxVisibilityHide()
{TArray<UBoxComponent*> BoxComponents;PreviewBuilding->GetComponents<UBoxComponent>(BoxComponents);for (int i = 0; i < BoxComponents.Num(); i++){BoxComponents[i]->SetHiddenInGame(true); BoxComponents[i]->SetVisibility(false, true);BoxComponents[i]->SetLineThickness(0.0f); // 设置线框粗细BoxComponents[i]->SetComponentTickEnabled(false);UE_LOG(LogTemp, Warning, TEXT("Component Valid: %d"), IsValid(BoxComponents[i]));UE_LOG(LogTemp, Warning, TEXT("HiddenInGame: %d"), BoxComponents[i]->bHiddenInGame);}PreviewBuilding->SetActorLocation(SpawnLocation);
}bool UBuildSubsystem::GetCurrentIsRight()
{TArray<UBoxComponent*> BoxComponents;PreviewBuilding->GetComponents<UBoxComponent>(BoxComponents);for (int i = 0; i < BoxComponents.Num(); i++){if (BoxComponents[i]->ShapeColor == FColor::Red){return false;}}return true;
}
四、HUD界面绑定按钮回调函数
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "BuildWidget.generated.h"class UButton;
/*** */
UCLASS()
class AFARMSIMULATION_API UBuildWidget : public UUserWidget
{GENERATED_BODY()protected:virtual bool Initialize() override;private:UFUNCTION()void CreateHouseMesh();public:UPROPERTY(meta = (BindWidget))UButton* ButtonHouse;
};
#include "BuildWidget.h"
#include "Components/Button.h"
#include "AFarmSimulation/Controller/AFarmPlayerController.h"
#include "Kismet/GameplayStatics.h"
#include "AFarmSimulation/SystemSystem/BuildSubsystem.h"bool UBuildWidget::Initialize()
{if (!Super::Initialize()){return false;}if (ButtonHouse){ButtonHouse->OnClicked.AddDynamic(this , &UBuildWidget::CreateHouseMesh);}return true;
}void UBuildWidget::CreateHouseMesh()
{//UE_LOG(LogTemp, Warning, TEXT("CreateHouseMesh"));UWorld* World = GetWorld();if (World){AAFarmPlayerController* PlayerController = Cast<AAFarmPlayerController>(UGameplayStatics::GetPlayerController(World, 0));if (PlayerController){PlayerController->OpenBuildMode();}}
}
五、在PlayController中实现界面按钮点击后的执行逻辑,创建鼠标移动的处理的事件
public:void MouseLeftClicked();void OpenBuildMode();void MouseXY(float XY);UPROPERTY(EditAnywhere)TSubclassOf<class ATreeActor> TreeClass;FVector SpawnLocation;
void AAFarmPlayerController::MouseLeftClicked()
{UBuildSubsystem* Build = GetGameInstance()->GetSubsystem<UBuildSubsystem>();if (Build->GetCurrentIsRight()){Build->SetCollisionBoxVisibilityHide();InputComponent->RemoveActionBinding("MouseLeftClicked", IE_Pressed);InputComponent->RemoveAxisBinding("BuildMouseXY");}
}void AAFarmPlayerController::OpenBuildMode()
{InputComponent->BindAction("MouseLeftClicked", IE_Pressed, this, &AAFarmPlayerController::MouseLeftClicked);InputComponent->BindAxis("BuildMouseXY", this, &AAFarmPlayerController::MouseXY);FHitResult HitResult;GetHitResultUnderCursor(ECC_Visibility, false, HitResult); // ECC_Visibility 表示检测可见物体FRotator Ratotor(0, 0, 0);UBuildSubsystem* Build = GetGameInstance()->GetSubsystem<UBuildSubsystem>();if (Build){//UE_LOG(LogTemp, Warning, TEXT("Build is success"));if (Build->ShowPreview(TreeClass, HitResult.Location, Ratotor)){SpawnLocation = HitResult.Location;}}
}void AAFarmPlayerController::MouseXY(float XY)
{FHitResult HitResult;GetHitResultUnderCursor(ECC_WorldStatic, false, HitResult); // ECC_Visibility 表示检测可见物体UBuildSubsystem* Build = GetGameInstance()->GetSubsystem<UBuildSubsystem>();FRotator Ratotor(0, 0, 0);if (Build){Build->ChangePreviewActorPosition(HitResult.Location);}}
相关文章:
UE5 模仿生存建造类游戏创建的过程
一、大概流程如下 点击界面按钮生成Actor->移动鼠标Actor的位置随着鼠标移动移动->点击鼠标左键确定Actor的位置 使用了盒体检测GetWorld()->SweepSingleByChannel()函数检测是否发生碰撞通过 FCollisionQueryParams CollisionParams;CollisionParams.AddIgnoredAc…...
大模型在慢性髓细胞白血病(CML)初治成人患者诊疗中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与 CML 相关知识 2.1 大模型技术原理与特点 2.2 CML 的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模型预测术前风险 3.3 根据预测…...
汽车性能的幕后保障:慧通测控电动尾翼综合力学测试浅析
在汽车性能不断追求极致的当下,电动尾翼已成为众多高性能车型以及部分新能源汽车提升空气动力学表现与操控稳定性的关键配置。从炫酷的超跑到注重续航与驾驶体验的新能源车,电动尾翼正逐渐崭露头角。它绝非仅仅是外观上的装饰,而是能在车辆行…...
动力电池自动点焊机:新能源汽车制造的智能焊接利器
在新能源汽车产业蓬勃发展的今天,动力电池作为其核心部件,其性能与安全性直接关系到整车的续航里程和使用寿命。而动力电池的制造过程中,焊接工艺是至关重要的一环。这时,动力电池自动点焊机便以其高效、精准、智能的特点…...
arm64架构的copy_from_user分析
文章目录 前言代码实现内核c代码copy_from_user_copy_from_userraw_copy_from_user 内核汇编代码copy_from_user.Scopy_template.S 汇编代码分析汇编简介标签.req伪指令.macro伪指令tbz指令neg指令str指令 copy_template.S分析 小结 前言 一谈到内核-用户空间的数据拷贝&#…...
【远程工具】1.1 时间处理设计与实现(datetime库lib.rs)
一、设计原理与决策 时间单位选择 采用**秒(s)**作为基准单位,基于以下考虑: 国际单位制(SI)基本时间单位 整数秒(i64)方案优势: 精确无误差(相比浮点数&am…...
【STM32】解读启动文件startup_stm32f10x_md.s
栈空间 栈(Stack):栈是一种后进先出(LIFO)的数据结构,用于存储函数调用时的局部变量、返回地址和寄存器的值。启动文件会定义栈的大小,并将栈指针初始化为栈顶地址。在函数调用时,…...
Redis下载稳定版本5.0.4
https://www.redis.net.cn/download/ Redis下载 Redis 版本号采用标准惯例:主版本号.副版本号.补丁级别,一个副版本号就标记为一个标准发行版本,例如 1.2,2.0,2.2,2.4,2.6,2.8,奇数的副版本号用来表示非标准版本,例如2.9.x发行版本是Redis 3.0标准版本的非标准发行版本…...
阿里云服务迁移实战: 02-服务器迁移
ECS 迁移 最简单的方式是 ECS 过户,不过这里有一些限制,如果原账号是个人账号,那么目标账号无限制。如果原账号是企业账号,则指定过户给相同实名认证的企业账号。 具体操作步骤可以参考官方文档 ECS过户 进行操作。 本文重点介绍…...
怎么解决CentOS上Zookeeper启动失败的问题
在 CentOS 上启动 Zookeeper 失败通常是由于配置错误、端口冲突、权限问题或 Java 环境配置问题导致的。我们可以逐步排查: 一、查看错误日志 Zookeeper 的日志目录一般在: /your-zookeeper-path/logs/zookeeper.out 或者: /your-zookeeper-p…...
《Vue3学习手记》
下面进入Vue3的学习,以下代码中都有很详细的注释,代码也比较清晰易懂: Vue3 index.html是入口文件 Vue3通过createApp函数创建一个应用实例 main.ts: // Vue3中通过createApp函数创建应用实例 // 引入createApp用于创建应用 import { crea…...
【Ubutun】 在Linux Yocto的基础上去适配4G模块
1)、完整解决流程总结 一. 固定4G模块的网络接口名 usb0(基于物理路径) # 创建UDEV规则文件 sudo vi /etc/udev/rules.d/10-4g-rename.rules添加内容: SUBSYSTEM"net", ACTION"add", ATTRS{busnum}"2&…...
达梦数据库-学习-15-大内存SQL相关视图介绍
目录 一、环境信息 二、介绍 三、数据字典表 1、V$MEM_POOL 2、V$SQL_STAT 3、V$SQL_STAT_HISTORY 4、V$LARGE_MEM_SQLS 5、V$SYSTEM_LARGE_MEM_SQLS 四、总结 一、环境信息 名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Co…...
分治-归并系列一>翻转对
目录 题目:解析:策略一: 代码:策略二: 代码: 题目: 链接: link 这题和逆序对区别点就是,要找到前一个元素是后一个元素的2倍 先找到目标值再,继续堆排序 解析࿱…...
微服务面试题
五大组件 注册中心/配置中心 nacos 服务注册 服务启动时 将自己的id等信息发送给nacos 完成注册 服务发现 服务需要调用其他服务时 从nacos获取服务列表 交给负载均衡选择 服务监控 临时实例 由服务每隔一段时间注册中心发送信息 表示自己存活 若注册中心超过一定时间没有…...
高级java每日一道面试题-2025年3月31日-微服务篇[Nacos篇]-Nacos集群模式下的部署方案有哪些?
如果有遗漏,评论区告诉我进行补充 面试官: Nacos集群模式下的部署方案有哪些? 我回答: Nacos 集群模式下的部署方案详解 在 Java 高级面试中,Nacos 集群部署是考察候选人对分布式系统高可用性和扩展性理解的重要议题。以下是几种常见的 Nacos 集群部…...
3dmax的python通过普通的摄像头动捕表情
1、安装python 进入cdm,打python要能显示版本号 >>>(进入python提示符模式) import sys sys.path显示python的安装路径, 进入到python.exe的路径 在python目录中安装(ctrlz退出python交互模式) 2、pip install mediapipe…...
vue3+vite Cannot find module ‘@/XXXXXX‘ or its corresponding type declarations
在使用vue3vite 创建新的工程时会出现Connot find module /xxx错误,根本原因是vite 中没有配置跟目录别名导致的,可以在vite.config.ts 中增加如下配置 如果在tsconfig.json中增加 "compilerOptions": {"paths": {"/*": …...
vmware-exporter容器
vmware-exporter干嘛的,需要的都知道,不再赘述,如果你不了解,说明你也用不到,此文可略过。 如果你嫌自行部署比较麻烦,可移步https://download.csdn.net/download/qq_28608175/90595900下载容器打包文件&a…...
异形遮罩之QML中的 `OpacityMask` 实战
文章目录 🌧️ 传统实现的问题👉 效果图 🌈 使用 OpacityMask 的理想方案👉代码如下🎯 最终效果: ✨ 延伸应用🧠 总结 在 UI 设计中,经常希望实现一些“异形区域”拥有统一透明度或颜…...
代码随想录算法训练营Day27 | Leetcode 56. 合并区间、738.单调递增的数字、968.监控二叉树
代码随想录算法训练营Day27 | Leetcode 56.合并区间、738.单调递增的数字、968.监控二叉树 一、合并区间 相关题目:Leetcode56 文档讲解:Leetcode56 视频讲解:Leetcode56 1. Leetcode56. 合并区间 以数组 intervals 表示若干个区间的集合&am…...
【SQL】常见SQL 行列转换的方法汇总 - 精华版
【SQL】常见SQL 行列转换的方法汇总 - 精华版 一、引言二、SQL常见的行列转换对比1. 行转列 Pivoting1.1 CASE WHEN 聚合函数1.2 IF 聚合函数1.3 PIVOT操作符 2.列转行 Unpivoting2.1 UNION ALL2.2 EXPLODE函数(Hive/Spark&#…...
docx文档转为pdf文件响应前端
1、转换文件(docx~pdf) 1.引入pom依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>20.12.0</version> </dependency>2.读取docx文档数据-转换 // 初…...
python办公自动化------word转换pdf
需要安装包:docx2pdf 例1:将docx文件转换为pdf文件 from docx2pdf import convertconvert("./dataFile/test_doc.docx", "./dataFile/测试文件转换.pdf") 运行结果:...
cs224w课程学习笔记-第10课
cs224w课程学习笔记-第10课 异构图 前言一、异构图1、异构图定义2、异构图与同构图 二、异构图下的GNN1、GCN扩展至RGCN1.1 RGCN原理1.2 异构图的任务预测特点1.3 异构图任务预测基础案例 2、完整的异构图GCN三、异构图下的Transformer 前言 异构图的定义是节点内部存在类型不…...
leetcode每日一题:查询数组异或美丽值
引言 今天的每日一题原题是2843. 统计对称整数的数目,由于数据量很小,最大只是到10000,所以直接模拟即可,不需要复杂的数位DP,反而执行的更慢。更换成前几天遇到的更有意思的一题来写这个每日一题。 题目 2527. 查询…...
【C#】一种优雅的基于winform的串口通信管理
serialPort.DataReceived、串口优雅管理 完整《C#串口通信系统》功能清单 Part 1 — SerialPortManager.cs —— 串口核心管理类 using System; using System.IO.Ports; using System.Text; using System.Threading; using System.Windows.Forms;/// <summary> /// 专业…...
【Linux】ubuntu环境变量配置以及shell配置文件编写
一、确定配置文件类型 输入命令确定配置文件类型 echo $SHELL输出如果是 /bin/zsh,那就改 .zshrc;如果是 /bin/bash,那就改 .bashrc。 下面以 .bashrc 为例。 二、编辑 ./bashrc 文件 输入命令编辑配置文件。 vim ~/.bashrc在文件末尾添…...
.NET MAUI教程2-利用.NET CommunityToolkit.Maui框架弹Toast
在上一篇博文的基础上继续操作: .NET MAUI教程1-入门并发布apk包安装到真机-CSDN博客 本文内容参考: Toast - .NET MAUI Community Toolkit - Community Toolkits for .NET | Microsoft Learn 1 在NuGet包管理器中安装 MAUI Community Toolkit&…...
Android 16应用适配指南
Android 16版本特性介绍 https://developer.android.com/about/versions/16?hlzh-cn Android 16 所有功能和 API 概览 https://developer.android.com/about/versions/16/features?hlzh-cn#language-switching Android 16 发布时间 Android 16 适配指南 Google开发平台&…...
<C#>在 C# .NET 6 中,使用IWebHostEnvironment获取Web应用程序的运行信息。
在 C# .NET 6 中,IWebHostEnvironment 接口提供了有关应用程序运行环境的信息,例如应用程序的根目录、环境名称等。它在处理文件路径、加载配置文件以及根据不同环境提供不同服务等场景中非常有用。以下是关于 IWebHostEnvironment 的详细用法介绍&#…...
在 STM32 中实现电机测速的方法介绍
在 STM32 中实现电机测速的方法介绍 关键字:M 法测速, T 法测速,编码器 1. 电机测速方法介绍 在电机控制类应用中,经常会需要对电机转速进行检测,测速常用的方式有 M 法测速和 T法测速。 M 法测速是利用在规定时间 …...
第四十六篇 人力资源管理数据仓库架构设计与高阶实践
声明:文章内容仅供参考,需仔细甄别。文中技术名称属相关方商标,仅作技术描述;代码示例为交流学习用途;案例数据已脱敏,技术推荐保持中立;法规解读仅供参考,请以《网络安全法》《数据…...
支持iOS与Android!SciChart开源金融图表库助力高效开发交易应用
如果您想了解更多关于开源财务图表库的iOS和Android应用程序,SciChart高性能的iOS、Android图表库一定不要错过!使用SciChart创建金融、交易呵股票、外汇或加密应用程序变得很容易。 SciChart iOS & macOS是一个功能丰富和强大的OpenGL ES和Metal 2D…...
stack和queue的模拟实现
功能介绍 1.stack stack是栈,它是后进先出,如下图所示: 它是从顶部出数据,从顶部出数据。STL库中提供了几个接口来实现栈。、 它们是: empty判断栈是否为空,返回值是bool。 size是返回栈中的元素个数。…...
【QT】-define (A, B) (quint16)(((A) << 8) | (B)) 分析
不加 quint8 的写法:#define TO_SOURCE(A, B) (quint16)((A << 8) | B) 潜在问题 符号位扩展(如果 A 是负数) 如果 A 是 char 或 int8_t 且为负数(如 0xFF -1),左移 << 8 会导致 符号位扩展&…...
DISTRIBUTED PRIORITIZED EXPERIENCE REPLAY(分布式优先级体验回放)论文阅读
标题:DISTRIBUTED PRIORITIZED EXPERIENCE REPLAY(分布式优先级体验回放) 作者:John Quan, Dan Horgan,David Budden,Gabriel Barth-Maron 单位: DeepMind 发表期刊:Machine Learning 发表时…...
【Qt】QxOrm:下载、安装、使用
1、下载源码 github地址:https://github.com/QxOrm/QxOrm 稳定版本下载:https://github.com/QxOrm/QxOrm/releases/tag/1.5.0 2、编译源码 QxOrm支持cmake编译(CMakeLists.txt)、Qt pro工程编译(QxOrm.pro) 以 QxOrm.pro 为例,编译生成的库,没有在 build-QxOrm-1.5…...
Java I/O 流体系详解与记忆方法
Java I/O 流体系详解与记忆方法 一、I/O 流核心框架 Java I/O 流体系是Java处理输入输出的核心API,主要分为两大阵营: 1. 按数据流向分(输入和输出是相对于内存而言的) 内存:临时存储数据的空间 硬盘:…...
【vLLM 学习】API 客户端
vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ 源代码:vllm-project/vllm """Example Python client…...
CSS学习02 动态列数表格开发,解决多组数据布局与边框重合问题
概要 在前端开发中,表格常用于展示结构化数据。当数据组的字段数量不统一时(如有的行包含 3 组数据,有的行包含 2 组或 1 组),传统固定列数的表格会出现结构错位、边框重合等问题。本文通过 HTML/CSS 规范方法&#x…...
【websocket】使用案例( JSR 356 标准)
目录 一、JSR 356方式:简单示例 1、引入依赖 2、注册端点扫描器 3、编写通过注解处理生命周期和消息 4、细节解读 5、总结 二、聊天室案例 方案流程 1、引入依赖 2、注册端点扫描器 3、编写一个配置类,读取httpsession 4、编写通过注解处理生…...
Tomcat Session 反序列化漏洞(CVE-2025-24813)
1.漏洞描述 Tomcat 是一个开源的、轻量级的 Web 应用服务器 和 Servlet 容器。它由 Apache 软件基金会下的 Jakarta 项目开发,是目前最流行的 Java Web 服务器之一。 该漏洞利用条件较为复杂,需同时满足以下四个条件: 应用程序启用了DefaultS…...
maven导入本地jar示例
1、${project.basedir} 是固定写法 <dependency><groupId>alipay-sdk</groupId><artifactId>alipay-sdk</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/src/main/lib…...
哨兵模式下,Redis主从同步原理,新增的Redis从节点如何同步
在Redis哨兵模式下,新增从节点的同步过程遵循全量同步和增量同步相结合的机制,具体原理如下: 一、新增从节点的同步流程 1. 建立连接与初始化请求 新增从节点首次启动时,通过replicaof <master-ip> <master-port>命…...
SpringBoot系列之集成Redisson实现布隆过滤器
基于Spring Boot集成Redisson实现布隆过滤器 在高并发和大数据量的场景下,布隆过滤器是一种非常高效的存储结构,可以用于快速判断一个元素是否存在于集合中。本文将介绍如何在Spring Boot中集成Redisson来实现布隆过滤器,并通过一个订单查询…...
Matlab 非线性阻尼四分之一车体被动和模糊pid控制悬架对比
1、内容简介 Matlab 192-非线性阻尼四分之一车体被动和模糊pid控制悬架对比 可以交流、咨询、答疑 2、内容说明 略 汽车车辆悬架系统的核心元件主要有控制器、导向机构、弹性元件以及减 震器等,该系统是汽车最重要的结构系统之一,主流车辆悬架大致有被…...
JavaWeb 课堂笔记 —— 07 Web 入门、HTTP 协议和Tomcat
本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…...
Android学习总结之OKHttp拦截器和缓存
深入理解 OkHttp 拦截器 1. 拦截器接口详解 Interceptor 接口是自定义拦截器的基础,它仅包含一个抽象方法 intercept。以下是对该方法参数和返回值的详细解释: import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import…...
Activiti(五)- 工作流引擎中流程定义删除机制
1、引言 Activiti作为一款轻量级、开源的工作流和业务流程管理(BPM)平台,在实际运维过程中,随着业务发展会产生大量需要清理的流程定义,不规范的删除操作可能导致数据不一致或系统异常等问题。本文将介绍Activiti中删除流程定义的相关方式及…...