Creating Editor Utility Widgets | Inside Unreal

Creating Editor Utility Widgets | Inside Unreal

>>Hey Unreal devs. It has been an exciting week
for the Unreal Engine team. First up, Unreal Engine 4.22
is now available to download. This new version features
real-time ray tracing, a rendering code refactor which significantly improves
mesh drawing performance, up to 3x faster iterations
when making C++ code changes, enhanced virtual productions
tools and sound design and so much more.
Take a look at the release notes for the full list of changes
and download 4.22 today. If you were not able
to make it to the Unreal Engine
talks at GDC, or need a refresher
from the show, we’ve now posted videos
of those sessions online, from additional details
on the rendering refactor and new ray
tracing functionality to getting hands-on
with the control rig, Niagara effects
and Chaos destruction tools, there are hours of content
for you to consume. The Unreal Engine Marketplace
spring sale is underway with over 3,700 products
discounted by up to 90%. If you are looking for items
to bolster your projects, from plugins to models,
animations, and more, grab them before April 10th
at Thank you to all
the wonderful creators that helped make this
our biggest sale yet. In addition to all
the incredible assets on sale, our latest round of free
Marketplace content has hit the site. An advanced locomotion system,
a dining set pack, a networkable
destruction toolkit, a music collection,
and a melee weapons pack are all now available
to download for free
through the end of the month. In addition, an advanced
glass material pack and a modular subway train
have been added to our permanent library. Don’t miss out on snagging
these great assets. If you have been looking
to speed up your workflow, then you’re in luck. Jakub Pander,
designer at Carbon Studio, creators of The Wizards VR, has put together a guide
with keyboard shortcuts and quality-of-life tricks that he has found helpful
over the years as a designer in Unreal. Find out his methods
for arranging objects on a grid, copying elements,
and other tips. Just a few years ago, the notion of a cross-reality
content production company did not exist. With their cutting-edge
virtual production techniques, Norway-based
The Future Group has gone full-throttle
into this emerging field. In the process,
they have helped define both what cross reality is,
and what it can do. In our latest
Virtual Production podcast, their Chief Creative Officer
at The Future Group describes the challenges
of producing live cross-reality performances, and discusses his fascination
with the technology that led him and his team to push the limits
and produce the impossible. Now to give thanks
to our weekly karma earners. These fine folks are supporting
their fellow devs on Answerhub: ThompsonN13, duderseb,
Nebula Games Inc, Ikav, KristofMorva,
Shadowriver, Alekann01, Everynone, BenVlodgi
and gigone.lee. Answer questions and support
those devs on AnswerHub, and you could hear
your name up here too. On to our community
spotlights this week. First up is
Super Powered Battle Friends, a 2D platform fighter
being built by a handful
of ambitious students. Ultimately, they plan to create
a variety of playstyles, including King of the Hill and
Capture the Flag to the game. And we think it is off
to a great start. Nice work to this team. Next up is Exodus Reborn,
a JRPG currently in development. Team is really loving the look
and feel of the title. If you want to jump in,
their team is frequently streaming their development
on Twitch. So be sure to stop by
and say hello. And our final spotlight
this week is this lovely
interior scene. It’s nicely composed
and you can download the whole scene via
their artstation page if you would like
to walk through it yourself. All right, thank you
for joining us for our news
and community spotlight.>>Hey, folks. Welcome to
our Unreal Engine livestream. I am your host,
Amanda Bott, and with me, I have
tools programmer Lauren Ridge.>>Hello.>>Thank you for joining. And we have our guest
Nick Pfisterer, founder of Unreal Slackers.
Hey, Nick.>>Hey, everyone.
How is it going?>>So, thank you all
for joining us. We are going over
creating utility widgets, new to 4.22, right?>>Yes.>>So, would you like
to give our guests an overview of what that means?>>Yeah, definitely. So, basically in Unreal Engine,
you can make game UI using UMG, but we wanted people to be able
to make editor UI also without having to write
Slate, which is what all the editor
is written in right now, in C++. So, to make an editor utility
widget, it is pretty easy. It is just in the content
browser, under editor utilities. And you will see editor
widget here. And if you open it, and give it
a nice name, my widgets. You double-click it, and you can start dragging
in your widgets here. What I would say is, I would
get rid of the canvas panel, because the canvas panel
is a fixed size, and the cool thing about this is you will be able to resize
your tap however you want. So, a canvas would not really go
with that, necessarily. But let us see, if I go with,
like, a particle box. Place that in here. And then I can add
a bunch of different buttons. I can add images, sliders,
I can add text, either to my buttons
or to the UI. And then say I want, you know, clicking this butting
to do something in the UI, I can then bind on clicked here, and that will take me
to the graph where I can just wire up logic
the same way that you could with, like, Bluetilities,
which I think were the main way people did their tools
up to this point.>>So what do you feel like
are the biggest differences, then, between creating
these editor widgets versus Bluetilities?>>So, we definitely want to,
like, sort of recommend that this is the way people
make editor UI now if they are a tech artist.
Like, you can do things like, I think we had a request
for tooltips on buttons, things like that.
So you are able to make a UI that is easier to hand off
to people, like, whether it is through
the marketplace or other artists on your team,
because you can make tooltips, you can, like, add information
about what to do, you can have, like,
responsive UI that switches in a different widget panel
with a widget switcher if, like, oh, I check this checkbox,
show them options A through C
instead of D through F, whereas with Bluetilities you really had to only
have buttons and properties. The other thing that is
pretty cool is before, to use a Bluetility,
you either had to use the shelf, which is a little bit hard
to get to and not part
of the main workflow, or you had to place something
in the world, which is helpful, I mean, it is fine if you
only have a couple of levels. But say you had some editor
utility that you wanted to, like,
open all your maps and save out
an overhead view of the minimap. You do not want to have
to place one of those in every single map you have. You just want to be able to,
like, right-click, run this,
and get a UI here.>>Right.>>Which, and then be able
to click your buttons. One other thing that is pretty
cool is if you compile and save, it will actually propagate
to whatever you have open. So, it is pretty fast
to iterate on.>>Oh, nice.>>Which I have liked as
I have been testing this out, to just be able to,
like, save, compile, and like, oh, it is there,
I can just test it. People who are doing editor
scripting with Python, which uses a lot
of the same functionality as these editor utilities, we are looking for ways
to make the integration between these editor utility
widgets and Python smoother. Like, right now
you would just kind of use a console command node in here, but like, you would have to pass
in every single parameter as part of the string.
We want to improve that. Kind of editor
scripting in general, we want to work on making
that workflow more powerful. Because I think especially
for, like, tech artists, or people making
tools internally that might not be
part of the editor, but unify, like, three plugins
they want to use, it is huge.>>Yeah, that seems
like a game-changer. And I really like the comment, especially, you know,
for Marketplace, if you are selling your items,
like, this is a great way to help the people
that are using your tool without necessarily having
to have this long document, or, not that you also
do not want that.>>Right. I actually
already saw, I think, yesterday on Twitter,
somebody had, like, lookup tables, and they were,
like, able to apply them, like, rather than go through
the content browser, drag it on to the post process,
like, manually switch it, you could just click
the, like, preview in the editor utility widget, and it would show up
in the scene. So, like,
a lot of the automation of, just, like,
one-click apply to scene.>>Oh, perfect. Yeah.>>So, there is a lot of really
awesome powerful things you can do with it. And then it is as easy
as just right-clicking and run there, so yeah.
Oh, one other thing, actually. Sorry. There is one more.
So, now that this is open, my widget is actually
accessible here, because I always talk about,
like, the shelf, and like, you are always going to have to
have that docked somewhere. But this works
with the regular windows, where you would go find,
you know, Sequencer,
or more content browsers. My widget is actually here
under editor utility widgets, and it will be there
as soon as I have opened it. But if you want it to be there,
like, once you have opened it,
as long as you, like, when you close
and reopen the editor, excuse me,
and come back tomorrow to work, there is a setting here
called always reregister. Let me see if I can,
there we go, with windows menu. And if you check that,
then, like, even if you close
the tab over here, I go window, editor
utility widgets, my widgets, so you can make it more of a, like, first class
citizen for your editor.>>Nice.>>So, that is just
a nifty little thing. We want to expand, kind of,
this making them feel more like full editor tabs
instead of addons that you have to do a lot of
manual work to get going.>>Right. See, that is great. Yeah, they are wondering
if you have a button to, like, go back to the last actions. Like, if you can untangle some
of your experiments with it, or like, can you undo?>>Okay, so yeah, undo, I think, Nick might cover
some of the transaction stuff. But yes, you do have to manually
kind of wrap things in create, copy for undo buffer,
or like, start transaction. Let us see.
Begin transaction. So, like, these transactions,
when you see the little toast that pops up when you undo
in the bottom corner, that is where you pass in,
like, the description, and the object that, like,
say you undid, probably your widget blueprint would be, like,
what you would focus on here. And then you would hook up
your nodes of, like, oh, delete some things,
or move some things around, and then end the transaction, and that makes a whole
transaction for the undo buffer that you would see,
like, here in the undo history. All of these were
set up in code, right? Clicking on actors being labeled
as this set of actions.>>Gotcha.
>>Adding node is this set. So, it is closer to, like,
the C++ side of actions, but it is nice to have
the undos in there. Like, when I first started,
I accidentally, we did not have the functionality
in yet for the undo buffer. And so I had destroy actor
as my test case. And I was like,
oh, well, I guess, I mean, it is really gone, 300% gone.>>Bye.>>There is no undo. So, undo transactions
are definitely going to be a thing
that are key to have in there.>>Yes, that seems important.
It is like, oh, yeah. Yeah, they are gone.>>They are working as intended.>>With unintended consequences,
right? So, it was good, though.>>And that is all in 4.22,
so you will be able to use that.>>Great.
So you can play with them now.>>Yeah.
>>Make cool things. You mentioned there was actually
an interesting once we have already seen.>>I think–
oh, the make game button?>>Yeah, I liked
the make game button. Mostly, I was like, oh, I should have thought
of that, like, four days ago. Like, this is what
I should have announced with.>>It is like spawn cat pictures
and things. Yes.>>Done, so yeah. Yeah.>>But we have seen really lots
of applications, I think, even in the preview builds,
like, people made Android debuggers. People have made, like, they
have used the web browser plugin to put websites in the editors.
They can, you know, have YouTube up to watch
YouTube tutorials there.>>While they are in Ninja.>>Yeah.
And then a lot along the lines of what Nick is going to
show us, of like, level design tools,
which is a lot of, I think what we will see for,
like, the beginnings of things.>>The bulk of it,
at least to get started.>>Yeah. Yeah.
>>Okay, cool. Nick. Do you want to give us
some example that
you are going to walk through?>>Yeah, of course.
>>Oh, we just have to–>>So. You got me?>>Maybe.
>>Maybe?>>Our screen is not wanting
to move over for you.>>Oh.>>Do you want to talk about
at a high level, kind of what you are
going to go over today?>>Yeah, sure. So, I am here to talk about this
from a user perspective. When I first heard
about editor utility widgets, I was really excited because the
Bluetility stuff was awesome, but like, it was, like Lauren
was saying, you know, the process of making them
and integrating them with your workflow
is a little cumbersome. And so I am going to talk about,
like, I have some examples. I just put together
some simple, like, level design tool examples,
stuff that I thought would be fun and relevant
to the kind of stuff I do. And basically, you just, like,
the whole experience, to me,
the biggest advantage, the coolest thing is that
because it leverages UMG, you are letting people use
their existing knowledge. Like, a lot of technical artists
and UI designers already know UMG from building UI
for their games, and now they can build UI
for their editor with that same skillset, and that is kind of
like the big thing for me that I think is super cool.>>Like I say, I think your UI
is prettier than anything I have made in my test cases
so far, so that–>>I actually kept the pretty,
like, default style. I really only
just covered, like– I changed the color
of the buttons, and I tried to, like,
give some sane arrangement, somewhat sane arrangement
to the layout, but nothing too fancy at all.
And actually, I will say, because Lauren mentioned
this earlier, I actually did not have time
to integrate undo buffers, so that is not
in my examples yet. But I am going to
put these on GitHub, so I could just update
those later, and then there will be
undo examples. I want to put those in there,
because I think that is a good– I want to kind of, like,
show that best practice to make sure
that people know that they have to do
undo themselves. Because otherwise,
like you said, it is like, if you do not do that,
then it is gone, and you are kind of– so, by the way,
everyone in chat, if anything looks too small
or hard to read, just let us know,
and I can bump up the scale. But hopefully
this works out well. I have already got it
bumped up to 200% DPI. Hopefully that
will be serviceable. Should I just go ahead
and get started?>>Yeah, feel free to dive in.
>>Cool. So, I just put together
a simple little scene here. You can see I have got a bunch
of chairs, table, the bench. This is all from
the starter content. I did not add any, like,
third-party stuff at all here. So, I am just going to dive in.
So, the first thing I did, like the most obvious stuff
was rotation tools, because, like,
so here is a good example. If you select, like,
multiple actors, and then you want
to rotate them, they are going to rotate
around the axis of the most recently
selected actor. And that can be useful,
but what if, you know, I often find that I like to,
I want to rotate stuff in place. So, I added that ability first. So, here I have got
a whole row of chairs selected, and now I can come up here
and I have rotate- and rotate+. That is basically just like
positive and negative. And then I have
a degrees input here. So I have it set to 90 degrees,
and if I hit +, then I will just rotate
all of these. Oh, why is that not working.
Oh, okay. I am having technical
difficulties, apparently. Interesting.>>That is the live demo.>>Oh, you know what? I knew it. Yeah, well,
we are doing it live, so I know exactly what it is.
When I first coded this, I did not have the ability
to select an axis. I added that yesterday, because I wanted to be able
to select an axis, and I do not have
an axis selected. That is what is going on.>>So, technically,
it is working, just rotating on no axis.>>So, yeah. Technically it
is working as expected. I am just, you know, forgetting
my own stuff here, so. I have an axis selector here,
which I added so you could choose
which one you are rotating on. So, if I select Z axis here, which is what I was planning on
doing, then now, there we go. So now you can see,
I can just easily rotate things in place 90 degrees,
which can be really handy. And of course,
I added random rotation. I am going to do that
on this bench over here so I do not mess up my chairs. So, this random button,
if I click that, it adds a random rotation. And of course, so, like,
the big thing here is, this is the kind of stuff
that I used to do in a construction script,
which is fine in a lot of cases. But being able to take it out
of the construction script means that it is class-agnostic.
You can just do it on, do this operation
on any actor in the level, whereas in
the construction script, it is tied
to that Blueprint class.>>Right.>>So, this is really cool
for that reason. You can just, I feel like it
gives you a lot more freedom as a level designer to just,
like, in the moment, I want to randomly rotate this,
instead of, like, oh, well, now I have to make a class
and add this functionality. So, let us see. Ooh, okay, so I am just going
to go to my favorite things, which is the arrangement tools
that I made. See, I have got this chair here, and the reason
I have this chair here is because I want to have all
these chairs looking at the table. I want to have all these chairs
looking at this table. So, I have got
these buttons here. This set focus button, what it does is
if I select this table, and then I click set focus,
you will see over here, well, it is
kind of cut off a little bit. There we go. You can see
it says focus, SM table round. So, it is kind of holding
a reference to that object, and now I can de-select it,
and it still remembers that. And that is handy,
because now I can come over here and select all these chairs. And if I click this look
at focus button, then boom, all of these chairs
are facing that table. And that can be really cool, because if I move,
even if I just move the table, I come back here and I select
all my chairs again, then it is going to update.
And one of the use cases, I was talking to somebody
at my meetup last week, and people were saying, like,
oh, I would love to be able to
arrange things around an object, especially if you had,
like, pillars or statues or something like that, and you want to just quickly,
like, drop an object in and select a bunch of things,
and have it all, have them all point at it,
this is an easy way to do that. So, another cool use case that
editor utility widgets enables. And so, to push that
a little further, let us say that I want
to have a few objects specifically arranged
kind of tightly around this object here,
this table, for example. So, I am going to grab, I think
I am going to grab five chairs. If I grab five chairs
and I come over here and click this radial formation
button, then look at that. I have got all the chairs
kind of just nearly arranged, and actually,
if I rotate those in so they are actually
facing the table, now we have got a nice little
inviting table. We can all sit around and chat.>>Nice.
>>Yeah, that was very nice. I was like,
why are they facing away, right?>>Have some lunch or something.
Yeah. It was the antisocial table.>>It is like,
that is musical chairs.>>Yeah, yeah.
No, so you can face it inwards and make it
a little more social, so that is nice.
But again, I think this is going to be
super cool for level design, because being able
to make it class agnostic and just take anything
in the level and wrap it around an object
like that is going to be super cool.
And the last example I have is something to do
with organizing assets. I actually just discovered
this yesterday. I did not realize
you could do this, so I added this in. So, you see my world outliner
is pretty unorganized. Just is a big list of stuff. Everything is kind of
just in there, like a big mess. But, so if I click
this organize actors button, look what has happened. It has taken
all of my static meshes and put them in a meshes folder, and all of my lights
and put them in a lights folder. And that is a really, like, you know,
overly simplified example, but you can take
that even further. You can organize by all sorts
of different types of assets. And I guess now would probably
be a good time for me to jump into
the actual Blueprint itself and kind of walk through
how I did some of that. Do we have time for that?>>Oh, yeah, absolutely.>>Okay, cool.
So, I will pop this open. So you can see, it is just
a standard UMG widget, which is the cool thing. No, like, weird new stuff
going on here. Let us see. So, there is
a pretty robust API, even for the first version,
I think. I mean, obviously there is
a lot more you guys could add. But for a first version, there was quite
a bit of stuff here. And I found it to be pretty
intuitive for the most part. Like, so for example, the way I can tell
what actors I have selected, they just have this get selected
level actors node. And it spits out an array, and then you can
iterate over those. And then of course here,
so for the rotation, I am just iterating
over all of those, and I am adding a rotation value
to the actor’s rotation, and then setting it again. So, that is
pretty straightforward. Set focus,
pretty much all of these are just doing
get selected level actors. So, except for that
organizing thing, though, and that is
the more interesting one. So, here what I did was, there is actually
a get all level actors node. So, it just gets every level,
every actor in the entire level, and I think the only ones
I have excluded is it does not get anything
that is pending kill, or in pie. So, anything that is actually
loaded and in your level will be fed into this array. And then they have
these filter functions. This is the really
cool stuff to me. I thought this was
pretty awesome. There are a few options,
but here, what I did, I chose to do filter
by ID name for the lights, because the lights do not
all share the same parent class. Like, light and sky light are, like,
different classes, for example. But so this is a little bit
academic. This might not work. You know,
your mileage may vary here, but I basically have said filter
by ID name, and that lets you say,
does the string, does the ID name, which is just
the name of the object in the world outliner,
does it contain world light? In most cases, unless you change
the name of your light, then it is going to
contain light in the name, so that is what I did there. And that way I can grab
any kind of light, you know, even if they have
different classes. And then for each one, there is
this set folder path node. This, I thought,
was a little strange, because this does not actually
have an input if you disconnect it.
It is just an input, but with no,
you cannot enter manually, like, hard code a value here
like you can with most inputs. It does not really add it
for me in the end, because I have tried really hard
to never hard code anything, I always use variables. But still, worth noting
that you actually have to use a variable here
to input a value. And the way this works is,
so that is set folder path. All you have to do
is add a name variable. And then, so here I have just
entered the name of the folder. So, you do not have to enter,
like, a root or like a path structure. I actually have not tried it
with subfolders. Can you do that?
Can I do, light / something, like a path, and it
would do, like, nested folders?>>I have not tried it, but that
would be pretty awesome. I was just thinking of, like, looking
at the ones you have got. You have got light
and static mesh actor, but like, so people are often
asking for, like, auto-filtering for things
like the scene outliner, just for the editor in general.>>Yeah.>>But I think being able
to customize it like this is almost even more powerful,
because if you have got something
that is specific to your game, and you are like, okay, I need
all of my game’s pawns to, like, be put somewhere, then you can customize that
with the same type of scripting without,
you know, having to kind of fight
what is currently in there, or kind of do it yourself
manually after using what is already there.
So, that is pretty awesome. I will have to try this myself,
actually.>>it is like, ooh,
I am getting all the ideas.>>Yeah.>>I did not know
about that one.>>Yeah.
>>And as far as, like, what is exposed, we do have the, like, editor
scripting utilities plugin, which I do not know
if it is on by default or not. But we are
adding libraries there. But I know that people
will definitely come across, as they try out things,
like, oh, I want to work
with this class, that we might not have
everything exposed, but making the editor
more scriptable both with, like, editor utility
Blueprints and with Python
is a big initiative for us. So, I think that, you know,
just let us know on the forums and everything, and we will,
at least we will be like, oh, somebody wants to
use it for that. That is, you know,
good for us to know.>>Yeah, should be– do we want
to spin up like a feedback form?>>Oh, yeah. We could, probably.>>We did that previously. So, we can spin one up,
and I know they are already talking about, like, hey,
can we have a collective forum for all of our, you know,
widgets that we have made?>>Yeah.>>So that other people
can use them. So we will work on trying, spinning up
a couple of those for you.>>Yeah. I am excited.
Like, every time I have been, like, watching on the Internet,
I am like, oh–>>What are they missing?>>Yeah, so I am super excited. Because I think people
making tools and having it easier
to make tools is huge.>>Yes.>>Because there is only so much
that the tools team can get to in a given release.>>Right.>>So, or especially things
that are, like, really specific for your game.
Like, if, you know, Nick had, he wants to put
all of his chairs, you know, in one folder, because he needs to make them
always easily selectable, so you can make them look
at the table, right? Like, that is something
that is just for his project.>>Right.>>But it is still
really powerful.>>Mm-hmm, yeah. Actually, that is, now,
since you brought it up, that is actually something
I do want to point out. So, from what I could tell, the editor scripting utilities
plugin is not on by default. The utility widgets
is on by default, but that extra library
of editor scripting utility is not on by default,
so I am using some of that. I think there is, I think
some of these level utilities like get all level actors,
and then the filters, I am pretty sure those are part
of the editor utilities thing. So, that has to be turned on for
this, to get access to these.>>Yeah, and people have been
asking, like, oh, this is new. Should, like, we be nervous
about using it in, like, production projects? And at least everything in here
will, you know, impact, will only
run in the editor, right? So, it is not something that
would affect your game play, anything like that. But, like you said,
the UI itself is all UMG. It is all the proven
kind of code there. It is more the scripting side
of things, and that is why we are kind of
slowly rolling that out. But I think, again,
our goal is to make it all more of a real,
fully fledged, you know, no more hidden behind
check boxes kind of feature.>>Right.
>>So, yeah.>>Yeah, yeah. Honestly, I think
this is probably going to be one of the coolest categories to watch on the marketplace
over the next couple of years. Collections of custom
editor panels– I mean, obviously, like,
the biggest use case here is probably bespoke tools, that are, just like Lauren said,
specific to your project. But I think there is
a real opportunity for people to develop
generic tools as well.>>Yeah.>>I am really excited to see
what people do with that.>>Or even just like, you know, you did something
for your project that is, like, really handy
for your project, but you see where it could be
made generic. Like, this filtering this
where you are like, okay, just put in, you know,
your types of assets, and then Amanda can adapt it
for her project.>>Yeah. We can build,
you can build, you know, a foundation for it.
And it is like, okay, you need to insert your own
variables for your project here, but you have this foundation
already build that others can then modify, so.
And just like in UMG, where you could say,
like, build a health bar and a mana bar
as two separate widgets, and then include them
in one, like, tell me what is happening
to my character widget, you can do that with this. You could have, like,
your actor arranging panel, and your, like,
level arranging panel, and then put them both into,
like, one mega thing, or only use one at a time.
So, I think I am looking forward to seeing the extensibility
of that kind of use.>>Yeah. Really, really cool.>>Mm-hmm.>>Were you still walking
through some stuff, Nick, there?>>I think I have covered
everything. I did want to say
that it is pretty important, I think it is important
to reiterate that because this is UMG, that really enables
a lot of stuff that you could not do before
with editor scripting utilities. Like, for example, I guess I did
not really show this very well, but I mean, this rotating
place functionality, I mean,
I have got an input here. It says 90 degrees,
but I could say, you know, 45 degrees,
and modify it right there. And that is pretty powerful,
being able to input data. And going back
to what Lauren and Amanda were just saying, like,
if somebody were to take, like, say my scene,
my outliner organizing thing, if you were to make, like,
a generic version of that and put it on the marketplace, then, like,
you can just have inputs, where people can put their own
folder names that they want, and adapt it in their own way.>>Yeah, because before you had,
like, properties and buttons, but it was hard to say, okay,
this property goes with, as an input for this button’s
function, or whatever, so it was very, go fill in all
the magic properties down here, and then click the buttons. And it was much more,
somebody had to kind of show you how to use it
a couple times before, you know,
you could use somebody else’s.>>Yeah. Yeah, definitely. And I mean, it is just
really cool to me, again, like, leveraging that
existing knowledge, but as well, the fact
that this is so familiar. Like, this is just
an editor tab, you know? It is just an editor tab
like any other. So I can grab this, just to kind
of show people on the stream. Like, you can grab this,
and dock it, and move it around, just like any other tab.
So, that familiarity, I think, is just going to make this
so easy to adapt for projects.>>Yeah. And right now
it is just dockable, like, within the level editor, but we would like, you know,
the Blueprint editor could have extension points
and things like that. So, I feel like this is only
the tip of the iceberg. I was trying to think of something that
was like an iceberg.>>You are like,
I want to do anything else. That is– yeah.
That is the idiom.>>I think it is only
the beginning, in terms of, like, what people
will be able to eventually do with extending the editor without necessarily
having to dive into C++ and Slate, because, I mean,
that is what I do every day.>>Right.>>But I could totally get that
it is not–>>But I might not want
to do that.>>Yeah, exactly.
You might be like, oh, I just want to mix in UMG and use these Blueprint nodes,
and yeah. So.>>Yeah, that is why I love it. I am all about Blueprint so,
this was like, oh, man, I get like a whole new
playground available to me now.>>Make all the things.
>>Yeah.>>Yeah. It just,
it is empowering, because I mean,
the game I am working on, it is just two of us,
and we both just use Blueprint. So now, like, I feel empowered
to, like, you know, if Jess is like, oh, I need a tool
to help me out, I can just, I can make it now. It is so accessible,
it is right there. And I have screens with UMG,
so I can just, you know, give it a go,
and I think that is so cool.>>That makes me super happy. I am just like, I want to see
everybody making tools, and especially, like you said,
small teams where you might not have,
or you, like, you know, have lots
of tech art experience, but not necessarily want to dive
into changing the engine and things like that, so.>>Right.
>>Yeah, yeah. Definitely.>>Let us see. So, you ready
for some questions?>>All right.
>>Yeah, let us do it.>>Ready.
>>I am ready. Oh, I am hydrated,
now I am ready.>>Oh, yeah, that is good.
Important.>>They are wondering if these
functions work in runtime, so can they adjust
the level that is like, generated procedurally,
or things like that?>>So, that is actually a very
good question, especially for 4.22,
because prior to now, we were not always very clear about what functions were safe
for editor time versus runtime. And so,
there would be something, a node you would
put in your Blueprint, and it might crash your game
when you are testing, because it is looking
for this editor-only data, which is kind of a concept
we have so that we mark up data and functions as editor-only,
which makes them, you know, keeps them
from running at runtime, but it also makes
your runtime classes smaller and more efficient. So, it is like, you know,
there are reasons for it, making sure that we are only
using editor data in the editor.>>Right.>>But in 4.22, we have tried to be
much more clear about that, and if you have got an
editor-only node in a runtime, like, UMG widget or Blueprint, it will warn you
and it will not compile so that you do not
get this crash, right? So, we are trying to be
much clearer about that. And then, you can use
runtime nodes like, you know, maybe spawning
a player controller or something like that
in an editor widget, but you cannot go the other way,
again, because that data
might not be there, and it might not be safe
to use at runtime. So, it just depends
on the nodes, like, there is not–
they will not show up, also, in, like, the Blueprint,
just make a– like, the context menu.
Oh, that is not ours.>>Just double-click
the [INAUDBILE].>>Wrong editor.>>I saw an editor,
I can use it. Blueprints, so here,
in your Blueprint class, if you make, like, an actor,
editor-only nodes also will not show up here
in the context menu anymore. So, selected, right, like there is not
a get selected actors in here.>>Right.
>>Things like that. So, things that will only work
in the editor, like this selection state,
will not be available. But you also, like, will not
even be able to add them and then go, oh, man,
I wish I could use that.>>Right.
>>So, it is– we are trying to make it
a little bit easier so you do not discover, you know, a couple months
into dev, that does not work.>>You are like, oh, okay.>>Yeah. Yeah.>>Okay. They would like to know
if they can get the transforms of the viewport camera
within the editor–>>I did see
that one being asked. I think I have actually
maybe got that working, like, on my machine, so it will be in
a future version. So.>>Upcoming.>>Yeah, upcoming.
A lot of that stuff that was in these, like,
placed Bluetilities only, again, we are trying to move
to these more general libraries, because we do not want you
to always have to place something in the world
to get to use it. So, I have been actually
doing that, a lot of that, as some work that will be
in upcoming versions.>>Cool. Are they able to bind
Python utility scripts to them?>>So, right now, you would just
do that by, like, exec commands, the same way you would type it
in, like, the command line. But we do have the down
the line goals to make this
a better process, like, oh, we know your Python
function has some parameters. Let us, like,
expose those for people. That just, we do not have
that work, like, scheduled yet or anything. But we do know we would, like,
make it a little bit cleaner.>>Cool.>>But yeah, for now, this would
be how you would do it. Just execute, you know,
py dot my file.>>This other script, yeah.
>>Yeah.>>Nick, they would like to know if they can have
your example map, and–>>Oh, yeah. Of course, yeah.
So, like I said, I am doing a– this is actually
already on GitHub. The only thing I have left to do
is I want to add the undo transactions
just to show best practices. But this is actually already
on GitHub as it is, so.>>Well.>>I guess I could drop
the link now in the chat.>>Yeah.>>And then just say follow me
on Twitter if you want to find out when it
is updated with the undo stuff. Would it be okay
if I dropped a link in chat?>>Yeah, yeah. Absolutely.
[INAUDIBLE]>>All right, cool. Yeah, because I definitely want
people to have these examples, just to see, because I know, you know, whenever
I see stuff on a stream, I am always like,
oh, can I play with that? So I wanted to make sure that
I did that for other people.>>Yeah, they can jump in,
grab it, and we will make sure it is dropped in both chats,
for everybody. That is–
>>Everyone.>>Yeah. They are wondering if you can run functionality
on tick.>>So, you can.>>And what are your thoughts
about that?>>You can.
>>You can.>>I would not recommend it
if you can help it. So, like, you know, in UMG,
you can do bindings, of always be reading this value as far as what to populate
this text field with, or you can say, hey,
when I have committed this text, or when I have clicked
this button, update things. And the second is always
going to be more efficient. When the editor is running, it might not be as big of a deal
for your experience, as for your players in a game. So, like, I think I am a little
less strict-feeling about it, for, like, an editor tool.>>Yeah. Mm-hmm.>>But even when writing tools,
say you had, you know, four panels, and they are all doing tick
on every actor in the scene, like, that is eventually going
to cause you some slow-downs.>>Right.>>And not be
a great experience. So, you can, but I would say
probably using– because you have got
all this UI available, like, on click, or on commit, or things like that,
even a timer of, like, every second
or tenth every tenth of a second is still more efficient
than tick.>>Better? Yeah.>>But it kind of depends, I
guess, on your use case, right?>>Yeah.>>If you do need
to do something, then, you know,
just do not do it all the time.>>Do not live on the tick.
>>Yeah. Let me see. So, I was just double-checking
that I went and enabled the editor
scripting plugin, and I get selected
as not available here in the regular Blueprint list,
but it is in the–>>That get selected.
>>Editor, yeah.>>Magic, so.>>Again, we are trying
to make it a little bit easier to know what you can use
in the editor, or sorry, at runtime
versus in the editor. But you can always use
runtime things if you want to, you know, script having a bunch
of gameplay things happen just to see what happens, like, do a little bit of QA,
or automated testing, or, you know, open this map
and zoom in on this one thing. Like, you can do all these
things you could do in gameplay in the editor scripting, also. It is just not
the other way around.>>Yeah. Good. Good tips. Let us see.
I had one that I wanted. So, since we were kind of
talking about ticks, they were saying,
the new utilities tick, or they can see them when
they are in the editor window, but they do not tick
if the tabs are not shown.>>Right.>>So, is there any way
that it can tick even when it is
behind another tab?>>So, yeah, that is like,
and again, and it is an attempt
to optimize by, if you do not see the UI,
it does not really exist. So, in future versions,
let us talk about how we are trying to expand
this editor functionality. We do even want to say that
for editor scripting, more than even editor
scripting widgets, but we can say on load, register these three
scripting Blueprints, and listen for events
when you try to import, or listen for events when you
try to save or change maps. And I think that would be
where you want to do tick, is like, make this– I mean, again,
not 50 million times, but the few times you need it, you can, I want to be like,
I am watching you. See a screenshot of my face,
and be like, should I add tick to this? [INAUDIBLE] But–>>It will just be a new, like,
would Lauren use tick now?>>Yeah, the answer is,
try not to. I cannot do a stern face.
Anyway. You would do, with this setup,
you would flag it as, make sure you load this
when the editor starts, and then in there,
you could do tick, or hey, when I, once something
has tried to import, run this on tick,
something like that.>>Yeah.>>So, but that is,
that is not in 4.22.>>You should add them.
>>Sorry.>>I was just going to say,
you should add a warning so that if, in the editor
utility widget, as soon as you add a tick node
when you compile, you should put a warning
in there, like, should you actually
be using this?>>It should pop up Lauren’s
face. Should you use this?>>Just making sure.
Yeah, put a little Lauren emoji.>>All right, first person
to make that one.>>You can make an editor
utility widget that does that, so.>>Perfect.>>Yeah, there you go.
You could.>>Do they have the ability
to incorporate these into custom plugins?>>Yes. So, you–
these are just content. So, you can put them
in a plugin. You can put them in, like,
something that would go alongside a game,
or go alongside the engine. You can make them based
on your own custom C++ classes, if you just want to have,
you know, something that,
hey, if it is minimized, you can still run kind
of a passive tick, things like that.
So, basically, anything you could do
with other widgets or assets, you can do with this.
Yeah.>>[INAUDIBLE] all the things. Can they add actor Blueprints
in the scene using these new buttons?>>Yes. So, the, like,
on clicked effect, I actually did this, I think,
for testing, because I was– like, spawn,
spawn actor from class. You would fill in your class
and your location. Excuse me, I would say, like,
maybe, so there is on construct. I do not know if we have,
like, an on close, that might be something
I need to add for future. But, like, hey,
go find all these that I have stored
in some array, so I can clean them up to,
like, say you have clicked
this button a lot of times. What can I spawn? Anything.
I know so many things. Let us try fog. Spawn fog. Yeah.
All right. Did compile it, okay. So, put this down here so you
can see the scene outliner.>>Yeah.
>>Goodness.>>We need Nick’s tidying up.>>We do, we do.
>>Yeah.>>So, like,
I could add a ton of fog.>>Oh, gosh.>>So, what I should be
doing is, taking this,
adding it to an array, and then, like,
make a cleanup button, or when you close the tab,
you know, do a bit of cleanup,
that kind of thing.>>Right.>>Because who knows,
if your cat comes and sits on your keyboard, or sits on your mouse and clicks
that button a lot, and then you are like,
why do I have so much fog?>>Now you have 100 fog.
Like, well, I cannot see, but–>>So much fog.>>Yeah. But, so yes,
you can definitely spawn things and, you know, take this
and cast it to your type, and you know, call functions
on it, all of that. So, things like the place, Bluetilities you could hook up
to this and say, hey, place
these in the world.>>Yeah.
>>And then remove them, so that way you do not
have to worry about what level you are in,
necessarily.>>Yeah. So is it, then,
they are also wondering, on the other hand,
to control editor contents, which it kind of feels
like what Nick was doing, you know, changing the values
inside materials and things?>>Yeah. So, materials, I would have to look
at the specifics of that. That might be something
that is like, yes, it is possible, no,
we have not exposed it all yet.>>But how exactly do you
get there? Yeah, yeah.>>Right. So, I would say, give that a try
and post on the forums.>>Maybe?>>And like, but that is
one of those areas where I know we have got a material library,
but I do not know, like– but, just like you can
at runtime, you could, like, okay, get your mesh,
get your material, make a dynamic material
out of it, and apply that,
and change values. I have seen that be done, the same way you do it
at gameplay time. So.>>So, they are wondering,
can they drag and drop stuff from a widget into the editor?
I am not– what exactly– okay.>>So, that is actually
something that I am kind of working on, like,
how to make that smoother. I have seen
some use cases of it. Like, I think
somebody was able to–>>Like, what would
your examples be?>>Like, somebody was able
to drag and drop materials from the content browser
over here and then paste them
into the scene.>>Oh, gotcha.
>>Mm-hmm. Excuse me. But I do not recall, sorry, I do not know
how they set that up, and it is something that we want
to make a little bit smoother. But you also can drag and drop,
like, within these two, like, say I had a bunch of little
building blocks of actors here, and I wanted to, like, okay, put this component
on this actor, and then, you know,
place this one in the scene. I think you could do that,
I just–>>Yeah.>>I would have to sit
and experiment with it to really get
the script right.>>Okay. They are wondering,
do we have, are docs on this available yet?>>They are.
They are a little bit, like, hey, you can make this, because all of the rest of it
is really the scripting side.>>Yeah, that is fair.>>But there are scripting docs
on both Python and Bluetility. So, I would say, like,
between that–>>Those are your
better resources.>>And, yeah, probably for this,
for now, because really,
the widgets are like, you see how to set up UMG,
and then hook it up to editor scripting instead of game logic,
so, yeah.>>Yeah. We have had
a number of folks asking where they can
kind of give feedback, or make requests for the things
they would like exposed. I think we have mentioned
this earlier, but after the stream,
we will go ahead and make a forum thread.
That is–>>Oh, you did not do that
while we were–>>Yeah, God.
Right after the show, we will work on making a thread
where you all can jump in and give feedback,
you are using it, or comment on, like, cool ways
that you are using it, you know? Or again, requesting what kinds of things
you would like to see exposed, so that we can funnel
that to Lauren.>>Right. Because the editor
is a very big place with lots of surface area,
and like, different teams will probably need
to expose different parts, like, the anim viz team will need
to do the animation side of [INAUDIBLE]. So, like, it is good
to get that out, like, in a central place that we can
point people to go look at, too.>>Yeah. They are wondering, can you expose input
to the widget, like mesh input?>>Mesh input, like–
>>I am not sure, exactly.>>Hmm, mesh input.>>Yeah. I am trying to think,
like, I could probably make a gizmo
by, like, placing an editor actor
in the world, and then, like, when it moves,
it sends something, like, just with general
Blueprint communications, maybe. That would probably be
how I started doing it, because these are all
just still Blueprints, and so you can, like,
have one have a variable point, and be the instance
of the other. But I would have to know more about what they are
trying to do there.>>Okay. Yeah, we will see
if The Nightwatcher responds. Can they– no, hold on. Would you be able to show
an example of an editor utility widget
using asset tools?>>Yes. So, like, yeah, no, I–
I am trying to think. Of some of the,
a lot of the ones I did for, like, example cases,
where, like, oh, align these actors in the world, things like that,
which was mostly only local. We do not have that, like,
example out anymore, but we could do at some point.>>Or if it is easier, we could always work on
an example and try and post it.>>Yeah, I think it might
be good just to make that be something that,
you know, we post online. But, like, the asset, I am thinking that
you can do things like get all your selected assets,
you know, filter that, like Nick was showing
the filtering in the, so the selected, or for all
the actors in the level. So, there are things
that are already exposed, yeah.>>Yeah, okay.
So, we can try and see if we can come up
with an example to share.>>These are a little different
than, like, the asset menu extensions where,
like, you can right-click. You make a Bluetility
of a certain class, and you can, like,
right-click on an asset, and it will fill something
in here for you. But we do eventually
want to kind of hook those better together,
so you do not have to make, like, one type of thing
over here for an asset menu.>>And then call it, yeah.>>And one thing over here
for a window. We want to make it more unified, it is just going to be more
down the road. Mm-hmm.>>Okay. Is it possible
to sort meshes to layers?>>I think so.
I saw some layer nodes. I would have to dig in
again more on that. Maybe, but I am pretty sure
I saw something with layers.>>She is going to peek at it.
We will see.>>I am.
>>Oops.>>Filter by layer.
Player, things, let us see.>>Oh, yeah.
>>Yeah, but–>>So.>>So, there is filtering
by layer. I think I saw a request
for that, maybe, and it might be something
that we are getting in June, we are tracking, so.>>Potentially upcoming.>>Yeah. I feel like
I saw that one on Twitter, somebody was asking about it. So, it is probably on the list
of, like, things to get.>>To do.
>>Yeah.>>Yeah. Is it possible
to create custom editor modes, such as landscape paint mode, or gizmos
and what-not using this?>>So, those are all–>>I feel like that
is a little–>>It is a bit farther
down the road. Like, we would like to be able to add that at more
extension points, right? Everything scriptable is great,
but those are all what we call F ED modes, and things start with F
are not exposed to scripting in quite the same way
as U objects, like actors and objects
and U-widgets. So, we would have to write
a lot more infrastructure for that kind of thing.
But, I have seen some people who, like, went and did some C++
for some ED modes, or, like, wrote their own
kind of exposure layer, and have done that. But without more engine changes,
I do not think that is something that is
really widely supported, yeah.>>Immediate, yeah. So, we did have a follow up
to the mesh input. They were asking
if you can expose an input, like, how you make a property
visible in Blueprint, and have a drop-down
to select a mesh from the content folder
for something.>>Oh.>>So, we, I actually have
future work about getting more of the,
like, class input eyedropper thing going on. As basically what would happen
is here, under the designer, you would have,
like, editor widgets that would give you, you know,
class picker, and details panel, and single property list that, like, you could drag
and place in here, and then hook up
to a variable inside. Because one thing that is, I would actually want to uncover
real quick is, like, say you have text
that you want somebody to input.>>Yeah.
>>Like you said, you know, people are entering their value
for the rotation. Then you have got this
on text committed, but you need to make
this be tied to one of the variables
in your Blueprint, so you can work with it
for general Blueprint script. So, let us just make a float,
yeah. And call it rotation. And so you would need
to turn this into a string. And then, if you connect
the string to the float, it will automatically do
the conversion for you. So, that is just, knowing that you have got
to take the value from your UI and pass it to your actual,
like, data structure is something that is
going to be important. But I do not think
it is complicated, it is just kind of
knowing to do it, because it might be something
that is new for people if they have only been doing this kind of Blueprint-only
workflow before.>>Gotcha.>>And then to display it, for example,
where is my construct at? Okay, you be, like,
on construct, say I put as my default,
oh, come on. Then I would, on construct,
get the rotation. And then I would get my editable
text box over here, and get it, and set text. And this way,
you actually do not have to do the
to the string first, you can just take a float
and convert it to text, and you get this cool node here
where you can say how many decimal points
do you want to show?>>Oh, nice.>>Which is nifty. But again, if you have not
used it before, it might be–>>Something new. Yeah.>>Yeah, something new. So, now when I go over
to my UC-75 there, because it reconstructed.>>Yeah.
And that was your default. Nice.>>Yeah.
>>Very cool.>>So, and again, then,
if I change this, it will push it through, but only to,
like the instance of it. It will not change
that default of 75.>>Oh, perfect.
>>Yeah.>>All the fancy things. They are wondering if they can
read a folder on the hard drive.>>That one, I am not as sure,
if it is not something that, like,
Unreal would know about.>>Yeah, they were wondering,
if so, would it be limited to, like, the project folder tree.
I assume so.>>Yeah. I feel like it
would be, like, assets. Like, oh,
I can look in this path within the asset registry, but like,
if it is full of text files that the engine
does not know about, I think they would have
to write their own, like, C++ side for that, yeah.>>Script for that, yeah. They were also wondering
if I could tell you that you did an awesome job
with this feature, and you should feel
great and proud, and all the good feelings.>>Ah, thank you.
>>Yes.>>Now I am going to blush.>>[INAUDIBLE]>>So, yes. This is–>>All right, you can use
one more tick function.>>You have earned
one tick today.>>Oh, wow.
You can use that tick allowance.>>You earned it, folks.
But yes. I feel like we have gone
through our questions, so this seems like a really,
really powerful tool, and definitely,
it already seemed– I had already gotten
that impression initially, and then starting to see
all these examples, like, there is a lot
that our community is going to be able
to do with this.>>Yeah, things that I would not
have thought of, I am super excited
to have already seen, so, yeah.>>Yeah, so thank you
for coming on today, and writing these
magnificent tools. Our chat is
very appreciative of it.>>They would not– I am also very thankful
to the rest of tools, and other engine who have
helped expose the things, because otherwise you
just have buttons that do not do a whole lot.
So, thank you folks also.>>Yes.>>Yeah, and thank you, Nick,
for making examples.>>Yeah.
>>Because, yeah. I think being able to see it–>>Yeah, oh,
but it was my pleasure. This is, like, honestly,
this is like, this was my personal
headline feature for 4.22. It is an amazing release. There is lots of cool stuff,
but this was just like, something I was
really excited about. So, it was my pleasure. I was really happy and honored
to be on the stream, kind of help
let people know about it.>>Yeah, it is awesome. I have shared the link
to your project in both chats. We will toss it up
on the forum event page.>>Cool.>>So, if people want to follow
along and see what updates you are adding
to your example project here, again, we will create
a forum thread for those that are interested in giving feedback
to Lauren and her team, and also for sharing the cool
widgets that you are making, since these are,
seem robust for everyone. I have dropped
our survey in chat. Please let us know what you
thought of today’s livestream, and what kinds of topics you
would like to see in the future. These are for you,
so no better people to find out from than you
for what you would like to see. And also, if you would toss
your email into that survey, we will put you into a raffle
for an Unreal Engine t-shirt. Always check for your local
UE4 meetups, Lots of great folks,
hopefully in your area, making cool content. It is a great way
to get feedback, or you can always start your own
by messaging us. If you would like to be included
in our spotlight, we love to highlight devs,
and we often do that by searching for your projects
in the forums. So, work in progress
and the release project section are where we really
start digging in. We do check on social,
so do be sure to tag us, hashtag #UE4 or @UnrealEngine
to watch for those. And we also enjoy
our countdown videos. These speed dev videos
are a lot more fun than watching microwaves
and things like that. So, if you have got
30 minutes of content, scrunch that down
to five minutes, and shoot us your logo,
the name of your game, and some information
at [email protected], and we will work on getting you
into that rotation. So, again, thank you all
for joining us today. This has been
really informative, so.>>Thanks for having me on.
So, excited.>>We will see you
all next week. Take care. Thanks for joining us today.
Bye bye.>>Bye.

25 thoughts on “Creating Editor Utility Widgets | Inside Unreal

  1. I simply LOVE this tool. So much more comfortable than just having a button in the shelf and/or actor blutility!

  2. This is a huge expansion on just clamping values to sliders, which I already used heavily (haven't gotten into the utilities). Going to start integrating immediately in a modular blueprint system I've been building.

    nice work folks!

  3. Cool! This is a very good opportunity. Thanks!
    But there is one question: "Will the epic games launcher on Linux, so that you can easily install the unreal engine and various add-ons?" For me Linux is more convenient to work.

  4. Hello Guys, what kind of umg (degrees) is this on 20:28 cant find in palette?
    Project link:
    Cant open project, getting that error: 'Failed to load map

    welcome.umap appears to be an asset file'
    Any idea guys?
    Note: I already tried to adding starter content into project file but won't work!

  5. Nice tool!
    Is there a way to save data? As example if i make a character editor utility widget and want to save and acces the data later in game? Can I change default variables of blueprints or save it to a data table?


  7. as a music video director im starting to use the engine but i notice alot of things that should be easy and practical are almost a time sink in the engine. Keep in mind i am new to the engine coming from a after effects background. Even simple things seem to have a 3 step part when i should be able to access some things based on the limited way i plan to use them. I hope you guys keep in mind that more "normal" people are starting to pick up the engine. Even the tutorials ive seen are mind numbing boring, its almost like you guys are to techy and dont know how to appeal to normal people…who knows if you guys even read these comments.. Loading green screen footage into the mesh is omg such a time sink, and then all the nodes to do very basic things are almost a huge turn off…Had i not seen the real time rendering for a movie set in action i'd be feeling like this is not worth the time to make music videos in the engine… I plan to make my own lil hacks and work arounds as i learn the program. I just wish u guys could make basic things easy and fast to do…I guarantee even if you have a dev do what im trying to do it would take him more time than it should to do something as basic as add a green screen video file, drag it on the mesh and be done. Instead im left with tons of nodes and im thinking why wouldnt all this generate it self and if i want to use the advanced settings im free to do so. just my thoughts so far on the engine….i hope you value a real comment over the oooo so cool, wow i love it, fluff comments

  8. Thanks a lot, this is world-changing for tool programmers! Our workflows are going to be faster and more efficient than ever o/

  9. Great tool!! Is it possible to have public variables in the Editor Utility Widget? Basically having public variables as in the details panel of an actor i.e. Actually making a customized details panel via Editor Utility Widget.

  10. Seems the "GetAllLevelActors" node isn't available anymore. But you can still use "GetAllActorsOfClass" with the same purpose.

  11. I love Editor Wiget and as a tool developper makes it so much easier, however, is there a way to attach the Editor widget to a custom window? how do we open a Editor widget through C++ instead of right clicking? can I add a button to the toolbar which opens the Editor Widget?

Leave a Reply

Your email address will not be published. Required fields are marked *