🌞 Victory Plugin ~ Rama's Extra Blueprint Nodes for UE5, No C++ Required!

Hello! I’ve been using your tool a lot in UE4 and it’s been fantastic! Me and my team are considering taking the jump to UE5, our early tests have been really successful and cut down our render times a lot. We’re making an animated series and have been trying to optimise our editor pipeline as much as possible.

I’ve used the “Victory Create Proc”, “Has Substring” and “Get Names of All Loaded Levels” nodes a few times for various pipeline tools in UE4. Would it be possible for you to get these brought over into UE5? That would be incredible! “Has Substring” is probably the lowest priority one overall but would still be handy to have.

Thank you so much from myself and my team. Your work has been an incredible help for us so far!

Hi Rama, we are using heavily the Pixel nodes, do you have any plans to enable them in the UE5? We would be very thankful for that. Thanks a lot.

I would love to have the load/save, string/string array to disk nodes!

@Rama. First your plugin is great, it solved a few things for me.
But why not migrate everything to UE5? Why select only a few of them?
To migrate my project to UE5 I would personnally need :

  • the sort node that was under utilities->Array
  • Save game object get all save slot file names
  • the file IO nodes

Thx for your work

Hi @Rama ,
First of all, thanks for putting the effort, this is awesome.
Second, I am having this issue when trying to package my game after installing your plugin in UE5.

UATHelper: Packaging (Windows): ERROR: Expecting to find a type to be declared in a module rules named ‘VictoryBPLibrary’ in UE5Rules, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null. This type must derive from the ‘ModuleRules’ type defined by Unreal Build Tool.

Can someone help, please?

Nevermind, I’ve managed to solve the issue following the steps in this thread below.
For anyone interested:

1 Like

The File IO Save String Array to File would be nice

@Rama

Love the plugin, any chance the Viewport Set Mouse Position will return?

Thx :slight_smile:

Hi Rama, I finally have time and opportunity to join all the other people in thanking you very much for this awesome plugin. Great work!

For my application it would be very useful to have things like Get Actor Relative Location/Rotation and string functionality (Load String Array from File, String Combine Strings, etc.) working in UE5.

Thanks!

Hi Rama, The downloadlink is outdated can you update it? Thanks.

Thank you for sharing your solution!

1 Like

Dear Lovely Victory Plugin Users,

Sorry about my delay in replying to everyone

I see all of your requested nodes and will add them as soon as I can.

The answer as to why I don’t import everything is simply that I have to handle the includes differently in UE5 and so it is easier for me to add everything as needed rather than go through a very long compiling process.

I am also personally curious which nodes everyone has been using, and I am enjoying your feedback very much

I will be back soon!

:sparkling_heart: Love and Joy to You! :sparkling_heart:

And Happy New Year!

2022 is going to be the Most Fun Year For All Of Us

Especially as we keep making :rose: colorful :star2: and fun games to inspire others!

:zap: Did you know :rainbow:

that when you make other people happy, as they play your game

in addition to money

:star2: You gain in happiness just because you made your players so happy? :star2:

It’s true!

:rose: So let’s keep inspiring the world everyone! :zap:

And I will do an update as soon as I can!

:sparkling_heart:

Rama

Rama, I don’t use any of your plugins, but I enjoy that you make the world a little bit better with your positive attitude in every post. Without any hate and quarrels. Thank you for that and keep bringing :heart: to the people!

1 Like

@pladux Hee hee, thank you for the Lovely Message!

Positive Attitude + :heart: to the people = :zap: Victory! :rose:

:heart:

Rama

PS: I am doing a new UE5 plugin version right now!


New Victory Plugin 5 Update!


Dear :zap: Awesome :sparkling_heart: UE Community, :sparkling_heart:

:unicorn: I’ve added the requested nodes! :unicorn:

Please do let me know if you have other requests!

Part of the reason I am doing this sort of interview process is also to trim the plugin, getting rid of nodes ppl were not using so as to make the plugin a more streamlined complimentary :rose: Rama Gift to You All. :rose:

:heart:

Rama

PS: The :rainbow: Joyful Colors :star2: version of UE5 UI doesn’t come with the plugin, but I could upload my UI Color file if you like!

Download Link Here:


:star2: Get Text From Any :racehorse: :dash: Running .EXE on Your Computer! :sparkling_heart:

URamaVictoryPluginCreateProcessPipe Object :zap: is Born! :zap:


:zap: Below is a picture of me capturing the output of a .exe on my computer, a video compression tool, HandBrake! :zap:

The output of STDOUT of the .exe is coming directly into UE4, :rose: using only Blueprints! :rose:

I’ve made a new version of the Victory Plugin ( 4.27 (win32, win64 only) in original post ) !

This new version allows you to create a :rose: Very Special :rose: URamaVictoryPluginCreateProcessPipe to capture your Process output, if the Process is outputting to STDOUT (console window) or STDERR

  1. Construct the RamaVictoryPluginCreateProcessPipe object

  2. Pass it into VictoryCreateProc

  3. Call ReadFromPipe on the object periodically to get updates from your process

  4. When done, please call ClosePipe on the object, and null the reference to the object (I call ClosePipe inside of object BeginDestroy, but might as well :zap: take initiative :zap: yourself and close the actual OS pipe yourself immediately, rather than waiting for Garbage Collection)


Relevant UE4 C++ Code


.h

/** 
	Made With Love By Rama for Use with @VictoryCreateProc
	So that you can receive feedback from your processes.
	
	♥
	
	Rama
*/
UCLASS(Blueprintable,BlueprintType)
class URamaVictoryPluginCreateProcessPipe : public UObject
{
	GENERATED_BODY()
public:
	 
	UFUNCTION(BlueprintCallable, Category = "Joy Flow")
	bool CreatePipe();
	
	UFUNCTION(BlueprintCallable, Category = "Joy Flow")
	void ClosePipe();
	
	/** 
		This has exec pins because it is an expensive action and the output is saved/cached on the output pin, whereas a Pure node would repeat the action many times, each time node is accessed.
		
		@Return false if the pipes were not created yet
		
		♥ Rama 
	*/
	UFUNCTION(BlueprintCallable, Category = "Joy Flow")
	bool ReadFromPipe(FString& PipeContents);
	
	UFUNCTION(BlueprintPure, Category = "Joy Flow")
	bool PipeIsValid();
	
public:
	void* ReadPipe = nullptr;
	void* WritePipe = nullptr;
	
	virtual void BeginDestroy() override;
};

.cpp

bool URamaVictoryPluginCreateProcessPipe::CreatePipe()
{
	if(PipeIsValid())
	{
		//Ignore repeat creates without a close inbetween <3 Rama
		return true;
	}
	return FPlatformProcess::CreatePipe( ReadPipe, WritePipe );
}
void URamaVictoryPluginCreateProcessPipe::ClosePipe()
{
	if(PipeIsValid())
	{
		FPlatformProcess::ClosePipe(ReadPipe, WritePipe);
		ReadPipe = nullptr;
		WritePipe = nullptr;
	}
}
bool URamaVictoryPluginCreateProcessPipe::ReadFromPipe(FString& PipeContents)
{
	PipeContents = "";
	
	if(!PipeIsValid()) 
	{
		return false;
	}
	PipeContents = FPlatformProcess::ReadPipe(ReadPipe);
	return true;
}
bool URamaVictoryPluginCreateProcessPipe::PipeIsValid()
{
	return ReadPipe != nullptr && WritePipe != nullptr;
}

void URamaVictoryPluginCreateProcessPipe::BeginDestroy()
{
	Super::BeginDestroy();
	//~~~~~~~~~~~~~~~~~~~~
	
	//Close pipe if it was still open! ♥ Rama
	ClosePipe();
}

:heart:

Rama

Hi Rama!! Can you help me with the UMG Color wheel for UE5? It is not visible in UMG. Is the color wheel not working or available or how to install it properly?

:heart: Rama’s UE5 Color Picker For You :heart:

Dear UE Community,

I’ve integrated my implementation of the UE Editor Color Picker into the UE5 version of Victory Plugin!

:zap: :star2: :rose:This Color Picker, The UE Color Picker Itself, Will Indeed Work In Packaged Games :rose: :star2: :zap:

Many Thanks To :sparkling_heart: Nick Darnell :sparkling_heart:, for it was he who exposed the UE Color Picker Slate class (Runtime/AppFramework) so we could use it in :rose:packaged games! :rose:

My role was to create the UMG Class wrapper of the Slate Code so that the Color Picker can be accessed from the :rose: UMG Designer :rose:, as you can see in the video below!

@M1te Your UMG Color Picker Gift is Ready at the Download link in original post, enjoy!


UE5 C++ Code


.h

/*
	By Rama for You
	
	You are welcome to use this code anywhere as long as you include this notice.
*/

#pragma once

//UE5 Color Picker
//		Requires module in build.cs
//			APPFRAMEWORK 
#include "Runtime/AppFramework/Public/Widgets/Colors/SColorPicker.h"

class SJoyColorPicker
	: public SColorPicker
{ 
	typedef SColorPicker Super;
	
public: //! <~~~~~
	FORCEINLINE void SetColorRGB(const FLinearColor& NewColor)
	{
		//This is protected in SColorPicker 
		//		so can't call it from UMG component
		SetNewTargetColorRGB( NewColor, true ); //Force Update
	}
	
//Animation
public:
 
	FLinearColor InstantColor;
	bool Animation_SkipToFinalForOneTick = false; 
	virtual void Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime ) override
	{ 
		//Skip to final, then resume normal animation behavior
		if(Animation_SkipToFinalForOneTick)
		{  
			Animation_SkipToFinalForOneTick = false;  
			Super::Tick(AllottedGeometry, InCurrentTime, 10000); //<~~~ because all the required vars like CurrentTime are private :)
			SetColorRGB(InstantColor);
			return;
			//~~~~
		}
		
		//Animate normally!
		Super::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);
	}
};
#pragma once

#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Styling/SlateColor.h"
#include "Styling/SlateTypes.h"
#include "Widgets/SWidget.h"
#include "Components/Widget.h"

#include "RamaColorPicker.generated.h"

class SJoyColorPicker;

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnJoyColorChangedEvent, const FLinearColor&, NewColor);

/**
 * Rama Color Picker For You! ♥ Rama
 */
UCLASS()
class VICTORYBPLIBRARY_API URamaColorPicker : public UWidget
{
	GENERATED_UCLASS_BODY()
	
public:

	/** The currently Chosen Color for this Color Picker! ♥ Rama*/
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="Rama Color Picker",meta=(Keywords="getcolor"))
	FLinearColor JoyColor = FLinearColor::Red;
	
	/** Called whenever the color is changed programmatically or interactively by the user */
	UPROPERTY(BlueprintAssignable, Category="Rama Color Picker", meta=(DisplayName="OnColorChanged (Rama Color Picker)"))
	FOnJoyColorChangedEvent OnColorChanged;
	
	/**
	 * Directly sets the current color, for saving user preferences of chosen color, or loading existing color of an in-game clicked actor!
	 * @param InColor The color to assign to the widget
	 */
	UFUNCTION(BlueprintCallable, Category = "Rama Color Picker",meta=(Keywords="setcolor"))
	void SetJoyColor(FLinearColor NewColor, bool SkipAnimation=false);
	
public:
	void ColorUpdated(FLinearColor NewValue);

#if WITH_EDITOR
public:
	
	// UWidget interface
	//virtual const FSlateBrush* GetEditorIcon() override;
	virtual const FText GetPaletteCategory() override;
	// End UWidget interface
	
	// UObject interface
	virtual void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override;
	// End of UObject interface
	
#endif

public:
	
	//~ Begin UWidget Interface
	virtual void SynchronizeProperties() override;
	//~ End UWidget Interface
	
protected:
	//~ Begin UWidget Interface
	virtual TSharedRef<SWidget> RebuildWidget() override;
	// End of UWidget
	
	// UVisual interface
	virtual void ReleaseSlateResources(bool bReleaseChildren) override;
	// End of UVisual interface
	
protected:
	TSharedPtr<SJoyColorPicker> MySlateColorPicker;
	
};

#include "RamaColorPicker.h"

#include "UObject/ConstructorHelpers.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "SJoyColorPicker.h"

#define LOCTEXT_NAMESPACE "UMG"

URamaColorPicker::URamaColorPicker(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
	, JoyColor(FLinearColor::Red)
{}

#if WITH_EDITOR
/*
const FSlateBrush* UJoyColorWheel::GetEditorIcon()
{
	return FUMGStyle::Get().GetBrush("Widget.Image");
}
*/ 
 
const FText URamaColorPicker::GetPaletteCategory()
{
	return LOCTEXT("Victory Plugin", "Victory Plugin");
}

void URamaColorPicker::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
	Super::PostEditChangeProperty(PropertyChangedEvent);

	FName PropertyName = (PropertyChangedEvent.Property != NULL) ? PropertyChangedEvent.Property->GetFName() : NAME_None;
  
	//Update Picker to JoyColor property change!
	if (PropertyName == TEXT("JoyColor"))
	{  
		SetJoyColor(JoyColor,true);
	}	
} 
#endif

void URamaColorPicker::SetJoyColor(FLinearColor NewColor, bool SkipAnimation)
{
	if(!MySlateColorPicker.IsValid()) 
	{
		return;
	}
	
	//Skip Anim?
	if(SkipAnimation)
	{
		MySlateColorPicker->InstantColor = NewColor; 
		MySlateColorPicker->Animation_SkipToFinalForOneTick = true;		//See SJoyColorPicker.h
	}
	else
	{
		//Set!
		MySlateColorPicker->SetColorRGB(NewColor);
	}
}

void URamaColorPicker::ColorUpdated(FLinearColor NewValue)
{
	JoyColor = NewValue; 
	 
	if(OnColorChanged.IsBound())
	{
		OnColorChanged.Broadcast(JoyColor);
	}
} 

TSharedRef<SWidget> URamaColorPicker::RebuildWidget()
{
	MySlateColorPicker = SNew( SJoyColorPicker )
		.TargetColorAttribute( JoyColor )
		.OnColorCommitted( FOnLinearColorValueChanged::CreateUObject( this, &URamaColorPicker::ColorUpdated) );
	
	return MySlateColorPicker.ToSharedRef();
}

//Release
void URamaColorPicker::ReleaseSlateResources(bool bReleaseChildren)
{
	Super::ReleaseSlateResources(bReleaseChildren);

	if(MySlateColorPicker.IsValid()) 
	{
		MySlateColorPicker.Reset();
	}
}

void URamaColorPicker::SynchronizeProperties()
{
	Super::SynchronizeProperties();
	 
	SetJoyColor(JoyColor,true);
}


/////////////////////////////////////////////////////

#undef LOCTEXT_NAMESPACE
1 Like

OMG RAMA!!! Have no words in the world to thank you!!!

1 Like

Hee heee!

Love and Joy to You tooo!

Have fun!

I have used this very color picker in my own :sparkling_heart: packaged games :sparkling_heart:, so I know it works!

Enjoy!

:sparkling_heart:

Rama

1 Like