虚幻引擎4(UE4)中具有自定义C ++蓝图功能库的蓝图循环/ for / while节点 DelayLoop.h文件: DelayLoop.cpp文件:

我需要创建一个自定义的蓝图节点。我正在使用蓝图函数库。

该节点将如下所示:

输入: int timedelayforeachloop int numberofloops

输出: 排除循环 排除完成

loop1.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionlibrary.h"
#include "loop1.generated.h"

/**
 * 
 */

UENUM(BlueprintType)
enum class EMultiBranchEnum1 : uint8
{
    BranchA,BranchB
};


UCLASS()
class MYPROJECT2_API Uloop1 : public UBlueprintFunctionlibrary
{
    GENERATED_BODY()
        UFUNCTION(BlueprintCallable,meta = (DisplayName = "loop",CompactNodeTitle = "2as2",ExpandEnumAsExecs = "Branches"),Category = "1")
        //UFUNCTION(BlueprintCallable,Meta = (DisplayName = "Multi Branch1",Category = 1)
        static void multiBranch(EMultiBranchEnum1& Branches,int loopqty);
        //EMultiBranchEnum1::BranchB;

};

loop1.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "loop1.h"

void Uloop1::multiBranch(EMultiBranchEnum1& Branches,int loopqty)
{

    int currloop1 = 0;
    int temp = 2;
    int i;
    for (i = 0; i < 10; i++){
        currloop1 = currloop1 + 1;
        Branches = EMultiBranchEnum1::BranchA;


    }

    if (temp > currloop1) {

        Branches = EMultiBranchEnum1::BranchB;
    }

    if(temp == 0) {

        Branches = EMultiBranchEnum1::BranchB;

    }


}

-问题- for循环仅运行一次(由我在branchA上拥有的打印节点所识别(仅打印一次))

-下面的代码会发生什么- 循环应运行10次(我的打印节点应打印10次)

yxgwl 回答:虚幻引擎4(UE4)中具有自定义C ++蓝图功能库的蓝图循环/ for / while节点 DelayLoop.h文件: DelayLoop.cpp文件:

您应该使用UBlueprintFunctionLibrary而不是使用UBlueprintAsyncActionBase。它将允许您将状态存储在节点中,并异步调用连接到执行引脚的事物。

DelayLoop.h文件:

#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "DelayLoop.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDelayOutputPin);

/**
 * 
 */
UCLASS()
class TEST_API UDelayLoop : public UBlueprintAsyncActionBase
{
    GENERATED_UCLASS_BODY()

public:
    UPROPERTY(BlueprintAssignable)
    FDelayOutputPin Loop;

    UPROPERTY(BlueprintAssignable)
    FDelayOutputPin Complete;

    UFUNCTION(BlueprintCallable,meta = (BlueprintInternalUseOnly = "true",WorldContext = "WorldContextObject"),Category = "Flow Control")
    static UDelayLoop* DelayLoop(const UObject* WorldContextObject,const float DelayInSeconds,const int Iterations);

    virtual void Activate() override;

private:
    const UObject* WorldContextObject;
    float MyDelay;
    int MyIterations;
    bool Active;

    UFUNCTION()
    void ExecuteLoop();

    UFUNCTION()
    void ExecuteComplete();
};

DelayLoop.cpp文件:

#include "DelayLoop.h"
#include "Engine/World.h"
#include "TimerManager.h"

UDelayLoop::UDelayLoop(const FObjectInitializer& ObjectInitializer) : 
        Super(ObjectInitializer),WorldContextObject(nullptr),MyDelay(0.0f),MyIterations(0),Active(false)
{
}

UDelayLoop* UDelayLoop::DelayLoop(const UObject* WorldContextObject,const int Iterations)
{
    UDelayLoop* Node = NewObject<UDelayLoop>();
    Node->WorldContextObject = WorldContextObject;
    Node->MyDelay = DelayInSeconds;
    Node->MyIterations = Iterations;
    return Node;
}


void UDelayLoop::Activate()
{
    if (nullptr == WorldContextObject)
    {
        FFrame::KismetExecutionMessage(TEXT("Invalid WorldContextObject."),ELogVerbosity::Error);
        return;
    }
    if (Active)
    {
        FFrame::KismetExecutionMessage(TEXT("DelayLoop is already running."),ELogVerbosity::Warning);
    }
    if (MyDelay <= 0.0f)
    {
        FFrame::KismetExecutionMessage(
                TEXT("DelayLoop delay can't be less or equal to 0."),ELogVerbosity::Warning);
    }
    if (MyIterations <= 0)
    {
        FFrame::KismetExecutionMessage(
                TEXT("DelayLoop iterations can't be less or equal to 0."),ELogVerbosity::Warning);
    }

    Active = true;
    for (int i = 0; i <= MyIterations; i++)
    {
        FTimerHandle IterationTimer;
        WorldContextObject->GetWorld()->GetTimerManager().SetTimer(
                IterationTimer,this,&UDelayLoop::ExecuteLoop,MyDelay * i);
    }

    FTimerHandle CompleteTimer;
    WorldContextObject->GetWorld()->GetTimerManager().SetTimer(
            CompleteTimer,&UDelayLoop::ExecuteComplete,MyDelay * (MyIterations+1));
            // If the Complete pin should happen at the same time as the last iteration
            // use `MyDelay * MyIterations` here instead

}

void UDelayLoop::ExecuteLoop()
{
    Loop.Broadcast();
}

void UDelayLoop::ExecuteComplete()
{
    Complete.Broadcast();
    Active = false;
}

这将为您提供一个如下所示的蓝图:

example use of blueprint

注意:此代码很大程度上基于Daniel〜b617 Janowski的This Creating Asynchronous Blueprint Nodes guide

本文链接:https://www.f2er.com/3160969.html

大家都在问