I have this material:
I’m able to scroll this using a panner.
I’ve created a sprite actor that displays the material, and increase the scroll speed by 0.5 every 5 seconds.
This is the code:
DynamicCloudSpriteActor.h
#pragma once
#include "PaperSpriteActor.h"
#include "DynamicCloudSpriteActor.generated.h"
UCLASS()
class DYNAMICSKY_API ADynamicCloudSpriteActor : public APaperSpriteActor{
GENERATED_BODY()
public:
ADynamicCloudSpriteActor();
private:
float deltaTimeBetweenCloudSpeedUpdate;
float cloudSpeed;
UPROPERTY(VisibleAnywhere, Category = SkyProperties)
class UMaterialInstanceConstant* cloudMaterialPtr;
UPROPERTY(VisibleAnywhere, Category = SkyProperties)
class UPaperSprite* cloudSpritePtr;
class UMaterialInstanceDynamic* dynamicCloudMaterialInstanceDynamic;
virtual void Tick(float deltaTimeSeconds) override;
void updateCloudSpeed();
};
DynamicCloudSpriteActor.cpp
#include "DynamicSky.h"
#include "DynamicCloudSpriteActor.h"
#include "Engine.h"
ADynamicCloudSpriteActor::ADynamicCloudSpriteActor() :
deltaTimeBetweenCloudSpeedUpdate(0)
, cloudSpeed(0.3)
{
PrimaryActorTick.bCanEverTick = true;
cloudSpritePtr = ConstructorHelpers::FObjectFinderOptional<UPaperSprite>(TEXT("PaperSprite'/Game/2DSideScroller/Sprites/CloudSprite.CloudSprite'")).Get();
cloudMaterialPtr = ConstructorHelpers::FObjectFinderOptional<UMaterialInstanceConstant>(TEXT("MaterialInstanceConstant'/Game/2DSideScroller/Materials/DynamicCloud_Inst.DynamicCloud_Inst'")).Get();
dynamicCloudMaterialInstanceDynamic = UMaterialInstanceDynamic::Create(cloudMaterialPtr, GetRenderComponent());
GetRenderComponent()->SetSprite(cloudSpritePtr);
GetRenderComponent()->SetMaterial(0, dynamicCloudMaterialInstanceDynamic);
updateCloudSpeed();
}
void ADynamicCloudSpriteActor::Tick(float deltaTimeSeconds){
deltaTimeBetweenCloudSpeedUpdate+= deltaTimeSeconds;
if (5 < deltaTimeBetweenCloudSpeedUpdate) {
deltaTimeBetweenCloudSpeedUpdate= 0;
cloudSpeed += .5;
updateCloudSpeed();
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::FString(TEXT("Speed of x axis: ")) + FString::SanitizeFloat(cloudSpeed));
}
}
void ADynamicCloudSpriteActor::updateCloudSpeed() {
dynamicCloudMaterialInstanceDynamic->SetScalarParameterValue(FName(TEXT("xSpeed")), cloudSpeed);
}
The problem is that when the method updateCloudSpeed is called from the constructor all works well, when occur a tick (sometime) I get Access violation exception. I know the problem is because the pointer become null, but I would to understand why.
What is the life cycle of the objects instantiated by these helper classes (UMaterialInstanceDynamic::Create AND ConstructorHelpers::FObjectFinderOptional) ?
