问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unreal Engine插件制作指南:蓝图与C++两种方式详解

创作时间:
作者:
@小白创作中心

Unreal Engine插件制作指南:蓝图与C++两种方式详解

引用
CSDN
1.
https://m.blog.csdn.net/ChaoChao66666/article/details/138671235

一、纯蓝图制作插件

  1. 打开插件面板,在界面左上角点击“添加”按钮
  2. 在“新插件”界面先点击“纯内容”然后点击“创建插件”

    此时在项目工程目录下的“Plugins”文件夹中就可以看到我们创建的插件
  3. 如果想在自己创建的插件中添加功能,我们可以在项目浏览器中的“All-》Plugins-》xxx”目录下创建资产、蓝图等
    比如这里我创建了一个actor蓝图类,这里命名为“BP_Test”
    这里打开“BP_Test”然后添加了一个函数
  4. 在插件界面中搜索我们刚才创建的插件,在下方可以看到“编辑”和“包”两个选项,先点击“编辑”
    我们可以在打开的“插件属性”界面中设置一下插件的图标、版本名、描述等
    如果该插件依赖了别的插件,我们可以在最后的依赖性一栏中添加我们依赖的插件名称,这样当我们使用了自己制作的这个插件同时,系统会自动帮我们打开我们所依赖的插件
  5. 设置好后,我们可以点击“包”来打包我们制作的插件
    选择一个打包目录后就自动开始打包了
    打包后我们的文件夹内容如下
    可以看到在“Content”文件夹中包含有我们创建的蓝图资产
    最好用不同版本的UE编辑器去打包我们的插件,这样可以得到适配不同UE版本的插件
  6. 打包完毕后,我们可以将插件文件夹复制到新工程中测试一下能否正常使用
    可以看到在新工程中我们可以搜到我们的插件
    新建一个蓝图,父类选择插件中的蓝图类“BP_Test”
    打开新建的蓝图后,可以看到我们可以在里面正常调用父类的函数,这说明我们的插件是可以正常使用的。

二、C++制作插件

  1. 我们可以在C++工程中创建更多类型的插件,这里我们选择“空白”作为模板来创建插件
    点击“创建插件”按钮后,系统自动帮我们打开VS编辑器,VS编辑器中可以看到插件的内容如下
    我们需要打开“xxx.uplugin”文件,然后添加如下内容来指定插件运行的平台
"WhitelistPlatforms": [
                "Win64"
            ]  
  1. 关闭虚幻编辑器,在VS编辑器中重新生成项目
    等待生成完毕
    点击“调试-》开始执行不调试” ,然后等待打开虚幻编辑器
    在项目浏览器中可以看到我们创建的插件文件夹
  2. 接下来我们创建插件的功能(推出方块)。在“All-》C++类-》xxx”中新建C++类,这里准备使用代码实现将方块推出去的功能
    这里选择“Actor组件”然后点击下一步
    **需要指定该C++类存放于插件中,**然后点击“公有”,命名插件名称,然后点击创建类
  3. 回到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. 测试一下插件功能是否有效。我们打开角色蓝图添加插件中创建的组件
在细节面板中设置推力和推出的物体
在事件图表中设置按下1键调用插件中的函数
此时运行可以看到插件功能正常:
6. 最后打包插件即可
打包后的插件目录如下,使用方法和用蓝图制作的插件使用方法一样
测试插件的工程可以不必是C++工程,使用蓝图工程也一样可以使用C++代码制作成的插件。

三、重新编译插件

如果要在插件中修改一些东西,可以在修改后重新编译插件,具体参考这篇文章:
UE4修改插件,重新编译引擎自带的插件(内置插件)(以WebBrowser插件为例)(纯小白教程)
参考视频:
https://www.bilibili.com/video/BV1AZ421z7sq/?spm_id_from=333.337.search-card.all.click&vd_source=36a3e35639c44bb339f59760641390a8
如何封装UE插件

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号