Giter Site home page Giter Site logo

aquanox / subsystembrowserplugin Goto Github PK

View Code? Open in Web Editor NEW
264.0 12.0 43.0 994 KB

Plugin that adds a Subsystem Browser panel for Unreal Engine Editor to explore running subsystems and edit their properties.

License: MIT License

C++ 93.63% C# 0.76% C 5.62%
plugin unreal-engine ue4-plugin subsystems engine-plugins editor-extension ue5-plugin c-plus-plus unreal-engine-code-plugin unreal-engine-plugin

subsystembrowserplugin's People

Contributors

aquanox avatar mothdoctor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

subsystembrowserplugin's Issues

User Experience Improvements List

There are some ideas to improve user experience or help new to unreal people when using plugin based on feedback/messages/ideas.

  • Better tracking or explanation of reasons why Game Instance Subsystem filter has no items (due to not running PIE or running PIE and forgetting to call Super::Init in GameInstance class)
  • Make editor-mode World Subsystems be easier to notice from game-mode World Subsystems (maybe extra tooltip or category label)
  • Make subsystems list coloring customizable as some people want their subsystems display in different colors to be distinguishable. Possibly via custom editor-only meta specifier.

Editor freezes when some subsystems are selected

When selecting my subsystem, the editor would freeze for a long period of time. This video was cut short, because it seemed the only way to resume working is to close and restart the editor. Same thing happened when I selected the Actor partition subsystem in the tree view.
https://user-images.githubusercontent.com/23241818/182373106-16235ce1-1ae0-4168-833d-3876c6da9772.mp4

The subsystem consists of multiple arrays of components, actors, FGuid's and a TMap<FGuid, CustomStruct>

//properties
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "SLDynamics")
	TArray<ASLDDevice*> Devices;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "SLDynamics")
	TArray<USLDPortComponent*> OriginPortComponents;
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "SLDynamics")
	TArray<USLDPortComponent*> PortComponents;
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "SLDynamics")
	TArray<FGuid> PortIDs;
	//TODO: Swap to sorted map, since it should be faster for smaller data sets
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "SLDynamics")
	TMap<FGuid, FPortData> PortMap;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "SLDynamics")
	TArray<USLDNetwork*> Networks;
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "SLDynamics")
	TArray<FSLDConnection> Connections;

and the struct inside the map is just this

USTRUCT(BlueprintType)
struct FPortData
{
	GENERATED_BODY()
	FPortData() { }
	FPortData(USLDPortComponent* PortComponent)
	{
		component = PortComponent;
	}
	FORCEINLINE bool operator==(const FPortData &Other) const
	{
		return (component == Other.component) && (connections == Other.connections);
	}
	
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SLDynamics")
	USLDPortComponent* component;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SLDynamics")
	TArray<FGuid> connections;
};

Subsystems Config Panel in Project Settings

Would be nice to get a config panel going for subsystems, better usability for configs as simply export/import/refresh is not enough.

  • Make a dedicated category Subsystems in Project Settings panel
  • Scan and register all Config-able subsystems with at least one config property in class within Settings module
    • Extra attention to dynamically/deferred initialized subsystems
    • Most likely keep the things tracked in base module class
  • Make "Reload Config" option to force ini update from menu (?) maybe move things into a submenu for all ini-related actions

5.1 Missing include

FEditorStyle undefined.
And:
FEditorStyle::Get() is deprecated, use FAppStyle::Get() instead.

Support for custom table columns

Not everyone interested in Module or Config sections for subsystem and may want different columns to be shown in table (like IsTickable flag or PlayerId)

Hence the idea to add support custom pickable columns for browser tree table.

Changes:

  • Rework how columns function (Identifier, Title, Data source function, Widget source function)
  • Move column settings from model to module
  • Expose browser module and RegisterColumn

Workflow:

  • Get access to browser module via standard means
  • Call RegisterColumn to add column instance
  • Activate column in view options
  • Enjoy subsystems.

5.2 compile fails, and Market compatability

SubsystemBrowserUtils.cpp
// flags no longer need to be added in 5.1.1, throws warning, so the Engine just refuses to enable the plugin.
ADD_FLAG(CLASS_NoExport);
ADD_FLAG(CLASS_CustomConstructor);

Market lists plugin as compatible up to 5.0 so is out of step.

Deep and recursive UObject property handling

Deeply nested and recursive UObject editable properties sometimes cause issues when displayed in default DetailsView resulting in freezes and sometimes in stack overflow exceptions.

Maybe try to make a IDetailsCustomization for the subsystem or something similar with lazy or deferred building of property tree. So instead of DetailsView recursively building extremely large tree when subsystem selected substitute non-trivial UObject properties with lazy click-to-expand behavior? There are no customizations for subsystems in engine so it should be possible.

It is also possible to define a custom meta specifier to allow specify Lazy/Immediate property tree construction for property.

Making a fully custom details view may be problematic from just a plugin scope.

Live Coding Reinstancing and HotReload tracking

This is list of my ideas to add some extra QOL to the plugin as there are things that could happen when Live Coding Reinstancing or HotReload is being used when working with Unreal Engine (for example missing properties, not loading ini config).

It is possible to track object states for validity and display big red warning label that things may go bad until editor is restarted.

  • Can try track UStruct::PropertiesSize change (since we got a copy of subsystem info in SSDescriptor) validate with it
  • Can try track special names like RELOADED or REINSTANCED and similar
  • Can try track duplicated entries that could appear in certain situations
  • Can hook to FCoreUObjectDelegates::OnObjectsReinstanced to track that reinstancing was used
  • maybe something else

Scrolling does not work in the details panel of a Subsystem

Awesome plugin! But I ran into an issue when trying to view details of a subsystem with many properties.
If the panel expands beyond the borders of the window, I can't scroll to the properties outside of the view.
The scrollbar appears for a frame or two and then disappears.

image

Support for custom subsystem types

Some projects have custom subsystems (GameplaySubsystem, TickableWorldSubsystem) that would be nice to display in browser as separate categories.

Hence the idea:

  • Move subsystem categories from model to browser module to be customizable
  • Expose RegisterCategory to be accessible (possibly switch to private/public folders or expose main folder?)

Typical workflow would be:

  • Take reference to browser module via standard means
  • Wipe existing or call RegisterCategory to add a custom category
  • Enjoy subsystems

Game Instance Subsystem Not found

in both UE_5.1.1 and UE_5.2.1
I have a subsystem that is child of UGameInstanceSubsystem.
that will need a UDataTable assigned to it. I was hoping to do it through the plugin, but it does not appear in the browser to avoid hard references.

the Browser does show the child of UTickableWorldSubsystem that I created, and it is performing as expected.

steps to reproduce:

  • in project "SubSTest" as C++ project
  • added SubsystemBrowserPlugin to Plugins folder in project Root
  • had to modify in accordance with Issue#9: in SubsystemBrowserUtils.cpp comment out
    // ADD_FLAG(CLASS_NoExport);
    // ADD_FLAG(CLASS_CustomConstructor);
  • opened project by Compile and Run
  • created UGISubTest as derived from UGameInstanceSubsystem
  • gave UGISubTest required code
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "GISubTest.generated.h"

/**
 * 
 */
UCLASS()
class SUBSTEST_API UGISubTest : public UGameInstanceSubsystem
{
	GENERATED_BODY()
public:
	// Begin Subsystem Required
	virtual void Initialize(FSubsystemCollectionBase& Collection) override
	{
		Super::Initialize(Collection);
	}
	virtual void Deinitialize() override
	{
		Super::Deinitialize();
	}
	// End Subsystem Required

	UFUNCTION(BlueprintCallable)
	void TestFunction()
	{
		UE_LOG(LogTemp, Error, TEXT("Subsystem Was created"));
	}
};
  • compiled and ran (no errors)
  • opened Window-> Subsystem
  • scrolled down to GameInstanceSubsystems (index has no children)
  • blueprint able to place "Get GISubTest" and call "TestFunction()"

expected behavior there should be an entry for GISubTest (even if it has no members)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.