# Edit Code

Now that you are able to successfully stream the 3D model into Unity, it's time to make some custom adjustments.

Each asset will be instantiated with a script named `CustomBehaviour.cs` attached. You can edit this script to create any behavior you would like while referencing additional data streamed from the cloud.

## Code Example

From the project's packages folder, open the `/co.echo3d.unity/Runtime/CustomBehaviour.cs` script:

{% code title="CustomBehaviour.cs" %}

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CustomBehaviour : MonoBehaviour
{
    [HideInInspector]
    public Entry entry;

    /// <summary>
    /// EXAMPLE BEHAVIOUR
    /// Queries the database and names the object based on the result.
    /// </summary>

    // Use this for initialization
    void Start()
    {
        // Add RemoteTransformations script to object and set its entry
        this.gameObject.AddComponent<RemoteTransformations>().entry = entry;

        // ADD YOUR CODE HERE //
        // Qurey additional data to get the name
        string value = "";
        if (entry.getAdditionalData() != null && 
            entry.getAdditionalData().TryGetValue("name", out value))
        {
            // Set name
            this.gameObject.name = value;
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
}
```

{% endcode %}

{% hint style="info" %}
&#x20;Note that this is an regular Unity MonoBehaviour with additions to the Start() function.
{% endhint %}

Lines 18-19 attaches a `RemoteTransformations` component to the game object and sets its content entry. This component is in charge of enabling [real-time updates and animations](/unity/using-the-sdk.md#real-time-updates-and-animations).

```csharp
// Add RemoteTransformations script to object and set its entry
this.gameObject.AddComponent<RemoteTransformations>().entry = entry;
```

You can add any custom code after line 21. An example follows.

## Querying Metadata

Lines 22-28 are an example that queries the entry's metadata for a key called `name`, and if such key exists, set the game object's name to the corresponding value:

```csharp
string value = "";
if (entry.getAdditionalData() != null && 
    entry.getAdditionalData().TryGetValue("name", out value))
{
    // Set name
    this.gameObject.name = value;
}
```

Without the `name` key being set, the default game object's name is the asset filename.

![](/files/-M4HYHjE5Fq3wX77HsHp)

Use the console to [set a metadata](/web-console/manage-pages/data-page/how-to-add-data.md#1-adding-a-data-entry-1) entry with the following data:

| key  | value         |
| ---- | ------------- |
| name | empire\_state |

{% hint style="info" %}
Built-in keywords will be suggested through a drop-down list but you can [add](/web-console/manage-pages/data-page/how-to-add-data.md#1-adding-a-data-entry) **any key** and **any value** by typing it in the text input field.
{% endhint %}

Run Unity again and notice that the game object name automatically changes.

![](/files/-M4HXzJCLUahi5pb2VON)

**Great work!** 🎉

## Posting Metadata

You can add metadata to the cloud or update existing metadata stored remotely by calling the `UpdateEntryData` function located in the `echo3D.cs` script. This function implements the [Post Metadata to an Entry](/api/data.md#post-metadata-to-an-entry) API query.

In order to call this function from any other script you can use the Echo3DService instance to call`UpdateEntryData` function with this single line of code:

```csharp
Echo3DService.instance.UpdateEntryData("<ENTRY_ID>", "<DATA>", "<VALUE>");
```

Where `<ENTRY_ID>` is the a specific entry ID you are trying to post metadata too, `<DATA>` is the data key (e.g. `scale`), and `<VALUE>` is the data value (e.g. `2`).

## Subscribing for Metadata Changes

Add the following code to your `Start` function to register an action that will be executed when metadata is received from the cloud.

```csharp
// Define data action
WClient.On(WClient.EventType.DATA_POST_ENTRY.ToString(), (string message) => {
    
    // Parse data
    string[] messageArray = message.Split('|');
    string dataKey = messageArray[2];
    string dataValue = messageArray[3];
    
    // Add you code here
    // myFunction(dataKey, dataValue);
    
});
```


---

# 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.echo3d.com/unity/edit-code.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.
