i have defined an UStruct which has an UObject property like this:
USTRUCT(BlueprintType, Blueprintable)
struct X2BASE_API FX2FieldChangeInfo
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FieldChangeInfo)
TObjectPtr<UX2FieldChangeBridge> FieldChangeBridge;
}
and the corresponding UX2FieldChangeBridge calss:
UCLASS(BlueprintType)
class X2BASE_API UX2FieldChangeBridge : public UObject
{
GENERATED_BODY()
}
and have my actor have a TArray property of this struct
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SaveGame)
TArray<FX2FieldChangeInfo> FieldChangeInfos;
and init the struct’s UObject in this Actor’s BeginPlay:
FieldChangeBridge = NewObject<UX2FieldChangeBridge>(ThisObject, UX2FieldChangeBridge::StaticClass());
const auto* HostActor = UX2GameLibrary::GetOuterObjectCast<AActor>(ThisObject); // DI1211
if (IsValid(HostActor)) // DI1211
{ // DI1211
X2_LOG_STATIC(X2WidgetTemplate, Display, TEXT("DI1211, 09360814, NetMode: %s; HostActor: %s; FieldId: %s; FieldChangeBridge: %s"), *ToString(HostActor->GetNetMode()), *UKismetSystemLibrary::GetDisplayName(HostActor), *FieldId.ToString(), *UKismetSystemLibrary::GetDisplayName(FieldChangeBridge))
} // DI1211
which are successfully as the log print out as below:
DI1211, 09360814, NetMode: Dedicated Server; HostActor: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::IsWorking; FieldChangeBridge: X2FieldChangeBridge_0
DI1211, 09360814, NetMode: Dedicated Server; HostActor: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::IsCrafting; FieldChangeBridge: X2FieldChangeBridge_1
DI1211, 09360814, NetMode: Dedicated Server; HostActor: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::IsHandMaking; FieldChangeBridge: X2FieldChangeBridge_2
DI1211, 09360814, NetMode: Dedicated Server; HostActor: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::CraftingItems; FieldChangeBridge: X2FieldChangeBridge_3
DI1211, 09360814, NetMode: Dedicated Server; HostActor: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::CraftingTime; FieldChangeBridge: X2FieldChangeBridge_4
i re-print the struct’s UObject property in this Actor’s Tick, as below:
for (auto& WorkBenchFieldChangeInfo : FieldChangeInfos) // DI1211
{ // DI1211
X2_LOG(X2WorkBenchTemplate, Display, TEXT("DI1211, 09360814, NetMode: %s; Workbench: %s; FieldId: %s; FieldChangeBridge: %s"), *ToString(GetNetMode()), *UKismetSystemLibrary::GetDisplayName(this), *WorkBenchFieldChangeInfo.FieldId.ToString(), *UKismetSystemLibrary::GetDisplayName(WorkBenchFieldChangeInfo.FieldChangeBridge))
} // DI1211
but all the UObject property is null from the first tick
DI1211, 09360814, NetMode: Dedicated Server; Workbench: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::IsWorking; FieldChangeBridge:
DI1211, 09360814, NetMode: Dedicated Server; Workbench: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::IsCrafting; FieldChangeBridge:
DI1211, 09360814, NetMode: Dedicated Server; Workbench: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::IsHandMaking; FieldChangeBridge:
DI1211, 09360814, NetMode: Dedicated Server; Workbench: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::CraftingItems; FieldChangeBridge:
DI1211, 09360814, NetMode: Dedicated Server; Workbench: BP_WorkBenchBasic; FieldId: X2WorkBenchVM::CraftingTime; FieldChangeBridge:
the FX2FieldChangeInfo’s FieldChangeBridge will be garbage collected and recycled after sometime, which should never happen.
anyone helps, thanks