This tutorial was written on Windows 10 using WSL with an O3DE version that
was built from source, on commit e2c4c0e5e3
In the previous article we created and built our project and level. In this article we are creating a start menu.
Create the Start Menu
Next we will create a start menu that waits for player input before starting
the game. We will create this using the UI Editor
which you can open by clicking
on the UI Editor
button in the toolbar at the top right of the editor
Or from the tools drop down in the main menu.
This will present you with the UI Editor Window
This window is divided up into 4 key sections.
- The menu and toolbar area contains dropdowns and frequently used tools.
- The Hierarchy shows all the elements currently added to this UI asset.
- The Canvas View gives you a WYSIWIG editor for your UI elements.
- The properties area shows detailed and editable information about the currently selected element.
- The animation area allows us to create animations for our elements to make a more dynamic interface.
Our UI will consist of two elements: a background
element which will darken
the screen and provide some separation of our UI elements and the 3d scene as
well as some text telling our player what they should do. Here's what we will
be going for:
Lets start by adding the background element. From the New
dropdown, select
Empty Element
This will add an empty element to our canvas. While it is selected in the Hierarchy
window, use the Properties
area to rename the element to Background
.
By default this element has two components. An Element
component. This component
gives you a unique Id by which to reference it, as well as a toggle box to control
whether or not this element starts enabled or not.
As well as a Transform2D
component, which is a little more complex. Before
we play with the Transform2D
component, lets add a component to our element
so that we can see it better.
From the Add Component
dropdown button select Image
You will notice that or element has become a small white box.
We can use the Transform2D
component to control how this box is placed on
our Canvas
The Transform2D
component gives this element the ability to have a location
on our canvas. An element's position on the canvas is defined by two sets of values.
Rather than positioning elements relative to the screen, instead each element
is positioned relative to it's parent. Anchors
allow you to control what
point on the parent we want to position relative to. By default, we position
ourselves based on the center of our parent, and this gives us a set of Offsets
from this point. If we change the X Pos
or Y Pos
we are changing the position
relative to the center point of our parent, while width and height are absolute
values.
Similarly we can anchor to any corner or middle of any side of our parent, giving us relative
offsets to that point. Additionally we can anchor to a side, stretching our
element to the entire width or height of our parent, or stretch to fit the entire
parent. Note how in these modes, the offset
values change to better describe
how you are positioning your element.
For our control, we want to fill the whole screen, so we will set our anchor
to stretch to fit our parent (in this case the canvas
). We will then set
our offsets
to 0, since we do not want to create any margin around the edges.
Since we don't want to flashbang our players when they launch our game, lets
tone down that hyper bright white element and make it more like the background
from our target image. Using the Image
component we added, we can change the
color
to be black, and the Alpha
to be 0.5
.
Next, lets add another new element using the New
dropdown button and lets name
this one Text
.
To get it to display some text, lets add a Text
component.
And lets modify this Text
component to display the instructions for the player
to Press Enter to Start
as well as play with the font size to get it to
take up a bigger portion of the screen. (We used 50.0
in this image).
Once we get everything to look the way we want, lets save this UI layout to a
file so we can use it in our scene. Press File | Save Canvas As...
and save
it into our project. I like to put it in a folder called UI
and save the file
as StartMenu.uicanavs
.
We can now close the UI Editor Window
. Back in the Entity Outliner
in the
main editor view, lets create an entity that will be responsible for displaying
our UI. Right click in the Entity Outliner
and from the popup menu select
Create Entity
. This will add a new entity to our scene called Entity1
.
With this entity selected in the outliner, go to the Entity Inspector
and
rename it to something more descriptive like Start Menu
Now we need to have it display the UI Canvas
we created earlier. Using the
Add Component
button, start typing to find a UI Canvas Asset Ref
. This
component holds a reference to a UI Canvas Asset.
Use the button next to the Canvas pathname
attribute to open a dialog that
helps us pick which canvas to assign.
Press Okay
and then back in the Entity Inspector
on the Image
component
make sure you enable the toggle for Load automatically
. This will display
our UI as soon as our game starts.
Now we can test our game by pressing Ctrl+G
or pressing the Play Game
button
in the upper right corner of the editor.
Prevent Camera Movement
Right now there is a small problem with our start menu: you can still move the
camera while it is visible! Disabling this is very easy. All we need to do
is find the Camera
entity in your Entity Outliner
. It is a child of Atom Default Environment
.
With it selected, find the Fly Camera Input
component in the Entity Inspector
and uncheck the
toggle that says Is Initially Enabled
. This will prevent the fly camera component
(which is responsible for letting the player control the camera) from being active
at the start.
Now if you enter play mode, you will not be able to move the camera anymore.
Conclusion
Make sure to save your work with Ctrl+S
or File | Save
In this guide we covered a lot of new topics, including:
- Create a canvas.
- Add and position UI Elements within a canvas.
- Add components to Entities in a level.
- Find and edit properties of components in the editor.
- Test changes in play mode.
Now we have our basic start menu displaying. In the next article we will be looking into using Lua to help us with Scripting the Start Menu