# HideAssetPicker - **功能描述:** 隐藏Object类型引脚上的AssetPicker的选择列表 - **使用位置:** UFUNCTION - **引擎模块:** Object Property - **元数据类型:** strings="a,b,c" - **限制类型:** UObject* - **常用程度:** ★★ 隐藏Object类型引脚上的AssetPicker的选择列表。这在有时我们只是想要自己传递Object引用,不希望用户选择到引擎里别的资产的时候会比较有用。因为Asset类型其实也是Object,因此对于Object引用类型的参数叫做HideAssetPicker。 在源码里并没有找到有使用的地方,但是这个功能是可用的。 ## 测试代码: ```cpp UFUNCTION(BlueprintCallable) static void MyFunc_NoHideAssetPicker(UObject* ObjectClass) {} UFUNCTION(BlueprintCallable, meta = (HideAssetPicker = "ObjectClass")) static void MyFunc_HideAssetPicker(UObject* ObjectClass) {} ``` ## 蓝图效果: 默认的情况MyFunc_NoHideAssetPicker是可以弹出选择列表的。而MyFunc_HideAssetPicker则就隐藏了起来。 ![Untitled](Untitled.png) ## 原理: 判断一个函数引脚是否允许打开AssetPicker的逻辑是: - 必须是个object 类型 - 如果是UActorComponent则不显示 - 如果是Actor类型,那么得在关卡蓝图中,且该Actor是placeable的才显示。 - 如果用HideAssetPicker显式指定了该参数,则该参数也不显示。 ```cpp bool UEdGraphSchema_K2::ShouldShowAssetPickerForPin(UEdGraphPin* Pin) const { bool bShow = true; if (Pin->PinType.PinCategory == PC_Object) { UClass* ObjectClass = Cast(Pin->PinType.PinSubCategoryObject.Get()); if (ObjectClass) { // Don't show literal buttons for component type objects bShow = !ObjectClass->IsChildOf(UActorComponent::StaticClass()); if (bShow && ObjectClass->IsChildOf(AActor::StaticClass())) { // Only show the picker for Actor classes if the class is placeable and we are in the level script bShow = !ObjectClass->HasAllClassFlags(CLASS_NotPlaceable) && FBlueprintEditorUtils::IsLevelScriptBlueprint(FBlueprintEditorUtils::FindBlueprintForNode(Pin->GetOwningNode())); } if (bShow) { if (UK2Node_CallFunction* CallFunctionNode = Cast(Pin->GetOwningNode())) { if (UFunction* FunctionRef = CallFunctionNode->GetTargetFunction()) { const UEdGraphPin* WorldContextPin = CallFunctionNode->FindPin(FunctionRef->GetMetaData(FBlueprintMetadata::MD_WorldContext)); bShow = ( WorldContextPin != Pin ); // Check if we have explictly marked this pin as hiding the asset picker const FString& HideAssetPickerMetaData = FunctionRef->GetMetaData(FBlueprintMetadata::MD_HideAssetPicker); if(!HideAssetPickerMetaData.IsEmpty()) { TArray PinNames; HideAssetPickerMetaData.ParseIntoArray(PinNames, TEXT(","), true); const FString PinName = Pin->GetName(); for(FString& ParamNameToHide : PinNames) { ParamNameToHide.TrimStartAndEndInline(); if(ParamNameToHide == PinName) { bShow = false; break; } } } } } else if (Cast( Pin->GetOwningNode())) { bShow = false; } } } } return bShow; } ```