【UE5】制作插件 并调试【vs2022】

视频教程:好看视频-轻松有收获

https://www.youtube.com/watch?v=Ijpa9mI2b5I

官方:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/plugins-in-unreal-engine

原文:【UE】制作插件_ue插件-CSDN博客

C++制作插件 
1. 我们可以在C++工程中创建更多类型的插件,这里我们选择“空白”作为模板来创建插件

点击“创建插件”按钮后,系统自动帮我们打开VS编辑器,VS编辑器中可以看到插件的内容如下

我们需要打开“xxx.uplugin”文件,然后添加如下内容来指定插件运行的平台

"WhitelistPlatforms": [
                "Win64"
            ]
2. 关闭虚幻编辑器,在VS编辑器中重新生成项目

等待生成完毕 

点击“调试-》开始执行不调试” ,然后等待打开虚幻编辑器

在项目浏览器中可以看到我们创建的插件文件夹 

3. 接下来我们创建插件的功能(推出方块)。在“All-》C++类-》xxx”中新建C++类,这里准备使用代码实现将方块推出去的功能

这里选择“Actor组件”然后点击下一步

需要指定该C++类存放于插件中,然后点击“公有”,命名插件名称,然后点击创建类

4. 回到VS编辑器中,点击“全部重新加载”

此时可以看到在插件文件夹中已经创建了C++的.h和.cpp文件

打开.h文件,这里先删除TickComponent

在.cpp文件中,先将tick设置为false来减少性能消耗

删除TickComponent

回到.h文件中,我们添加一个蓝图可调用的函数,该函数需要传入一个布尔变量,用于表示是否需要生成一个方块并推出去

UFUNCTION(BlueprintCallable, Category = "Presets")
void StartPushing(bool spawnCube);
接下来需要在.cpp文件中完善该函数的逻辑,我们可以直接通过如下步骤创建函数体

此时在.cpp文件中自动帮我们创建好了函数体

再在.h文件中定义一个蓝图可识别并编辑的浮点型变量,表示推力的大小

在.cpp文件中设置力的大小

在.h中再定义一个推出的物体

完成推出方块的函数逻辑

打包插件还需指定引用的文件 

完整的.cpp代码如下:

// Fill out your copyright notice in the Description page of Project Settings.
 
 
#include "PushCubeLogic.h"
//打包插件还需指定引用文件
#include "GameFramework/Actor.h"
#include "Engine/World.h"
#include "Components/StaticMeshComponent.h"
 
// Sets default values for this component's properties
UPushCubeLogic::UPushCubeLogic()
{
    // Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
    // off to improve performance if you don't need them.
    PrimaryComponentTick.bCanEverTick = false;
 
    Force = 500.0f;
}
 
 
// Called when the game starts
void UPushCubeLogic::BeginPlay()
{
    Super::BeginPlay();
    
}
 
void UPushCubeLogic::StartPushing(bool spawnCube)
{
    if (GetOwner()) {  //判断自身对象是否有效
        FVector Start = GetOwner()->GetActorLocation();
        FVector End = Start + (GetOwner()->GetActorForwardVector() * 300.0f);
 
        if (spawnCube && SpawnedCube) {  //判断是否能够生成Cube并且是否指定Cube
            // 生成Cube
            GetWorld()->SpawnActor<AActor>(SpawnedCube, End, FRotator(0, 0, 0));
        }
 
        FHitResult Hit;
        FCollisionQueryParams QParams;
        bool bHit = GetWorld()->LineTraceSingleByChannel(Hit, Start, End, ECC_Visibility, QParams);  //发出射线
 
        
        if (bHit) {  //判断射线是否检测到物体
            UStaticMeshComponent* SMComp = Cast<UStaticMeshComponent>(Hit.GetActor()->GetRootComponent());  //获取物体的StaticMesh
            bool CubeMoveable = Hit.GetActor()->IsRootComponentMovable();  //物体是否可移动
 
            if (CubeMoveable && SMComp) {
                DrawDebugLine(GetWorld(), Start, End, FColor::Blue, false, 0.5f);  //显示射线
 
                SMComp->AddImpulse(GetOwner()->GetActorForwardVector() * SMComp->GetMass()*Force);  //施加力
            }
 
        }
 
    }
 
}

.h文件:

// Fill out your copyright notice in the Description page of Project Settings.
 
#pragma once
 
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "PushCubeLogic.generated.h"
 
 
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class PUSHCUBEPLUGIN_API UPushCubeLogic : public UActorComponent
{
    GENERATED_BODY()
 
public:    
    // Sets default values for this component's properties
    UPushCubeLogic();
 
protected:
    // Called when the game starts
    virtual void BeginPlay() override;
 
    UPROPERTY(EditAnywhere, Category = "Presets")
    float Force;
 
    UPROPERTY(EditAnywhere, Category = "Presets")
    TSubclassOf<AActor> SpawnedCube;
 
public:    
    UFUNCTION(BlueprintCallable, Category = "Presets")
    void StartPushing(bool spawnCube);
};

可以用虚幻编辑器的编译按钮来编译一下

5. 测试一下插件功能是否有效。我们打开角色蓝图添加插件中创建的组件


————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/ChaoChao66666/article/details/138671235

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

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

相关文章

cocos creator 的 widget组件的使用及踩坑

以下的内容基于cocos creator 3.8版本&#xff0c;如有错误&#xff0c;恳请指出。 &#x1f449;官方文档的指引 应用&#xff1a;以上官方指引有非常清晰的使用方式&#xff0c;接下来说明一些注意事项&#xff1a; 1、与canvas搭配的使用&#xff0c;解决多分别率适配问题。…

十五、K8s计划任务JobCronJob

K8s计划任务CronJob&Job 一、Job可以干什么 Job 控制器用于管理 Pod 对象运行一次性任务,比方说我们对数据库备份,可以直接在 k8s 上启动一个 mysqldump 备份程序,也可以启动一个 pod,这个 pod 专门用来备份用的,备份结束 pod 就可以终止了,不需要重启,而是将 Pod…

关于LinuxWindows双系统在八月更新后出现的问题

问题描述类似于&#xff1a;Verifying shim SBAT data failed: If you are, this is caused by a reported problem in the August update if you can get into Windows, either uninstall the August update, or open Command Prompt as administrator and run this command,…

【Elasticsearch 中间件】Elasticsearch 客户端使用案例

文章目录 一、安装 Elasticsearch1.1 启动 Elasticsearch1.2 启动 Kibana 二、客户端代码2.1 导入依赖2.2 配置 application.yaml2.3 定义实体类2.4 连接 Elasticserach2.5 定义 Service 层接口2.6 实现 Service 层功能 三、测试项目3.1 添加数据3.2 搜索数据3.3 更新数据3.4 删…

一文掌握 OpenGL 几何着色器的使用

学习本文需要具备 OpenGL ES 编程基础,如果看起来比较费劲,可以先看入门文章 OpenGL ES 3.0 从入门到精通系统性学习教程 。 什么是几何着色器 几何着色器(Geometry Shader) OpenGL 管线中的可选着色器阶段,位于顶点着色器(Vertex Shader) 和光栅化阶段 之间。 其核心…

C++中多态

1) 什么是多态性&#xff1f;C中如何实现多态&#xff1f; 多态性是指通过基类指针或引用调用派生类的函数&#xff0c;实现不同的行为 多态性可以提高代码的灵活性和可扩展性&#xff0c;使程序能够根据不同的对象类型执行不同的操作。 2&#xff09;C中如何实现多态&#…

PHP语法学习(第十天)—PHP 表单

各位&#x1f9cd;‍♂️ 周一愉快♪٩(ω)و♪ 我是练小杰&#xff0c;今天开启新的篇章——PHP 表单 另外&#xff0c;想要学习更多PHP语法相关内容点击 “PHP专栏”~~~ 今天由我强哥来带领大家学习~~ 文章目录 PHP 表单简介表单的基本结构表单数据操作PHP 中的 $_POST 和 $_…

跟李笑来学美式俚语(Most Common American Idioms): Part 67

Most Common American Idioms: Part 67 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记&#xff0c;自用。 Github仓库链接&#xff1a;https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来&#xff08;或者clone到本地…

卫生巾检测项目、检测标准梳理

为了确保卫生巾在使用过程中具备良好的吸收性、舒适性、透气性&#xff0c;并且符合卫生安全标准&#xff0c;避免对人体健康造成不良影响&#xff0c;需要对其进行一系列检测。 名找我 一、检测项目 外观质量 检查卫生巾的形状、尺寸是否与标识相符&#xff0c;表面是否平整…

windows C#-声明和使用读/写属性

属性提供了公共数据成员的便利性&#xff0c;且不会产生未受保护、不可控制和未经验证地访问对象的数据的风险。 属性声明访问器&#xff1a;从基础数据成员中赋值和检索值的特殊方法。 set 访问器可分配数据成员&#xff0c;get 访问器检索数据成员值。 此示例演示具有两个属…

架构13-持久化存储

零、文章目录 架构13-持久化存储 1、Kubernetes 存储设计 &#xff08;1&#xff09;存储设计考量 **设计哲学&#xff1a;**Kubernetes 遵循用户通过资源和声明式 API 描述意图&#xff0c;Kubernetes 根据意图完成具体操作。**复杂性&#xff1a;**描述用户的存储意图本身…

spring重点面试题总结

bean的生命周期 在 Spring 中&#xff0c;BeanDefinition、Bean 实例化、依赖注入、Aware 接口的处理、以及 BeanPostProcessor 的前置和后置处理等&#xff0c;都是 Spring 容器管理 Bean 生命周期的关键部分。下面我将详细解释这些过程。 1. 通过 BeanDefinition 获取 Bean…

【文件操作】写入json文件

一般用json.dump把dict或者list导出到文件 一般用json.dumps把dict或者list导出到字符串 dump是导出的意思,这样看dict和list是自己人,但是string和文件相对于代码就是外人 代码例子 import json import copyfid = open(origin.txt, r) lines = fid.readlines() res_list…

单片机的选择因素

在选择单片机型号时&#xff0c;需要根据具体的应用需求来选择合适的单片机。单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种将计算机的主要部分集成在一个芯片上的微型计算机&#xff0c;它通常包括处理器、存储器、输入/输出接口等。随着技术的发展&#xf…

使用wol-web通过NAS远程唤醒电脑

相信很多人都有远程开机的需求&#xff0c;有时候需要远程控制家中的电脑办公、玩游戏。远程控制比较好实现&#xff0c;安装类似向日葵的软件即可。而远程开机稍微麻烦一点&#xff0c;有的通过物理开关实现&#xff08;开机棒&#xff09;我们选择远程网络唤醒的方式实现&…

TortoiseGit 图标覆盖设置

TortoiseGit 图标覆盖设置 图标覆盖设置隐藏图标覆盖切换样式 我们安装了小海龟后&#xff0c;它会在仓库目录下给所有图标覆盖上状态标记。 图标覆盖设置 右键菜单打开 &#xff1a;设置 》 图标覆盖。 隐藏图标覆盖 如果不想图标上出现小乌龟的状态标记。直接点这里可以…

Chrome浏览器调用ActiveX控件--allWebOffice控件

背景 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功能&#xff0c;…

docker部署redis使用键空间通知订阅

1. redis的键空间通知(keyspace notification) 大概意思是比如时间删除 或者 过期的时候发布的一个通知。通过一个通知来发布或修改一个状态。通常理解为 pub/sub&#xff08;发布/订阅&#xff09;。 键空间通知有两种类型key-space , key-event, 可以理解为key-space对应事件…

(堆) 优先队列(堆)的简单实现

文章目录 &#x1f3d4;️堆是什么&#xff1f;&#x1f3d4;️C 标准库&#x1f3d4;️手动实现⛰️原理简介⛰️C⛰️C语言 ⭐END&#x1f31f;交流方式 &#x1f3d4;️堆是什么&#xff1f; 堆简介 - OI Wiki 堆是一棵树&#xff0c;其每个节点都有一个键值&#xff0c;且…

【EXCEL】 获取多列中 不为空的那一个数据

从多个表格筛选出来的上班时间是下表这样的 我要把他们放在同一列&#xff0c;这样方便后续处理&#xff0c;合并列输入下面这个公式即可 日期不加 TEXT&#xff08;&#xff09; 函数 转日期格式&#xff1b;将得到是一串数字 TEXT(TEXTJOIN(", ",TRUE,B2:F2),&qu…