# Game Manager

### Adding Custom UI References

{% hint style="info" %}
When you have created a new Player Item and want to display a custom UI interface, you can incorporate custom UI references into the Game Manager. This will allow you to access these UI references with ease.
{% endhint %}

1. In the **UHFPS Game Manager** component located in the **GAMEMANAGER** object, you'll come across a section called **Custom UI References**. To include a new UI reference, simply press the **Add** button.

<figure><img src="/files/Oze0I3ca7zcY7Vtq1OvB" alt=""><figcaption></figcaption></figure>

2. To utilize the UI references, assign a name that will be used to access the references. Once that's done, you can easily use the **GraphicReferences** field to obtain the UI references by their designated name.

Here is a code snippet to get the flashlight UI references:

```csharp
private void Awake()
{
    GameManager gameManager = GameManager.Instance;

    var behaviours = gameManager.GraphicReferences.Value["Flashlight"];
    CanvasGroup flashlightPanel = (CanvasGroup)behaviours[0];
    Image batteryIcon = (Image)behaviours[1];
    Image batteryFill = (Image)behaviours[2];
}
```

{% hint style="info" %}
As you may have noticed, to get the specified reference, you have to access it using an index number because the return value from **GraphicReferences** is an array.
{% endhint %}

### Adding Manager Modules

{% hint style="info" %}
Adding module managers can be advantageous if you have components that don't have variables, or if you prefer a clean view of the inspector, or even if you're looking for convenient access to a module.
{% endhint %}

<figure><img src="/files/VWXQgupa91tXuyDs0WHf" alt=""><figcaption></figcaption></figure>

1. To create a new manager module, your new script needs to inherit from the **ManagerModule** class.

```csharp
namespace UHFPS.Runtime
{
    public class TestModule : ManagerModule
    {
        public override void OnAwake()
        {
            
        }

        public override void OnStart()
        {
            
        }

        public override void OnUpdate()
        {
            
        }
    }
}
```

2. Write your code into the provided methods as you typically would. Keep in mind that the **ManagerModule** class is based on a **ScriptableObject**. This implies that you can't include variables with scene references.
3. Find the **Manager Modules** asset, which is located within the **UHFPS Game Manager** component.
4. Within the **Manager Modules** asset, click on the **Add Module** button and pick your newly created module. This action will generate a new **Module** asset and automatically integrate it into the Manager Modules.

<figure><img src="/files/i9S77fYZfNPCWGIf6BOI" alt=""><figcaption></figcaption></figure>

5. To retrieve a **Module** reference from the game manager, just use the <mark style="color:blue;">**Module\<T>**</mark> method from the **GameManager** component.

```csharp
private void Awake()
{
    TestModule testModule = GameManager.Module<TestModule>();
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.twgamesdev.com/uhfps/guides/game-manager.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
