4.4 KiB
4.4 KiB
HideSelfPin
- 功能描述: 用在函数调用上,隐藏默认的SelfPin,也就是Target,导致该函数只能在OwnerClass内调用。
- 使用位置: UFUNCTION
- 引擎模块: Pin
- 元数据类型: bool
- 常用程度: ★★
用在函数调用上,隐藏默认的SelfPin,也就是Target,导致该函数只能在OwnerClass内调用。
注释里说通常与 DefaultToSelf 说明符共用。但是实际上在源码里没找到例子。
和HidePin以及InternalUseParam比较类似,不过后者可以隐藏其他参数,HideSelfPin只能隐藏SelfPin
逻辑代码:
可以看出SelfPin的bHidden 与否,受到一些情况的影响:
- 如果是Static 函数(蓝图函数库里的函数,或者C++里的静态函数),因为默认不需要Target来调用,则默认就隐藏起SelfPin.
- 如果函数上带有HideSelfPin标记,则默认也隐藏且不可在外部连接,导致该函数只能在本类内调用。
- 如果函数是BlueprintPure函数,且当前是在OwnerClass内调用,则不需要显示SelfPin。
- 在源码里只找到这一个地方的判断和应用。因此可以认为HidleSelfPin只隐藏Self,意思是只隐藏类成员函数被调用时候的This指针(就是Self,也就是Target),但不会隐藏Static函数被调用时候的参数,哪怕这个参数被DefaultToSelf标识。被DefaultToSelf标志只意味着这个参数的默认值为外部调用环境的Self值,并不是指这个函数节点上的SelfPin,静态函数的SelfPin总是隐藏的。被DefaultToSelf标识的那个参数虽然值等于Self,但并不是SelfPin.
bool UK2Node_CallFunction::CreatePinsForFunctionCall(const UFunction* Function)
{
//...
if (bIsStaticFunc)
{
// For static methods, wire up the self to the CDO of the class if it's not us
if (!bIsFunctionCompatibleWithSelf)
{
UClass* AuthoritativeClass = FunctionOwnerClass->GetAuthoritativeClass();
SelfPin->DefaultObject = AuthoritativeClass->GetDefaultObject();
}
// Purity doesn't matter with a static function, we can always hide the self pin since we know how to call the method
SelfPin->bHidden = true;
}
else
{
if (Function->GetBoolMetaData(FBlueprintMetadata::MD_HideSelfPin))
{
SelfPin->bHidden = true;
SelfPin->bNotConnectable = true;
}
else
{
// Hide the self pin if the function is compatible with the blueprint class and pure (the !bIsConstFunc portion should be going away soon too hopefully)
SelfPin->bHidden = (bIsFunctionCompatibleWithSelf && bIsPureFunc && !bIsConstFunc);
}
}
}
C++测试代码:
UCLASS()
class INSIDER_API UMyFunctionLibrary_SelfPinTest :public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintPure,meta=(DefaultToSelf="myOwner",hidePin="myOwner"))
static FString PrintProperty_HasDefaultToSelf_ButHide(UObject* myOwner,FName propertyName);
UFUNCTION(BlueprintPure,meta=(DefaultToSelf="myOwner",HideSelfPin="true"))
static FString PrintProperty_HasDefaultToSelf_AndHideSelf(UObject* myOwner,FName propertyName);
UFUNCTION(BlueprintPure,meta=(DefaultToSelf="myOwner",InternalUseParam="myOwner"))
static FString PrintProperty_HasDefaultToSelf_ButInternal(UObject* myOwner,FName propertyName);
};
UCLASS(Blueprintable, BlueprintType)
class INSIDER_API AMyFunction_HideSelfTest :public AActor
{
public:
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void MyFunc_Default(int value){}
UFUNCTION(BlueprintCallable,meta=(HideSelfPin="true"))
void MyFunc_HideSelfPin(int value){}
};
蓝图里测试效果:
从第一个图可以看到,HideSelfPin用在Static函数并无效果。而InternalUseParam可以隐藏引脚。
而对于类成员函数的测试结果可以看出:
- 在类内部调用的时候,self可以被隐藏起来,但都可以调用。二者的区别是,MyFunc_Default这个默认的版本,也可以接受同类型的AMyFunction_HideSelfTest 不同对象实例来调用。而MyFunc_HideSelfPin只能被当前的对象来调用。
- 而在左侧关卡蓝图中,通过一个AMyFunction_HideSelfTest 对象尝试调用这两个函数,可以发现MyFunc_Default可以调用,而MyFunc_HideSelfPin这个函数节点就无法被创建出来。就算用复制粘贴的方法硬创造出来,也因为失去了Self这个Target Pin而无法连接,从而无法调用。