x

Search in
Sort by:

Question Status:

Search help

  • Simple searches use one or more words. Separate the words with spaces (cat dog) to search cat,dog or both. Separate the words with plus signs (cat +dog) to search for items that may contain cat but must contain dog.
  • You can further refine your search on the search results page, where you can search by keywords, author, topic. These can be combined with each other. Examples
    • cat dog --matches anything with cat,dog or both
    • cat +dog --searches for cat +dog where dog is a mandatory term
    • cat -dog -- searches for cat excluding any result containing dog
    • [cats] —will restrict your search to results with topic named "cats"
    • [cats] [dogs] —will restrict your search to results with both topics, "cats", and "dogs"

OnConstruction() is not correctly executed

I'm writing an ALadder class by C++ inspired by a Alan Noon's tutorial https://www.youtube.com/watch?v=axuwbkDWI5U. Currently the class is very simple:

Ladder.h

 #pragma once
 
 #include "GameFramework/Actor.h"
 
 #include "Ladder.generated.h"
 
 class UPaperSprite;
 
 UCLASS()
 class ALadder : public AActor
 {
     GENERATED_BODY()
 
 public:
 
     ALadder();
 
     virtual void OnConstruction(const FTransform& Transform) override;
 
 protected:
 
     UPROPERTY(EditAnywhere, Meta = (MakeEditWidget = true))
         FVector TopVector{FVector(0.0f, 0.0f, 100.0f)};
 
     UPROPERTY(EditAnywhere, Meta = (MakeEditWidget = true))
         FVector BottomVector{FVector(0.0f, 0.0f, 0.0f)};
 
     UPROPERTY(EditAnywhere)
         float RungOffset{ 10.0f };
 
     UPROPERTY(EditAnywhere)
         UPaperSprite* RungSprite {};
 
 private:
 };


Ladder.cpp

 #include "Actors/Ladder.h"
 #include "PaperSprite.h"
 #include "PaperSpriteComponent.h"
 #include "UObject/UObjectIterator.h"
 
 ALadder::ALadder() 
 {
     RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootSceneComponent"));
 }
 
 void ALadder::OnConstruction(const FTransform& Transform)
 {
     Super::OnConstruction(Transform);
 
     BottomVector = FVector(0.0f);
     TopVector.X = 0.0f;
     TopVector.Y = 0.0f;
 
     TArray<UActorComponent*> SpriteComponents = GetComponentsByClass(UPaperSpriteComponent::StaticClass());
     // Remove all components
     for (auto It = SpriteComponents.CreateIterator(); It; It++)
     {
         (*It)->DestroyComponent();
     }
 
     UPaperSpriteComponent* SpriteComponent = nullptr;
     float Diff_Z = (TopVector - BottomVector).Z;
     if (Diff_Z < 0.0f)
     {
         TopVector = BottomVector;
     }
 
     int32 RungsNumber = (int)(Diff_Z / RungOffset);
     // Add components
     for (int32 i = 0; i <= RungsNumber; ++i)
     {
         SpriteComponent = NewObject<UPaperSpriteComponent>(this);
         FAttachmentTransformRules AttachmentRules(EAttachmentRule::KeepRelative, false);
         SpriteComponent->AttachToComponent(RootComponent, AttachmentRules);
         SpriteComponent->SetRelativeLocation(FVector(0.0f, 0.0f, RungOffset * i));
         SpriteComponent->SetSprite(RungSprite);
         SpriteComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);
     }
 }


When I try to modify the TopVector by the widget in editor, the rungs don't appear, but when I try to modify the TopVector default value by the Details panel, it works correctly. I noticed when I used the TopVector widget, the ALadder::OnConstruction() was called twice; these are the two different call stacks:

First call stack:

 >    UE4Editor-platformer-6449.dll!ALadder::OnConstruction(const FTransform & Transform) Line 13    C++
      UE4Editor-Engine.dll!AActor::ExecuteConstruction(const FTransform & Transform, const FRotationConversionCache * TransformRotationCache, const FComponentInstanceDataCache * InstanceDataCache, bool bIsDefaultTransform) Line 839    C++
      UE4Editor-Engine.dll!AActor::RerunConstructionScripts() Line 494    C++
      UE4Editor-Engine.dll!AActor::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 125    C++
      UE4Editor-UnrealEd.dll!FEdMode::InputDelta(FEditorViewportClient * InViewportClient, FViewport * InViewport, FVector & InDrag, FRotator & InRot, FVector & InScale) Line 378    C++
      UE4Editor-PlacementMode.dll!FPlacementMode::InputDelta(FEditorViewportClient * InViewportClient, FViewport * InViewport, FVector & InDrag, FRotator & InRot, FVector & InScale) Line 437    C++
      UE4Editor-UnrealEd.dll!FEditorModeTools::InputDelta(FEditorViewportClient * InViewportClient, FViewport * InViewport, FVector & InDrag, FRotator & InRot, FVector & InScale) Line 729    C++
      UE4Editor-UnrealEd.dll!FEditorViewportClient::InputWidgetDelta(FViewport * InViewport, EAxisList::Type CurrentAxis, FVector & Drag, FRotator & Rot, FVector & Scale) Line 3283    C++
      UE4Editor-UnrealEd.dll!FLevelEditorViewportClient::InputWidgetDelta(FViewport * InViewport, EAxisList::Type InCurrentAxis, FVector & Drag, FRotator & Rot, FVector & Scale) Line 2383    C++
      UE4Editor-UnrealEd.dll!FEditorViewportClient::UpdateMouseDelta() Line 2130    C++
      UE4Editor-UnrealEd.dll!FEditorViewportClient::Tick(float DeltaTime) Line 1180    C++
      UE4Editor-UnrealEd.dll!FLevelEditorViewportClient::Tick(float DeltaTime) Line 2138    C++
      UE4Editor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 1800    C++
      UE4Editor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 403    C++
      UE4Editor.exe!FEngineLoop::Tick() Line 3699    C++
      [Inline Frame] UE4Editor.exe!EngineTick() Line 62    C++
      UE4Editor.exe!GuardedMain(const wchar_t * CmdLine, HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, int nCmdShow) Line 174    C++
      UE4Editor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) Line 262    C++
      [External Code]    



Second call stack:

 >    UE4Editor-platformer.dll!ALadder::OnConstruction(const FTransform & Transform) Line 13    C++
      UE4Editor-Engine.dll!AActor::ExecuteConstruction(const FTransform & Transform, const FRotationConversionCache * TransformRotationCache, const FComponentInstanceDataCache * InstanceDataCache, bool bIsDefaultTransform) Line 839    C++
      UE4Editor-Engine.dll!AActor::RerunConstructionScripts() Line 494    C++
      UE4Editor-Engine.dll!AActor::PostEditMove(bool bFinished) Line 147    C++
      UE4Editor-UnrealEd.dll!FLevelEditorViewportClient::TrackingStopped() Line 2910    C++
      UE4Editor-UnrealEd.dll!FMouseDeltaTracker::EndTracking(FEditorViewportClient * InViewportClient) Line 306    C++
      UE4Editor-UnrealEd.dll!FEditorViewportClient::StopTracking() Line 2655    C++
      UE4Editor-UnrealEd.dll!FEditorViewportClient::InputKey(FViewport * InViewport, int ControllerId, FKey Key, EInputEvent Event, float __formal, bool __formal) Line 2590    C++
      UE4Editor-UnrealEd.dll!FLevelEditorViewportClient::InputKey(FViewport * InViewport, int ControllerId, FKey Key, EInputEvent Event, float AmountDepressed, bool bGamepad) Line 2607    C++
      UE4Editor-Engine.dll!FSceneViewport::OnMouseButtonUp(const FGeometry & InGeometry, const FPointerEvent & InMouseEvent) Line 566    C++
      UE4Editor-Slate.dll!SViewport::OnMouseButtonUp(const FGeometry & MyGeometry, const FPointerEvent & MouseEvent) Line 202    C++
      [Inline Frame] UE4Editor-Slate.dll!FSlateApplication::RoutePointerUpEvent::__l13::<lambda_8aae5586f97da0914c7f98177fd6d3e0>::operator()(const FArrangedWidget &) Line 5592    C++
      UE4Editor-Slate.dll!FEventRouter::Route<FReply,FEventRouter::FBubblePolicy,FPointerEvent,<lambda_8aae5586f97da0914c7f98177fd6d3e0> >(FSlateApplication * ThisApplication, FEventRouter::FBubblePolicy RoutingPolicy, FPointerEvent EventCopy, const FSlateApplication::RoutePointerUpEvent::__l13::<lambda_8aae5586f97da0914c7f98177fd6d3e0> & Lambda) Line 270    C++
      UE4Editor-Slate.dll!FSlateApplication::RoutePointerUpEvent(FWidgetPath & WidgetsUnderPointer, FPointerEvent & PointerEvent) Line 5576    C++
      UE4Editor-Slate.dll!FSlateApplication::ProcessMouseButtonUpEvent(FPointerEvent & MouseEvent) Line 6087    C++
      UE4Editor-Slate.dll!FSlateApplication::OnMouseUp(const EMouseButtons::Type Button, const FVector2D CursorPos) Line 6060    C++
      UE4Editor-ApplicationCore.dll!FWindowsApplication::ProcessDeferredMessage(const FDeferredWindowsMessage & DeferredMessage) Line 1831    C++
      UE4Editor-ApplicationCore.dll!FWindowsApplication::DeferMessage(TSharedPtr<FWindowsWindow,0> & NativeWindow, HWND__ * InHWnd, unsigned int InMessage, unsigned __int64 InWParam, __int64 InLParam, int MouseX, int MouseY, unsigned int RawInputFlags) Line 2281    C++
      UE4Editor-ApplicationCore.dll!FWindowsApplication::ProcessMessage(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 1511    C++
      UE4Editor-ApplicationCore.dll!FWindowsApplication::AppWndProc(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 766    C++
      [External Code]    
      [Inline Frame] UE4Editor-ApplicationCore.dll!WinPumpMessages() Line 107    C++
      UE4Editor-ApplicationCore.dll!FWindowsPlatformApplicationMisc::PumpMessages(bool bFromMainLoop) Line 130    C++
      UE4Editor.exe!FEngineLoop::Tick() Line 3615    C++
      [Inline Frame] UE4Editor.exe!EngineTick() Line 62    C++
      UE4Editor.exe!GuardedMain(const wchar_t * CmdLine, HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, int nCmdShow) Line 174    C++
      UE4Editor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) Line 262    C++
      [External Code]    



Product Version: UE 4.21
Tags:
more ▼

asked Mar 19 '19 at 11:45 PM in C++ Programming

avatar image

DarioGangi
1 3

(comments are locked)
10|2000 characters needed characters left
Viewable by all users

1 answer: sort voted first

Maybe I found a solution but I didn't really understand why it works. After I create a new component I call the UActorComponent::RegisterComponent() method and it solves the issue. Does anyone know why it works? The wierd fact is that previously it only worked correctly if I modified the TopVector by Details Panel.

more ▼

answered Mar 20 '19 at 08:35 PM

avatar image

DarioGangi
1 3

(comments are locked)
10|2000 characters needed characters left
Viewable by all users
Your answer
toggle preview:

Up to 5 attachments (including images) can be used with a maximum of 5.2 MB each and 5.2 MB total.

Follow this question

Once you sign in you will be able to subscribe for any updates here

Answers to this question