Work in progress

The content of this page was not yet updated for Godot 4.2 and may be outdated. If you know how to improve this page or you can confirm that it's up to date, feel free to open a pull request.

Complementos para iOS

Godot proporciona StoreKit, GameCenter, servicios de iCloud y otros complementos. Utilizan el mismo modelo de llamadas asíncronas que se explica a continuación.

ARKit y el acceso a la cámara también se proporcionan como plugins.

Las últimas actualizaciones, documentación y código fuente se pueden encontrar en el Repositorio de complementos de iOS de Godot

Accediendo a un plugin singleton

Para acceder a la funcionalidad del plugin, primero debes verificar que el plugin esté exportado y disponible llamando a la función Engine.has_singleton(), que devuelve un singleton registrado.

Aquí hay un ejemplo de cómo hacer esto en GDScript:

var in_app_store
var game_center

func _ready():
    if Engine.has_singleton("InAppStore"):
        in_app_store = Engine.get_singleton("InAppStore")
    else:
        print("iOS IAP plugin is not available on this platform.")

    if Engine.has_singleton("GameCenter"):
        game_center = Engine.get_singleton("GameCenter")
    else:
        print("iOS Game Center plugin is not available on this platform.")

Métodos asíncronos

Cuando se solicita una operación asíncrona, el método se verá de la siguiente forma:

Error purchase(Variant params);

l parámetro será normalmente un Diccionario, con la información necesaria para realizar la petición, y la llamada tendrá dos fases. En primer lugar, el método devolverá inmediatamente un Error. Si el Error no es 'OK', se completará la operación de llamada, con un error probablemente causado localmente (no hay conexión a Internet, API mal configurada, etc). Si el valor del error es 'OK', se producirá un evento de respuesta y se añadirá a la cola de 'eventos pendientes'. Por ejemplo:

func on_purchase_pressed():
    var result = in_app_store.purchase({ "product_id": "my_product" })
    if result == OK:
        animation.play("busy") # show the "waiting for response" animation
    else:
        show_error()

# put this on a 1 second timer or something
func check_events():
    while in_app_store.get_pending_event_count() > 0:
        var event = in_app_store.pop_pending_event()
        if event.type == "purchase":
            if event.result == "ok":
                show_success(event.product_id)
            else:
                show_error()

Recuerda que cuando una llamada devuelve OK, la API siempre producirá un evento a través de la interfaz pending_event, incluso si es un error, o un timeout de red, etc. Con esto debería ser posible, por ejemplo, bloquear de forma segura la interfaz esperando una respuesta del servidor. Si alguna de las APIs no se comporta de esta manera debe ser tratada como un bug.

La interfaz de eventos pendientes consta de dos métodos:

  • get_pending_event_count() Retorna el numero de eventos pendientes en la cola.

  • Variant pop_pending_event() Saca el primer evento de la cola y lo retorna.

Kit de Tienda

core/list.h.

La API del Store Kit es accesible a través del singleton "InAppStore" (siempre estará disponible desde gdscript). Se inicializa automáticamente.

Los siguientes métodos están disponibles y documentados a continuación:

   Error purchase(Variant params)
   Error request_product_info(Variant params)
   Error restore_purchases()
   void set_auto_finish_transaction(bool enable)
   void finish_transaction(String product_id)

and the pending events interface:

::

   int get_pending_event_count()
   Variant pop_pending_event()

purchase

Compra un product ID a través de la API Store Kit. Se debe llamar a finish_transaction(product_id) una vez que se reciba una respuesta satisfactoria o llamar a set_auto_finish_transaction(true) antes de llamar a purchase(). Estos dos métodos garantizan que la transacción se complete.

Parámetros

Recibe un diccionario como parámetro, con un campo, product_id, un string con tu product ID. Ejemplo:

var result = in_app_store.purchase({ "product_id": "my_product" })

Evento de respuesta

El evento de respuesta será un diccionario con los siguientes campos:

En caso de error:

{
  "type": "purchase",
  "result": "error",
  "product_id": "the product ID requested",
}

En caso de éxito:

{
  "type": "purchase",
  "result": "ok",
  "product_id": "the product ID requested",
}

request_product_info

Solicita la información de producto en una lista de product IDs.

Parámetros

Recibe un diccionario como parámetro, con un campo product_ids, al cual se le asigna un string array de product IDs. Por ejemplo:

var result = in_app_store.request_product_info({ "product_ids": ["my_product1", "my_product2"] })

Evento de respuesta

El evento de respuesta será un diccionario con los siguientes campos:

{
  "type": "product_info",
  "result": "ok",
  "invalid_ids": [ list of requested IDs that were invalid ],
  "ids": [ list of IDs that were valid ],
  "titles": [ list of valid product titles (corresponds with list of valid IDs) ],
  "descriptions": [ list of valid product descriptions ],
  "prices": [ list of valid product prices ],
  "localized_prices": [ list of valid product localized prices ],
}

restore_purchases

Restaura las compras realizadas anteriormente en la cuenta del usuario. Esto creará eventos de respuesta para cada product ID comprado anteriormente.

Evento de respuesta

Los eventos de respuesta serán diccionarios con los siguientes campos:

{
  "type": "restore",
  "result": "ok",
  "product_id": "product ID of restored purchase",
}

set_auto_finish_transaction

Si se establece en true, una vez que la compra se realiza con éxito, la compra se finalizará automáticamente. Llama a este método antes de llamar a purchase().

Parámetros

Toma un booleano como parámetro que especifica si las compras deben finalizarse automáticamente. Por ejemplo:

in_app_store.set_auto_finish_transaction(true)

finish_transaction

Si no deseas que las transacciones se finalicen automáticamente, llama a este método después de recibir una respuesta de compra satisfactoria.

Parámetros

Toma una cadena llamada product_id como argumento. product_id especifica en qué producto finalizar la compra. Ejemplo:

in_app_store.finish_transaction("my_product1")

Centro de Juegos

scene/audio/audioplayer.cpp.

The Game Center API is available through the GameCenter singleton. It has the following methods:

Error authenticate()
bool is_authenticated()
Error post_score(Variant score)
Error award_achievement(Variant params)
void reset_achievements()
void request_achievements()
void request_achievement_descriptions()
Error show_game_center(Variant params)
Error request_identity_verification_signature()

y la interfaz de eventos pendientes:

int get_pending_event_count()
Variant pop_pending_event()

authenticate

Autentica a un usuario en Game Center.

Evento de respuesta

El evento de respuesta será un diccionario con los siguientes campos:

En caso de error:

{
  "type": "authentication",
  "result": "error",
  "error_code": the value from NSError::code,
  "error_description": the value from NSError::localizedDescription,
}

En caso de éxito:

{
  "type": "authentication",
  "result": "ok",
  "player_id": the value from GKLocalPlayer::playerID,
}

post_score

Publica una puntuación en una tabla de clasificación de Game Center.

Parámetros

Toma un diccionario como parámetro, con dos campos:

  • score un numero float

  • category un string con el nombre de categoría

Ejemplo:

var result = game_center.post_score({ "score": 100, "category": "my_leaderboard", })

Evento de respuesta

El evento de respuesta será un diccionario con los siguientes campos:

En caso de error:

{
  "type": "post_score",
  "result": "error",
  "error_code": the value from NSError::code,
  "error_description": the value from NSError::localizedDescription,
}

En caso de éxito:

{
  "type": "post_score",
  "result": "ok",
}

award_achievement

Modifica el progreso de un logro de Game Center.

Parámetros

Toma un diccionario como parámetro, con 3 campos:

  • name (string) el nombre del logro

  • progress (float) representa el progreso del logro, desde 0.0 hasta 100.0 (se pasa a GKAchievement::percentComplete)

  • show_completion_banner (bool) si Game Center debe mostrar un banner de logros en la parte superior de la pantalla

Ejemplo:

var result = award_achievement({ "name": "hard_mode_completed", "progress": 6.1 })

Evento de respuesta

El evento de respuesta será un diccionario con los siguientes campos:

En caso de error:

{
  "type": "award_achievement",
  "result": "error",
  "error_code": the error code taken from NSError::code,
}

En caso de éxito:

{
  "type": "award_achievement",
  "result": "ok",
}

reset_achievements

Borra todos los logros de Game Center. La función no toma parámetros.

Evento de respuesta

El evento de respuesta será un diccionario con los siguientes campos:

En caso de error:

{
  "type": "reset_achievements",
  "result": "error",
  "error_code": the value from NSError::code,
}

En caso de éxito:

{
  "type": "reset_achievements",
  "result": "ok",
}

request_achievements

Solicita todos los logros de Game Center en los que el jugador ha progresado. La función no toma parámetros.

Evento de respuesta

El evento de respuesta será un diccionario con los siguientes campos:

En caso de error:

{
  "type": "achievements",
  "result": "error",
  "error_code": the value from NSError::code,
}

En caso de éxito:

{
  "type": "achievements",
  "result": "ok",
  "names": [ list of the name of each achievement ],
  "progress": [ list of the progress made on each achievement ],
}

request_achievement_descriptions

Solicita las descripciones de todos los logros existentes en Centro de Juegos, independientemente de su progreso. La función no toma parámetros.

Evento de respuesta

El evento de respuesta será un diccionario con los siguientes campos:

En caso de error:

{
  "type": "achievement_descriptions",
  "result": "error",
  "error_code": the value from NSError::code,
}

En caso de éxito:

{
  "type": "achievement_descriptions",
  "result": "ok",
  "names": [ list of the name of each achievement ],
  "titles": [ list of the title of each achievement ],
  "unachieved_descriptions": [ list of the description of each achievement when it is unachieved ],
  "achieved_descriptions": [ list of the description of each achievement when it is achieved ],
  "maximum_points": [ list of the points earned by completing each achievement ],
  "hidden": [ list of booleans indicating whether each achievement is initially visible ],
  "replayable": [ list of booleans indicating whether each achievement can be earned more than once ],
}

show_game_center

Muestra la superposición incorporada de Centro de Juegos que muestra las tablas de clasificación, los logros y los desafíos.

Parámetros

Toma un diccionario como parámetro, con dos campos:

  • view (cadena) (opcional) el nombre de la vista que se va a mostrar. Acepta "default" (predeterminado), "leaderboards" (tablas de clasificación), "achievements" (logros) o "challenges" (desafíos). Por defecto, se establece en "default" (predeterminado).

  • leaderboard_name (cadena) (opcional) el nombre de la tabla de clasificación que se mostrará. Solo se utiliza cuando "view" es "leaderboards" (o cuando "default" está configurado para mostrar tablas de clasificación). Si no se especifica, Centro de Juegos mostrará la tabla de clasificación agregada.

Ejemplos:

var result = show_game_center({ "view": "leaderboards", "leaderboard_name": "best_time_leaderboard" })
var result = show_game_center({ "view": "achievements" })

Evento de respuesta

El evento de respuesta será un diccionario con los siguientes campos:

Al cerrar:

{
  "type": "show_game_center",
  "result": "ok",
}