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

1 c++ unreal-engine4

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

函数的声明是:

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

和定义:

void UTextFileManager::TestFunc(FString & InString, int & InInt)
{
    InString = "Has changed";
}
Run Code Online (Sandbox Code Playgroud)

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

谁能解释这是为什么吗?

任何帮助,将不胜感激!

如果您无法回答我的问题,请告诉我!

goo*_*ake 8

在 C++ 中(在 Unreal 和其他用例中),当您想要从函数中获得多个“输出”值并且无法使用单个返回类型时,使用引用类型参数是常见方法。例如:

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

void SetTwoNumbersTo1(int& FirstOut, int& SecondOut) {
 FirstOut = 1;
 SecondOut = 1;
}
Run Code Online (Sandbox Code Playgroud)

通常,函数之前的参数值并不重要,因为在函数内部它被设置为与其初始值无关的值。在上面的例子中,MyNumberandMyNumber2可以是任何东西,它们最后仍然是 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;
}
Run Code Online (Sandbox Code Playgroud)

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

它可以像这样使用:

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

请注意,这并不总是必要的,但仅当参数的初始值很重要,并且您希望在调用节点之前将它们设置为某个值时。