Download

Adding FVector to array in editor using linecast

Hiya

I’m trying to fill an array (of FVector) in the editor, using PostEditChangeProperty. The array should be filled with results from a line cast. However it doesn’t let me add to the array after the linecast check. The debug does draw at the hit location (so it looks like it actually gets a valid FVector from the hit result).

Also, when I manually add a FVector to the array (in the same function) before the linecast it does work.

Could anybody please explain why this isn’t working?

thank you!
-Frank

.h


    UFUNCTION(BlueprintCallable)
        void DoSomething();

    UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "PostEdit")
        bool Trigger;
    UPROPERTY(BlueprintReadWrite,EditAnywhere, Category = "PostEdit")
        TArray<FVector> MyArray;

.cpp


void UMyActorComponent::PostEditChangeProperty(struct FPropertyChangedEvent& e)
{
    Super::PostEditChangeProperty(e);

    FName PropertyName = (e.Property != NULL) ? e.Property->GetFName() : NAME_None;
    if (PropertyName == GET_MEMBER_NAME_CHECKED(UMyActorComponent, Trigger))
    {
        DoSomething();
    }
}

void UMyActorComponent::DoSomething()
{
    FCollisionQueryParams params;
    MyArray.Empty();
    FVector Start = FVector(0, 0, 500);
    FVector End = FVector(0, 0, -500);
    FHitResult Hit;

    if (GetWorld()->LineTraceSingleByChannel(Hit, Start, End, ECollisionChannel::ECC_Visibility, params))
    {
        DrawDebugPoint(GetWorld(), Hit.ImpactPoint, 10.0f, FColor::Red, true, 10.0f, 0);
        MyArray.Add(Hit.ImpactPoint);
    }
}

Is the Blueprint placed in the level?
If you want to modify Blueprints and keep changes you usually have to call BP->Modify() on it before you make changes to the default object in Editor.

Hi Bruno, thanks for your reply!

It’s inside the blueprint editor/viewer, so not placed in a level. Would that also need to call the modify function?

If it’s in the Blueprint viewer than you are modifying the asset.
I’m not sure I would do that inside PostEditChange, but yeah you have to notify the Editor you’re about to modify the Blueprint asset.

Thats what I thought, but it doesnt seem to update in the linetrace. And when I modify it outside the linetrace it gets updated correctly, what I don’t really understand .

It appears I get a NULL from GetWorld(). Which is quite strange, since its also used for drawing debug, and those are working…

Is there any way to get the (editor) World from inside a component?! (using GetOwner() also returns NULL)

thank you

There’s no world inside a Blueprint, also the owner is null since it wasn’t instantiated inside a map.

Is it somehow possible then to do a linetrace from inside the (blueprint) editor? Using construction in blueprint allows you to, yet I cant get it to work in c++ using OnConstruction either…

I don’t know, there might be way, but feels like fighting against engine architecture to do this; feels hacky.

I would maybe spawn the thing on map then use it to change default values of CDO instead.

I managed to get it working in the editor viewport by using GEditor->GetEditorWorldContext().World() and doing a linecast from there

thanks for your help and input on this Bruno!

No problem, I didn’t even know GEditor was exposing World() to use… Now I know lol
Thanks for sharing. I always note these things, this is why I keep on lurking the forums =]