我有一个蓝图函数库“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 中调用它时,两个输入就变成了输出。
谁能解释这是为什么吗?
任何帮助,将不胜感激!
如果您无法回答我的问题,请告诉我!
在 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)
请注意,这并不总是必要的,但仅当参数的初始值很重要,并且您希望在调用节点之前将它们设置为某个值时。