打开UE4,点击左上角文件>然后点击新建C++类
image-1657734271807
添加一个蓝图函数库

image-1657734278626
起一个名字,类型改成公共,让其他可访问

image-1657734284480
等待打开VS2019

image-1657734289857

在右侧我们可以看见刚刚建立的文件,点展开Source里面就可以看见你自己建立的函数库,有2个,一个是头文件,即为.h主要工作是暴露接口给UE蓝图用, 另一个为.cpp 是我们主要实现业务逻辑的地方

比如我的是MyBlueprintFunctionLibrary.h和MyBlueprintFunctionLibrary.cpp

image-1657734297466
image-1657734301759
首先打开MyBlueprintFunctionLibrary.h

声明一个方法

    UFUNCTION(BlueprintCallable表示蓝图可使用, Category = "就是你右击面板的时候显示在哪一个分组", meta = (DeterminesOutputType = "是什么类型的" ))
   然后给了一个静态修饰,值得注意的是,UE里面每一个类型开头都是大写的,假如Actor 类型前面就要加A,例如AActor, 假如你的函数蓝图是 MyBlueprintFunctionLibrary 前面就要加 U 即为UMyBlueprintFunctionLibrary

这些是千万要注意的!

好了,这里给这个函数起名为CloneActor,输入类型是Actor 返回类型也是Actor,这时候会看见CloneActor函数报错,那是因为我们没有实现它,现在打开MyBlueprintFunctionLibrar.cpp 实现功能

       UFUNCTION(BlueprintCallable, Category = "ActorFuncions", meta = (DeterminesOutputType = "InputActor"))
       static AActor* CloneActor(AActor* InputActor);

image-1657734326697

/// <summary>
/// 克隆actor
/// </summary>
/// <param name="InputActor"></param>
/// <returns></returns>
AActor* UMyBlueprintFunctionLibrar::CloneActor(AActor* InputActor) // 注意: 在库名称前加一个U,前面说了的
{
    UWorld* World = InputActor->GetWorld();//获取世界主要用来调用 SpawnActor 函数,因为SpawnActor是动态的,在世界中生成的动态actor
    FActorSpawnParameters params;//传递给 SpawnActor 函数的可选参数的结构
    params.Template = InputActor;//把原来的actor参数拷贝起来
    UClass* ItemClass = InputActor->GetClass();//获取原来的actor的类型
    AActor* const SpawnedActor = World->SpawnActor<AActor>(ItemClass, params);//生成一个新的Actor 并且把参数给加上
    return SpawnedActor;//返回新的actor
}

image-1657734340690

点击编译

image-1657734347186

等待编译完成
image-1657734355920
如果你编译出错,请检查,没有问题出现莫名其妙的问题,点文件刷新Visual Studio项目试试或者请重启项目,再不行直接重建,我也不知道为什么有时候没问题就是死活无法编译

保存后,在蓝图里右击调用
image-1657734363511
image-1657734367673