> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Guía de inicio rápido de CloudScript de PlayFab con Azure Functions

> Escriba CloudScript de PlayFab con Azure Functions en C# usando Visual Studio Code y Unity, y luego vincule las funciones a reglas, tareas programadas o llamadas de cliente.

# Inicio rápido: Escritura de un CloudScript de PlayFab con Azure Functions

En este inicio rápido, escribirá un CloudScript con Azure Functions usando Visual Studio Code, C# de Azure Functions y C# de Unity. Después de terminar esta guía, podrá vincular su nuevo CloudScript a reglas o tareas programadas, o incluso llamarlo desde el código de su cliente.

## Requisitos previos

Hay un par de pasos necesarios para empezar a trabajar con CloudScript de PlayFab en C#.

* Visite el artículo de Visual Studio Code [Inicio rápido: Creación de un proyecto de Azure Functions con Visual Studio Code](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-csharp?pivots=programming-language-csharp) y vuelva aquí cuando esté todo configurado. Los siguientes requisitos previos se tratan en esa guía de inicio rápido:
  * Una [cuenta de Azure](https://azure.microsoft.com/free). Registrarse para obtener una cuenta de Azure es gratuito
  * Una [suscripción de Azure](https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/create-subscription)
  * Un recurso de aplicación de Functions configurado en Azure Portal
    * Para minimizar la latencia de su CloudScript con Azure Functions, colóquelo en las regiones de Azure *US-West*, *US-West 2* o *US-West 3*.
    * **Nota de seguridad:** Desde una perspectiva de seguridad, debe asegurarse de usar un secreto de función determinado solo con PlayFab y no usarlo para llamar a la misma función desde ninguna otra fuente.
    * **Nota de seguridad:** Para las funciones en cola, debe configurar una cuenta de almacenamiento distinta para las colas usadas por el desencadenador de cola.
* Una cuenta de [PlayFab](https://developer.playfab.com/).

<Note>
  Las funciones de Azure de PlayFab pueden usar el entorno de ejecución de Azure Functions V2 o posterior, y .NET Core 2 o posterior. Le recomendamos usar la versión más reciente (actualmente Azure Functions V4 y .NET 6).
</Note>

## Crear una función de Azure

1. Cree una función de ejemplo básica "HelloWorld". Puede ver cómo hacerlo siguiendo la guía [Creación de la primera función con Visual Studio Code](https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-vs-code). Para ver un ejemplo de código que usa variables de PlayFab, consulte la sección [Contexto de funciones de PlayFab, variables y uso de los SDK de servidor](#playfabfunctioncontext).

<Info>
  La guía "Creación de la primera función con Visual Studio Code" le indica que establezca el nivel de autorización de su función de Azure en `Anonymous`. Esto se hace para simplificar las pruebas. En un entorno de producción, en la mayoría de los casos, no debería usar la autorización Anonymous, ya que permite que cualquiera llame al punto de conexión de su función. Para proteger correctamente su función en el entorno de PlayFab, le recomendamos usar la autorización de nivel `Function`.
</Info>

2. Después de crear e implementar su función, vaya a **Automation** > **Cloud Script** y seleccione el botón **Register Function** en la esquina superior derecha de la página.

   <img src="https://mintcdn.com/microsoft-4404708b/dqv53299jA1M-fNi/images/playfab/live-service-management/service-gateway/automation/cloudscript-af/register_cs_function.png?fit=max&auto=format&n=dqv53299jA1M-fNi&q=85&s=4bfc5e2c33a1ad384fa01a0698d4cd5d" alt="Registrar función de CloudScript" width="542" height="549" data-path="images/playfab/live-service-management/service-gateway/automation/cloudscript-af/register_cs_function.png" />

3. En **Name**, escriba un nombre descriptivo para su función. En **Function URL**, escriba la dirección URL del desencadenador HTTP de la función. La dirección URL se puede encontrar en el menú contextual del recurso de función de Azure, como se muestra en la sección "Ejecución de la función en Azure" de [Inicio rápido: Creación de una función en Azure con Visual Studio Code](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-csharp?pivots=programming-language-csharp#run-the-function-in-azure). Si su función de Azure usa autorización de nivel `Function`, la dirección URL contiene la clave de autorización.

Para obtener más información sobre la implementación de funciones de Azure, consulte [Implementación de Azure Functions con Visual Studio Code](https://learn.microsoft.com/azure/azure-functions/functions-develop-vs-code).

## Uso y llamada de CloudScript con Azure Functions desde su título de PlayFab

El código de ejemplo de esta guía está escrito en C# de Unity y código C# de funciones de Azure.

Ahora que su función está registrada, puede llamarla usando las API de PlayFab.

### Llamar a su función mediante solicitudes HTTP desde Visual Studio Code

Con la [extensión REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client), puede invocar la función desde Visual Studio.

```http theme={null}
@titleId =  ????? # Enter your title ID here
@baseUrl = https://{{titleId}}.playfabapi.com

###
# @name LoginWithCustomID
POST {{baseUrl}}/Client/LoginWithCustomID
Accept-Encoding: gzip
Content-Type: application/json

{
  "CustomId": "demo",
  "CreateAccount": true,
  "TitleId": "{{titleId}}"
}

@entityToken = {{LoginWithCustomID.response.body.$.data.EntityToken.EntityToken}}
@entity = {{LoginWithCustomID.response.body.$.data.EntityToken.Entity}}

###
# @name ExecuteFunction
POST {{baseUrl}}/CloudScript/ExecuteFunction
Accept-Encoding: gzip
Content-Type: application/json
X-EntityToken: {{entityToken}}

{
  "FunctionName": "HelloWorld"
}

###
# @name GetObjects
POST {{baseUrl}}/Object/GetObjects
Accept-Encoding: gzip
Content-Type: application/json
X-EntityToken: {{entityToken}}

{
  "Entity": {{entity}},
  "Objects": ["obj1"]
}

```

Después de pegar este código en un archivo de Visual Studio Code con la extensión .http, debería poder seleccionar *Send request* bajo la función *LoginWithCustomID* para obtener el token de entidad de un jugador y, a continuación, bajo *LoginWithCustomID* para invocar su función. Invocar *GetObjects* debería mostrar el objeto que su función de Azure adjuntó al jugador.

### Llamar a su función desde Unity

Puede usar este código en Unity para invocar su función.

```c# theme={null}
//This snippet assumes that your game client is already logged into PlayFab.

using PlayFab;
using PlayFab.CloudScriptModels;

private void CallCSharpExecuteFunction()
{
    PlayFabCloudScriptAPI.ExecuteFunction(new ExecuteFunctionRequest()
    {
        Entity = new PlayFab.CloudScriptModels.EntityKey()
        {
            Id = PlayFabSettings.staticPlayer.EntityId, //Get this from when you logged in,
            Type = PlayFabSettings.staticPlayer.EntityType, //Get this from when you logged in
        },
        FunctionName = "HelloWorld", //This should be the name of your Azure Function that you created.
        FunctionParameter = new Dictionary<string, object>() { { "inputValue", "Test" } }, //This is the data that you would want to pass into your function.
        GeneratePlayStreamEvent = false //Set this to true if you would like this call to show up in PlayStream
    }, (ExecuteFunctionResult result) =>
    {
        if (result.FunctionResultTooLarge ?? false)
        {
            Debug.Log("This can happen if you exceed the limit that can be returned from an Azure Function, See PlayFab Limits Page for details.");
            return;
        }
        Debug.Log($"The {result.FunctionName} function took {result.ExecutionTimeMilliseconds} to complete");
        Debug.Log($"Result: {result.FunctionResult.ToString()}");
    }, (PlayFabError error) =>
    {
        Debug.Log($"Opps Something went wrong: {error.GenerateErrorReport()}");
    });
}

```

### Contexto de CloudScript de PlayFab, variables y SDK de servidor <a name="playfabfunctioncontext" />

Una ventaja de usar CloudScript con Azure Functions es que el contexto del evento de PlayStream y del perfil del jugador se pasa automáticamente a la función de Azure. Al invocar el CloudScript, recibirá el contexto según el escenario de invocación de la función. Por ejemplo, el contexto varía en función de si se desencadena mediante una acción de PlayStream o se llama directamente desde el cliente. Esto incluye información como el perfil de entidad en cuyo nombre se invocó el CloudScript y, potencialmente, los eventos de PlayStream usados para invocar el CloudScript.

1. Deberá instalar el SDK de PlayFab mediante el administrador de paquetes. Para ello, abra el terminal o la consola CMD en Visual Studio Code y escriba: `dotnet add package PlayFabAllSDK`
2. Debe incluir el archivo [CS2AFHelperClasses.cs](https://github.com/PlayFab/PlayFab-Samples/blob/master/Samples/CSharp/AzureFunctions/CS2AFHelperClasses.cs), que contiene la implementación de `PlayFab.Samples`
3. La ejecución de un script puede producirse a través de varios métodos (API, tareas programadas, eventos de PlayStream, entrada y salida de segmentos). El contexto de la ejecución es importante para implementar su CloudScript. Consulte el [tutorial Uso de los modelos de contexto de CloudScript](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/CloudScript-af-context) para obtener detalles sobre cómo usar el contexto del script.

Puede usar el ejemplo HelloWorld como su primera función de Azure. Invoca una API de entidad y devuelve un saludo al jugador autenticado. Las API de servidor clásicas se pueden invocar de forma similar; sin embargo, sería necesario especificar la clave secreta del título para realizar la llamada. La clave secreta se puede almacenar en la [configuración de la aplicación](https://learn.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal#settings) y recuperarse con el método `Environment.GetEnvironmentVariable()`.

```c# theme={null}
using PlayFab;
using PlayFab.Samples;
using PlayFab.DataModels;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace PlayFabCS2AFSample.HelloWorld
{
    public static class HelloWorld
    {
        [FunctionName("HelloWorld")]
        public static async Task<dynamic> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            FunctionExecutionContext<dynamic> context = JsonConvert.DeserializeObject<FunctionExecutionContext<dynamic>>(await req.ReadAsStringAsync());

            dynamic args = context.FunctionArgument;

            var message = $"Hello {context.CallerEntityProfile.Lineage.MasterPlayerAccountId}!";
            log.LogInformation(message);

            dynamic inputValue = null;
            if (args != null && args["inputValue"] != null)
            {
                inputValue = args["inputValue"];
            }

            log.LogDebug($"HelloWorld: {new { input = inputValue} }");

            // The profile of the entity specified in the 'ExecuteEntityCloudScript' request.
            // Defaults to the authenticated entity in the X-EntityToken header.
            var entityProfile = context.CallerEntityProfile;

            var api = new PlayFabDataInstanceAPI(
                new PlayFabApiSettings
                {
                    TitleId = context.TitleAuthenticationContext.Id
                },
                new PlayFabAuthenticationContext
                {
                    EntityToken = context.TitleAuthenticationContext.EntityToken
                }
            );

            var apiResult = await api.SetObjectsAsync(
                new SetObjectsRequest
                {
                    Entity = new EntityKey
                    {
                        Id = entityProfile.Entity.Id,
                        Type = entityProfile.Entity.Type
                    },
                    Objects = new List<SetObject> {
                    new SetObject
                    {
                        ObjectName =  "obj1",
                        DataObject = new
                        {
                            foo = "some server computed value",
                            prop1 = "bar"
                        }
                    }
                }
                });

            return new { messageValue = message };
        }
    }
}
```

En el ejemplo, el `CurrentPlayerId` del autor de la llamada está disponible tal como ocurre en nuestra implementación tradicional de CloudScript. Los parámetros que pasa en el campo `FunctionParameters` están disponibles en *args*. Pero, a diferencia del ejemplo Hello World de la guía [Creación de la primera función con Visual Studio Code](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-csharp), los parámetros se pasan en el cuerpo POST en lugar de en la cadena de consulta.

Para llamar a la función de Azure HelloWorld desde un SDK de PlayFab, use `ExecuteFunction`.

## Funciones de Azure en reglas de automatización

También se puede llamar a las funciones de Azure mediante la creación de reglas y tareas programadas. Esto funciona de la misma manera que nuestro CloudScript estándar. Para crear una regla o una tarea programada, vaya a **Automation** > **Rules** o **Automation** > **Scheduled Tasks**.

* Seleccione **New Rule**
* Escriba un nombre para la regla
* Seleccione el tipo de evento que desencadena esta regla
* Agregue una acción
* En la lista desplegable de acciones, seleccione **Execute Azure Function**

En la lista desplegable hay disponible una lista de las funciones de Azure que ha registrado.

<img src="https://mintcdn.com/microsoft-4404708b/dqv53299jA1M-fNi/images/playfab/live-service-management/service-gateway/automation/cloudscript-af/azure_function_rules.png?fit=max&auto=format&n=dqv53299jA1M-fNi&q=85&s=f48a4376587a492bd3dcbf1efa86c666" alt="Configurar regla para funciones de Azure" width="800" height="966" data-path="images/playfab/live-service-management/service-gateway/automation/cloudscript-af/azure_function_rules.png" />

## Depuración de su función de Azure

Con las funciones de Azure, ahora tiene la opción de depurar su CloudScript localmente o en Azure Portal. Para obtener más información sobre la depuración en el portal, consulte [Depuración de CloudScript con Azure Functions en Azure Portal](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/debugging-with-CloudScript-AF-Azure). Para aprender a configurar la depuración local, consulte [Depuración local de CloudScript con Azure Functions](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/local-debugging-for-cloudscript-using-azure-functions).

## Límites de ejecución

Las llamadas de CloudScript a Azure Functions tienen límites de tiempo de espera. Si su webhook tarda demasiado en ejecutarse, la solicitud agota el tiempo de espera en PlayFab. Asegúrese de que su código pueda ejecutarse lo suficientemente rápido como para mantenerse por debajo de los límites de tiempo de espera.

| Origen           | Tipo de acción | Límite (segundos) |
| ---------------- | -------------- | ----------------: |
| API de PlayFab   | Solicitud HTTP |                10 |
| PlayStream V2    | Solicitud HTTP |                10 |
| Tarea programada | Solicitud HTTP |               4.5 |
| PlayStream V1    | Solicitud HTTP |                 1 |
| Función en cola  | Carga de cola  |                 1 |


## Related topics

- [CloudScript de PlayFab con Azure Functions](/es/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/index.md)
- [Inicio rápido de CloudScript](/es/services/playfab/live-service-management/service-gateway/automation/cloudscript/quickstart.md)
- [Depuración local de CloudScript con Azure Functions](/es/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/local-debugging-for-cloudscript-using-azure-functions.md)
- [Modelos de contexto de CloudScript de PlayFab con Azure Functions](/es/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/CloudScript-af-context.md)
- [Depuración de CloudScript con Azure Functions en Azure Portal](/es/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/debugging-with-CloudScript-AF-Azure.md)
