Unreactive4 00

はじめに

“Unreal Engine 4 Reactive"などで調べてもヒットしないため, 仕方がないため作りたい.
ReactiveXシリーズのRxCppではだめな理由は, メモリ管理とスレッド管理が理由です. ここがUE4特有のものに置き換えるのは大変なので, スクラッチで作ることにしました. また, namespacetemplateをはじめUE4のプリプロセッサがモダンなC++を書くうえで, 私にとって理解できないことも理由です.
とりあえず, コールバックを呼べるところまで適当に作りました (GitHub Unreactive4). 名前がRxぽくないのは, ReactiveXシリーズにはインターフェイスや機能的に到底達しないためです.

コールバックを呼び出すだけ

最も単純なコールバックを呼び出すだけのテストを作成しました. 多重継承をなくしたいです.

Observerヘッダ
#pragma once

#include <CoreMinimal.h>
#include <Blueprint/UserWidget.h>
#include "UNRX4/UNRX4.h"
#include "UNRX4/UNRX4IObservable.h"
#include "UNRX4/UNRX4IObserver.h"
#include "TestUserInputWidget.generated.h"

/**
 *
 */
UCLASS()
class UNREACTIVE4_API UTestUserInputWidget : public UUserWidget, public UNRX4IObserver<int32>
{
    GENERATED_BODY()
public:
    virtual void NativeConstruct() override;

    UFUNCTION(BlueprintCallable, Category = "UITest")
    void invokeClick(int32 id);

    void next(int32 id) override
    {
        UE_LOG(LogTemp, Log, TEXT("next:%d"), id);
    }

    void error(unrx4::error_code_type errorCode) override
    {
        UE_LOG(LogTemp, Log, TEXT("error:%d"), errorCode);
    }

    void completed() override
    {
        UE_LOG(LogTemp, Log, TEXT("completed"));
    }
private:
    UNRX4Function<void(int32)> action_;
    TArray<FUNRX4OnClickDelegate> onClickDelegates_;
    unrx4_unique_ptr<UNRX4IObservable<int32>> observable_;
};
Observer実装
#include "TestUserInputWidget.h"
#include "UNRX4/UNRX4Observable.h"

void UTestUserInputWidget::NativeConstruct()
{
    Super::NativeConstruct();

    observable_ = UNRX4Observable::fromEvent(action_);
    observable_->subscribe(this);
}

void UTestUserInputWidget::invokeClick(int32 id)
{
    action_(id);
}

UMGのBlueprintは, イベントを伝搬しています.

unrx4 umg00

まとめ

目的としては, UIデザイナとエンジニアの労力を最小にすることです. デザイナとエンジニアの境界だけならreactiveである必要はないのですが, ついでのようなものです.
目標は, まずデザイナとエンジニアの境界についてのやりとりが最小になる, 次にエンジニアのイベント処理の労力が最小になることです.