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

【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.mrgr.cn/news/79496.html

相关文章:

  • 如何在两台 PostgreSQL 服务器之间使用逻辑复制槽进行数据复制
  • 【qt环境配置】windows下的qt与vs工具集安装\版本对应关系
  • vba学习系列(9)--按需求计数单元格数量
  • 学习笔记063——通过使用 aspose-words 将 Word 转 PDF 时,遇到的字体改变以及乱码问题
  • Python 单例模式工厂模式和classmethod装饰器
  • Kafka系列教程 - Kafka 生产者 -2
  • vue vxe-table 实现财务记账凭证并打印
  • 音视频入门基础:MPEG2-TS专题(13)——FFmpeg源码中,解析Section Header的实现
  • 【git reset】本地下载特定历史提交哈希值的github文件【未联网服务器】进行git reset操作
  • 编码器:提取语义特征,上下文信息;解码器:生成目标语言;每个单词的词经过编码器后的编码就包括上下文信息
  • MODBUS POll使用简介
  • 使用docker安装jenkins
  • 12.08Java
  • 【时时三省】(NIT计算机考试)Word的使用方法
  • 巴特沃斯滤波器由模拟滤波器设计数字滤波器的双线性变换
  • 【论文阅读】体系结构模拟器在处理器设计过程中的作用
  • 扫二维码进小程序的指定页面
  • CODA 离线安装及虚幻镜迁移
  • uniapp扭蛋机组件
  • 关于GaussDB
  • 软件工程知识点
  • maven多模块开发
  • 电子商务人工智能指南 3/6 - 聊天机器人和客户服务
  • 快充诱骗协议芯片XSP08Q应用案例
  • pika:适用于大数据量持久化的类redis组件|简介及安装(一)
  • Qt之第三方库‌QXlsx使用(三)