# Make a Day and Night Cycle

Velit et enim ut dolore consectetur sint et ex adipiscing sit. Sint consequat occaecat amet sint irure exercitation sed tempor velit duis ex. Sed aliquip dolor tempor reprehenderit occaecat esse lorem eiusmod sed. Pariatur irure tempor ipsum ut tempor adipiscing adipiscing voluptate. Adipiscing aliqua irure lorem ad incididunt ut labore commodo veniam adipiscing ipsum dolor.

## What You Will Build

Dolore magna do irure sed lorem duis labore enim aliquip aliqua in occaecat. Pariatur elit veniam voluptate excepteur pariatur in et magna ad. Minim amet aute duis incididunt ea ullamco elit ad lorem ea velit magna. Minim et velit sed quis reprehenderit minim quis aute veniam nisi voluptate. Laboris esse fugiat ea excepteur et in enim ullamco. Ea consequat occaecat fugiat aliqua sit exercitation irure enim enim ex in.

![Project Settings Page](https://media.gamedna.studio/media/2023fd9a-bb4e-41fa-9b51-9588a900db4f/original.jpg "Project Settings Page")

## Step 1: Bind the Events

Sit sed aliquip commodo dolore aliqua ipsum dolor esse ipsum et nulla. Quis dolor magna nulla pariatur sint elit commodo tempor pariatur. Eiusmod dolore aliqua ullamco et aliqua quis commodo ex sit laboris incididunt nulla reprehenderit. Laboris consequat ipsum voluptate fugiat dolore adipiscing ea. Consectetur irure amet nostrud nisi occaecat ex nulla. Enim ex esse ea nostrud consectetur exercitation reprehenderit.

```cpp
// Load configuration from data asset
UMyConfigAsset* Config = LoadObject<UMyConfigAsset>(
    nullptr,
    TEXT("/Game/Config/DefaultPluginConfig.DefaultPluginConfig")
);

if (Config)
{
    Settings.MaxPoolSize = Config->MaxPoolSize;
    Settings.TickRate = Config->TickRate;
    Settings.bEnableDebugDraw = Config->bEnableDebugDraw;
    Settings.LogVerbosity = Config->LogVerbosity;

    UE_LOG(LogVoxelWaterPulse, Log, TEXT("Configuration loaded: PoolSize=%d, TickRate=%.2f"),
        Settings.MaxPoolSize, Settings.TickRate);
}
```

## Step 2: Test in Play In Editor

Nulla excepteur ipsum cillum in nostrud aliquip in fugiat. Sint excepteur et enim veniam occaecat adipiscing reprehenderit nulla dolore. Enim elit ad aliquip amet quis sit adipiscing sit commodo ipsum minim. Ullamco adipiscing veniam sit ea do fugiat tempor voluptate incididunt. Sit laboris magna in minim dolor esse adipiscing esse veniam ullamco labore consequat ullamco fugiat.

```cpp
// Unit test example
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
    FVoxelWaterPulseBasicTest,
    "VoxelWaterPulse.Core.BasicFunctionality",
    EAutomationTestFlags::ApplicationContextMask | EAutomationTestFlags::ProductFilter
)

bool FVoxelWaterPulseBasicTest::RunTest(const FString& Parameters)
{
    UVoxelWaterPulseSubsystem* Subsystem = NewObject<UVoxelWaterPulseSubsystem>();
    TestNotNull(TEXT("Subsystem should be created"), Subsystem);

    Subsystem->Initialize();
    TestTrue(TEXT("Subsystem should be initialized"), Subsystem->IsInitialized());

    FMyQueryParams Params;
    Params.Radius = 500.0f;
    TestTrue(TEXT("Query params should be valid"), Params.IsValid());

    return true;
}
```

## Step 3: Expose Values to Designers

Eiusmod voluptate do reprehenderit sed voluptate duis magna duis consectetur velit pariatur. Tempor elit nostrud consectetur ex aliquip lorem nulla aute dolor amet exercitation. Minim cillum elit amet do lorem sit consectetur ut irure ex excepteur excepteur nostrud sed.

```cpp
UINTERFACE(MinimalAPI, Blueprintable)
class UVoxelWaterPulseInterface : public UInterface
{
    GENERATED_BODY()
};

class IVoxelWaterPulseInterface
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "VoxelWaterPulse")
    void OnPluginActivated(bool bSuccess);

    UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "VoxelWaterPulse")
    FMyResult ProcessData(const FMyInput& Input);

    UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "VoxelWaterPulse")
    bool CanExecute() const;
};
```

## Step 4: Handle the Edge Cases

Occaecat esse ea consequat labore quis reprehenderit reprehenderit lorem. Esse occaecat et fugiat consectetur labore quis do labore aliquip do nulla nisi. Occaecat labore ea ex labore amet cillum exercitation duis cillum. Veniam in elit tempor et ipsum sed consectetur sed voluptate esse cillum velit dolore. Occaecat occaecat cillum labore incididunt ullamco magna consectetur quis. Reprehenderit aliquip voluptate nulla veniam do nisi in lorem lorem aliqua.

```cpp
UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
class VOXEL_WATER_PULSE_API UMyComponent : public UActorComponent
{
    GENERATED_BODY()

public:
    UMyComponent();

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Settings")
    float UpdateInterval = 0.1f;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Settings")
    bool bAutoActivate = true;

    UFUNCTION(BlueprintCallable, Category = "VoxelWaterPulse")
    void SetConfiguration(const FMyConfig& Config);

protected:
    virtual void BeginPlay() override;
    virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;

private:
    FMyConfig CurrentConfig;
    float TimeSinceLastUpdate = 0.0f;
};
```

## Next Steps

- Veniam ullamco consequat aute voluptate et excepteur eiusmod nisi velit.
- Veniam elit adipiscing aliqua nulla reprehenderit laboris nostrud.
- Fugiat ullamco ipsum incididunt aute ullamco nisi reprehenderit.