Extended Setup Guide
Custom Initialization
This guide focuses on the content of the Prysm package and the process of setting it up in greater detail. If you prefer a simplified version, you can refer to the Quickstart Guide. The Quick Start guide will show you how to create a simple CohtmlView and provide you with an overview of the Library, the System, and View components in the following sections. We will also show you how to customize the behavior of the native Cohtml components to fit your project’s requirements. While all resources in your UI can be loaded out of the box, there are several ways to improve the performance or flexibility, which you can check out below:
- Check out the Library parameters and optionally how to override the settings you want.
- Check out the system settings and optionally override its settings.
- Decide how you want to spawn your UI and where will be placed - UI or in-world.
- Decide if you want your UI to reside inside a Unity UI, or to take a simpler component-based approach.
- Check out how to adjust the Input Handling according to your needs.
- Check out how to use various resource-handling mechanics:
- Consider checking out these features:
- Configure the UPM package before building your application.
Main package components
Library
The Library object has the following general purposes:
- Create an instance of the native Cohtml
- Instantiate the Renoir rendering module, and control it according to its needs.
- Manages created native Systems, creating and destroying them.
Override the Library Settings
You can configure some of the Library
parameters through the Library Configuration window. To override settings of the Library, you should use the static event LibraryParamsManager.OnCustomizeExtendedParams
event, which passes the object as a parameter, allowing you to modify before it the library is initialized. You can see the example below for reference.
LibraryParamsManager.OnCustomizeExtendedParams += libraryParams =>
{
// Customize the libraryParams object here and return it
return libraryParams;
};
You can check these major settings:
UseCSharpRenderingBackend
- Using Unity’s C# rendering API, instead of the native rendering library provided by Gameface. More information here.Default Style Font Family
- Sets the default font family that will be used by all Elements in the Views. The default font style is analogous to setting the CSS property “font-family” of all elements to the value of this field. More information here.EnableInternalAllocator
- The internal memory allocator efficiently reuses already allocated memory, which enhances performance at the cost of some memory overhead The internal memory allocator is enabled by default. By disabling the internal allocator Cohtml will free any unused memory to the client immediately, which will reduce the overall memory footprint.LoggingSeverity
- Configure the level of logging information level displayed by Cohtml.
The Library is instantiated upon the first launch of the Unity3D editor or player and will not be released until the application is closed. If you want to change the settings, you need to restart the application to apply them. To modify the default settings of the Library, you can do so either through the inspector or through a script.
Cohtml Plugin Manager
The CohtmlPluginManager
component is essential for integrating Prysm with Unity3D. It listens for important Unity3D method events, such as those related to initialization, updating each frame, and shutting down. This subscription allows it to manage the setup and cleanup of necessary resources and objects throughout the application’s life cycle. Specifically, it ensures that systems are properly initialized, updated every frame, and destroyed in the correct order when the application exits.
- The component is created when the application starts and is unique for its entire lifetime until it is stopped. If an additional object is created, it will be automatically deleted.
- The component’s object is marked to not be destroyed when switching scenes, so it is not recreated and its destruction should only occur when the application stops or editor closes. This ensures the correct destruction workflow for Cohtml native plugin objects.
CohtmlUISystem
and CohtmlView
, and centralizing it within a single manager. This manager will dictate the order in which all other objects are released.System
The CohtmlUISystem
component contains general contextual information shared between its created Views. The Prysm integration will ensure that when a CohtmlUISystem
component is needed, it will be created if one does not already exist. It has the following features:
CohtmlView
always requires aCohtmlUISystem
at the time of its creation. If you create such aCohtmlView
component and there is noCohtmlUISystem
in the scene, will create a defaultCohtmlUISystem
with defaultSystemSettings
.- When you have a created
CohtmlUISystem
with customCohtmlSystemSettings
and create aCohtmlView
without referencing it to theCohtmlUISystem
, it will reference it automatically. - When you have more than one
CohtmlUISystem
on the scene, it is your responsibility to reference each createdCohtmlView
to the specificCohtmlUISystem
; otherwise, you will encounter an error because automatic referencing cannot determine whichCohtmlUISystem
theCohtmlView
pertains to.
Override the CohtmlUISystem Settings
If you want to customize the spawned system behavior of your Views, you need to add the CohtmlUISystem
and CohtmlSystemSettings
components to a game object. This can also be achieved with a script by subscribing to the CohtmlUISystem.OnSystemCreate
callback. See the example below for reference.
CohtmlUISystem system = new GameObject("System with custom Settings").AddMissingComponent<CohtmlUISystem>();
system.OnSystemCreate += settings =>
{
// Change the settings object's properties here. For example change the Resource handler implementation
settings.ResourceHandler = new CustomResourceHandler();
// Finally, return the modified object.
return settings;
};
You can check these major settings:
ResourceHandler
- Defines how and from where to load asynchronous requests when needed by CohtmlView. For more info, you can check the Native API documentation.LocalizationManagerInstance
- Implementing localization into your UI, allowing you to dynamically translate the content of an HTML page. Any HTML element created with thedata-l10n-id
attribute will get its text content replaced by the value returned from this object’sTranslate
method.TextTransformationManager
- Support text transformations. The class is used when the CSStext-transform
property is used.
For more customization options, please refer to Custom Systems page.
These operations involve creating objects and adding components during runtime through the Unity3D Engine API, which is not the most optimal way of working. Therefore, the optimal option is to have it in the scene when launching the game, or you can use a Unity3D prefab object that contains everything necessary for the Cohtml System. For optimal performance, you can create a CohtmlUISystem
at the start of the application and mark it to persist through scene loads using the Object.DontDestroyOnLoad
method. This way, it won’t be destroyed when exiting a scene and won’t need to be reinitialized in the new scene. Each CohtmlView object that requires the system will automatically reference the persistent CohtmlUISystem
upon creation.
public GameObject persistentSystemPrefab;
...
GameObject persistentSystem = Object.Instantiate(persistentSystemPrefab);
Object.DontDestroyOnLoad(persistentSystem);
View
The View represents a UI page with its DOM, styles, and JavaScript context. The View has a different type based on where you render it, On Screen - as a HUD or in-world - in the 3D space in the scene. To create a new Cohtml HUD View, you need to add the component to any game object. Then you can configure each of its available properties visible in the inspector. This can also be done through scripting. Use this example as a reference.
CohtmlView cohtmlViewComponent = Camera.main.gameObject.AddComponent<CohtmlView>();
cohtmlViewComponent.Page = "coui://UIResources/[your-html-path]/[your-html-page].html";
In-world Cohtml Views require additional setup involving MeshRenderer
and MeshCollider
components. For this purpose, there is the CohtmlView.AddMissingWorldViewComponents
method, which you can call dynamically.
CohtmlView cohtmlViewComponent = new GameObject().AddComponent<CohtmlView>();
cohtmlViewComponent.AddMissingWorldViewComponents();
To modify the settings of a CohtmlView upon creation, you need to modify the ViewSettings through the CohtmlView.OnViewSettingsOverride
event. This method executes at the specified moment before a native Cohtml View is created. Currently, this can only be done through scripting. Please, refer to the following example.
cohtmlViewComponent.OnViewSettingsOverride += settings =>
{
settings.Listener = new CustomViewListener();
return settings;
};
You can check these major settings:
EnableComplexCSSSelectorsStyling
- Complex CSS selectors when doing style matching. By complex in this context, we mean any CSS selector that requires walking the DOM tree to match.Listener
- Allows to listen for various events in the View.InterceptResourceRequests
- Allows you to intercept resource requests for this view to restrict resource access of the view to only specified sets of URLs. To intercept requests, you need to override theListener.OnResourceRequestIntercepted
method.TextInputHandler
- Notifies of changes to HTML input elements. You can check more information here.