为什么C++函数的输入在蓝图中变成了输出?

Why is C++ function's inputs become outputs in the blueprint?

我有一个蓝图函数库“TextManager”,它有一个test_function“测试”。

函数的声明是:

UFUNCTION(BlueprintCallable, Category = "Custom", meta = (Keywords = "testfunction"))
        static void TestFunc(FString & InString, int & InInt);

和定义:

void UTextFileManager::TestFunc(FString & InString, int & InInt)
{
    InString = "Has changed";
}

但是当我在 bp 中调用它时,两个输入变成了输出。

谁能解释这是为什么?

如有任何帮助,我们将不胜感激!

如果您不能回答我的问题,请告诉我!

输入变成输出的原因是因为你使用了“&”符号。

“&”表示您传入的变量与调用函数的变量具有相同的内存地址。

这是一个关于参考的视频:c++ references video

在 C++ 中(在 Unreal 和其他用例中),当您希望从一个函数中获得多个“输出”值并且不能使用单个 return 类型时,使用引用类型参数是常见的方法.例如:

void Main() {
 int MyNumber, MyNumber2;
 SetTwoNumbersTo1(MyNumber, MyNumber2);
}

void SetTwoNumbersTo1(int& FirstOut, int& SecondOut) {
 FirstOut = 1;
 SecondOut = 1;
}

通常,函数之前的参数值并不重要,因为在函数内部它被设置为独立于其初始值的值。在上面的例子中,MyNumberMyNumber2 可以是任何东西,它们最后仍然是 1。

这可以帮助您理解为什么 UFUNCTION(BlueprintCallable) 参数默认显示为输出。如果您将参数指定为非常量引用,Unreal 假定您调用该函数之前的初始值并不重要,并且完全在该函数内部确定,就像在该 C++ 示例中一样.

当然并非总是如此,有时初始值很重要。例如:

void Main() {
 int MyNumber = 1;
 int MyNumber2 = 100;
 DoubleTwoNumbers(MyNumber, MyNumber2);
}

void DoubleTwoNumbers(int& FirstNumber, int& SecondNumber) {
 FirstNumber = FirstNumber * 2;
 SecondNumber = SecondNumber * 2;
}

在这种情况下,Unreal 中默认使用的方法并不是很好。所以有一个特殊的说明符,UPARAM(ref),它可以让你的参数在节点上显示为输入。

可以这样使用:

UFUNCTION(BlueprintCallable)
void DoubleTwoNumbers(UPARAM(ref) int32& FirstNumber, UPARAM(ref) int32& SecondNumber) {
 FirstNumber = FirstNumber * 2;
 SecondNumber = SecondNumber * 2;
}`

请注意,这并不总是必要的,只有当参数的初始值很重要并且您想在调用节点之前将它们设置为某些值时才需要这样做。