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

ops/2024/12/12 9:13:49/

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

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.ppmy.cn/ops/141213.html

相关文章

Dubbo应用篇

文章目录 一、Dubbo简介二、SSM项目整合Dubbo1.生产者方配置2.消费者方配置 三、Spring Boot 项目整合Dubbo1.生产者方配置2.消费者方配置 四、应用案例五、Dubbo配置的优先级别1. 方法级配置&#xff08;Highest Priority&#xff09;2. 接口级配置3. 消费者/提供者级配置4. 全…

‌System Prompt VS User Prompt

System Prompt&#xff08;系统提示词&#xff09;与User Prompt&#xff08;用户提示词&#xff09;在定义、作用和特点上存在显著区别。‌ 定义 ‌System Prompt‌&#xff1a;系统提示词是指向AI提供的一组初始指令或背景信息&#xff0c;用于指导AI的行为方式和响应模式。…

设计模式之工厂模式:从汽车工厂到代码工厂

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客&#xff0c;你不需要知道汽车是如何被制造出来的&#xff0c;你只需要告诉销售顾问&a…

如何使用 Python 实现简单的 Web 服务器?

为了实现一个简单的Web服务器&#xff0c;Python提供了多种方法。对于快速原型设计和学习目的来说&#xff0c;最简单的方法之一是使用内置的http.server模块。 然而&#xff0c;在实际开发中&#xff0c;更常见的做法是使用像Flask或Django这样的框架来构建更为复杂的应用程序…

牛客网刷题SQL--高级查询

目录 SQL16--查找GPA最高值 描述 示例1 答案 其他方法&#xff1a; SQL17--计算男生人数以及平均GPA 描述 示例1 答案 SQL18--分组计算练习题 描述 示例1 答案 SQL19--分组过滤练习题 描述 示例1 答案 SQL20--分组排序练习题 描述 示例1 答案 SQL16--查找GP…

小程序开发实战项目:构建简易待办事项列表

随着移动互联网的飞速发展&#xff0c;小程序以其便捷性、即用即走的特点&#xff0c;成为了连接用户与服务的重要桥梁。无论是电商平台的购物助手&#xff0c;还是餐饮行业的点餐系统&#xff0c;小程序都在各个领域发挥着巨大的作用。 小程序开发基础 1. 小程序简介 小程序是…

责任链模式在Spring中的应用

一、引言 责任链模式&#xff08;Chain of Responsibility&#xff09;是一种行为型设计模式&#xff0c;用于将请求从一个处理者传递到另一个处理者&#xff0c;直到找到能够处理该请求的对象。这种模式的核心思想是将请求的处理过程拆分为多个处理对象&#xff0c;每个处理对…

Leetcode 每日一题 219.存在重复元素 II

目录 问题描述 输入输出格式 示例 算法分析 过题图片 代码实现 复杂度分析 题目链接 总结 问题描述 给定一个整数数组nums和一个整数k&#xff0c;我们需要判断数组中是否存在两个不同的索引i和j&#xff0c;使得nums[i] nums[j]且|i - j| < k。如果存在这样的i和…