In this tutorial, we'll be covering the basics steps to create a user interface using the C# framework. This tutorial will explain:
Create a new project from a blank template and open the Game.cs. The Game class is the entry point of the application in both the GameLauncher and the Sandbox. When the application is started the OnInitialize method will be called. This will construct a new instance of Game which can be used to start setting up the UI. The Shutdown method will be called while ending playback in the editor which can be used to cleanup the UI.
private Canvas _canvas;
private Game()
{
// The server doesn't support rendering UI and receiving input, so initializing those system is not required.
if(Engine.IsDedicatedServer)
{
return;
}
// Used to set up a new UI.
CreateUI ();
Mouse.ShowCursor();
}
private void CreateUI()
{
}Next, a Canvas will be added to the Application which will draw a Text component. Every UIElement and UIComponent should be a child of a Canvas which is responsible for updating and managing every child UIElement.
The Canvas and the Text are added in the CreateUI by adding the following code.
private void CreateUI()
{
_canvas = SceneObject.Instantiate<Canvas>(null);
var text = _canvas.AddComponent<Text>();
text.Alignment = Alignment.Center;
text.Height = 24;
text.Content = "Basic UI Example";
text.Offset = new Point(0f, 120f);
}After compiling the project and running the game (in the GameLauncher or Sandbox), the text will appear slightly below the center of the screen.
Next up, an image will be added. First off, right-click and save
To access the image in-game, we'll need to use the ResourceManager and the ImageFromFile method. This loads a resource from the specified path as an image.
If the image at the specified path has already been loaded before, the ResourceManager will return the cached version.
Expand the CreateUI method with the following code:
private void CreateUI()
{
// ...
// Create a UIElement for our image.
var logoElement = SceneObject.Instantiate<UIElement>(_canvas);
logoElement.RectTransform.Size = new Point(300f, 300f);
logoElement.RectTransform.Alignment = Alignment.Center;
// Add an Image component for the image itself.
var logoImage = logoElement.AddComponent<Image>();
// Load our 'logo' image from 'Assets/libs/ui/'.
logoImage.Source = ResourceManager.ImageFromFile(UIElement.DataDirectory + "/cryengine_logo.png", true);
}The ResourceManager is part of the Resources namespace. To include this namespace in your code add the line using CryEngine.Resources; at the start of the Game.cs file.
After recompiling and running the game, it will show the following:
The final component to be added in this tutorial is a button that will quit the game when running the game. A Button is a UIElement which has a ButtonCtrl. The Button is responsible for handling the visual representation of the button, while the ButtonCtrl is responsible for handling input events, the state of the Button and the content of the button. The ButtonCtrl also contains several callbacks to handle input.
OnPressed - Called when the button is pressed down and let up again without losing focus.OnEnterMouse - Called when the mouse enters the rectangle area of the button.OnLeaveMouse - Called when the mouse leaves the rectangle area of the button.OnFocusEnter - Called when this button is focused, for example with the keyboard or a controller.OnFocusLost - Called when this button lost focus.These are normal C# events and can be hooked into as with any other type of event.
To instantiate a Button in our Canvas and assign a callback to the OnPressed event the following code needs to be added to the CreateUI method:
private void CreateUI()
{
// ...
// Create a quit button.
var quitButton = SceneObject.Instantiate<Button>(_canvas);
quitButton.RectTransform.Alignment = Alignment.Bottom;
quitButton.RectTransform.Padding = new Padding(0f, -160f);
quitButton.RectTransform.Size = new Point(300f, 30f);
quitButton.Ctrl.Text.Content = "Quit";
quitButton.Ctrl.Text.Height = 18;
quitButton.Ctrl.Text.DropsShadow = true;
quitButton.Ctrl.Text.Alignment = Alignment.Center;
// Assign a callback to respond to the quit button being pressed.
quitButton.Ctrl.OnPressed += OnQuitButtonPressed;
}Finally add the corresponding OnQuitButtonPressed method that will quit the game.
private void OnQuitButtonPressed()
{
Engine.Shutdown();
}Recompile and play the game. Now you'll see a Quit button that will exit the game upon being pressed.
using System;
using CryEngine.UI;
using CryEngine.UI.Components;
using CryEngine.Resources;
namespace CryEngine.Game
{
/// <summary>
/// Basic sample of running a Mono Application.
/// </summary>
public class Game : IDisposable
{
private static Game _instance;
private Canvas _canvas;
private Game()
{
// The server doesn't support rendering UI and receiving input, so initializing those system is not required.
if(Engine.IsDedicatedServer)
{
return;
}
CreateUI ();
Mouse.ShowCursor();
}
public static void Initialize()
{
if(_instance == null)
{
_instance = new Game();
}
}
public static void Shutdown()
{
_instance?.Dispose();
_instance = null;
}
private void CreateUI()
{
_canvas = SceneObject.Instantiate<Canvas>(null);
var text = _canvas.AddComponent<Text>();
text.Alignment = Alignment.Center;
text.Height = 24;
text.Content = "Basic UI Example";
text.Offset = new Point(0f, 120f);
// Create a UIElement for our image.
var logoElement = SceneObject.Instantiate<UIElement>(_canvas);
logoElement.RectTransform.Size = new Point(300f, 300f);
logoElement.RectTransform.Alignment = Alignment.Center;
// Add an Image component for the image itself.
var logoImage = logoElement.AddComponent<Image>();
// Load our 'logo' image from 'Assets/libs/ui/'.
logoImage.Source = ResourceManager.ImageFromFile(UIElement.DataDirectory + "/cryengine_logo.png", true);
// Create a quit button.
var quitButton = SceneObject.Instantiate<Button>(_canvas);
quitButton.RectTransform.Alignment = Alignment.Bottom;
quitButton.RectTransform.Padding = new Padding(0f, -160f);
quitButton.RectTransform.Size = new Point(300f, 30f);
quitButton.Ctrl.Text.Content = "Quit";
quitButton.Ctrl.Text.Height = 18;
quitButton.Ctrl.Text.DropsShadow = true;
quitButton.Ctrl.Text.Alignment = Alignment.Center;
// Assign a callback to respond to the quit button being pressed.
quitButton.Ctrl.OnPressed += OnQuitButtonPressed;
}
private void OnQuitButtonPressed()
{
Engine.Shutdown();
}
public void Dispose()
{
if(Engine.IsDedicatedServer)
{
return;
}
_canvas.Destroy();
}
}
}