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.

Plugins für iOS

Godot bietet StoreKit, GameCenter, iCloud-Dienste und andere Plugins. Sie verwenden dasselbe Modell asynchroner Aufrufe, das weiter unten erläutert wird.

ARKit und Kamerazugriff werden auch als Plugins bereitgestellt.

Aktuelle Updates, Dokumentation und Quellcode finden Sie im Godot iOS plugins repository

Zugriff auf Plugin-Singletons

Um auf die Plugin-Funktionen zugreifen zu können, müssen Sie zunächst überprüfen, ob das Plugin exportiert wurde und verfügbar ist, indem Sie die Funktion Engine.has_singleton() aufrufen, die ein registriertes Singleton zurückgibt.

Hier ist ein Beispiel dafür, wie Sie dies in GDScript tun können:

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.")

Asynchrone Methoden

Wenn Sie eine asynchrone Operation anfordern, sieht die Methode folgendermaßen aus:

Error purchase(Variant params);

Der Parameter ist in der Regel ein Dictionary mit den für die Anfrage erforderlichen Informationen, und der Aufruf erfolgt in zwei Phasen. Zunächst gibt die Methode sofort einen Fehlerwert zurück. Ist der Fehlerwert nicht "OK", wird der Aufrufvorgang abgeschlossen, wobei der Fehler wahrscheinlich lokal verursacht wurde (keine Internetverbindung, API falsch konfiguriert usw.). Ist der Fehlerwert "OK", wird ein Antwort-Ereignis erzeugt und in die Warteschlange "ausstehende Ereignisse" aufgenommen. Beispiel:

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()

Denken Sie daran, dass die API, wenn ein Aufruf mit OK beantwortet wird, immer ein Ereignis über die Schnittstelle pending_event erzeugt, auch wenn es sich um einen Fehler, eine Zeitüberschreitung im Netzwerk usw. handelt. Sie sollten in der Lage sein, die Schnittstelle sicher zu blockieren und auf eine Antwort vom Server zu warten. Wenn eine der APIs sich nicht auf diese Weise verhält, sollte dies als Fehler behandelt werden.

Die Schnittstelle für ausstehende Ereignisse besteht aus zwei Methoden:

  • get_pending_event_count() gibt die Anzahl der ausstehenden Ereignisse in der Warteschlange zurück.

  • Variant pop_pending_event() entfernt das erste Ereignis aus der Warteschlange und gibt es zurück.

Store Kit

Implementiert in Godot iOS InAppStore plugin.

Die Store Kit-API ist über das Singleton InAppStore zugänglich. Es wird automatisch initialisiert.

Folgende Methoden sind unten verfügbar und dokumentiert:

   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

Kauft eine Produkt-ID über die Store Kit API. Sie müssen finish_transaction(product_id) aufrufen, sobald Sie eine erfolgreiche Antwort erhalten haben oder set_auto_finish_transaction(true) aufrufen, bevor Sie purchase() aufrufen. Diese beiden Methoden stellen sicher, dass die Transaktion abgeschlossen wird.

Parameter

Nimmt ein Dictionary als Parameter, mit einem Feld product_id: Einem String mit Ihrer Produkt-ID. Beispiel:

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

Antwortereignis

Das Antwortereignis ist ein Dictionary mit den folgenden Feldern:

bei Fehler:

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

bei Erfolg:

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

request_product_info

Fordert die Produktinfo aus einer Liste von Produkt-IDs an.

Parameter

Nimmt ein Dictionary als Parameter, mit einem einzelnen product_ids-Key, dem ein String-Array von Produkt-IDs zugewiesen wird. Beispiel:

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

Antwortereignis

Das Antwortereignis ist ein Dictionary mit den folgenden Feldern:

{
  "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

Stellt zuvor getätigte Käufe auf dem Konto des Benutzers wieder her. Dadurch werden Antwortereignisse für jede zuvor gekaufte Produkt-ID erstellt.

Antwortereignis

Bei den Antwortereignissen geht es um Dictionarys mit den folgenden Feldern:

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

set_auto_finish_transaction

Wenn diese Methode auf true gesetzt ist, wird der Kauf automatisch abgeschlossen, sobald er erfolgreich war. Rufen Sie diese Methode vor dem Aufruf von Purchase() auf.

Parameter

Nimmt einen booleschen Wert als Parameter an, der angibt, ob die Einkäufe automatisch abgeschlossen werden sollen. Beispiel:

in_app_store.set_auto_finish_transaction(true)

finish_transaction

Wenn Sie nicht wollen, dass Transaktionen automatisch abgeschlossen werden, rufen Sie diese Methode auf, nachdem Sie eine erfolgreiche Kaufantwort erhalten haben.

Parameter

Nimmt einen String product_id als Argument. Die Produkt_ID gibt an, für welches Produkt der Kauf abgeschlossen werden soll. Beispiel:

in_app_store.finish_transaction("my_product1")

Game Center

Implementiert in Godot iOS GameCenter Plugin.

Die Game Center-API ist über das GameCenter-Singleton verfügbar. Es hat die folgenden Methoden:

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()

und die Schnittstelle für anstehende Ereignisse:

int get_pending_event_count()
Variant pop_pending_event()

authenticate

Authentifiziert einen Benutzer im Game Center.

Antwortereignis

Das Antwortereignis ist ein Dictionary mit den folgenden Feldern:

bei Fehler:

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

bei Erfolg:

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

post_score

Veröffentlicht eine Punktzahl auf einer Game Center-Bestenliste.

Parameter

Nimmt ein Dictionary als Parameter mit zwei Feldern:

  • score eine Float-Zahl

  • category ein String mit dem Kategorienamen

Beispiel:

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

Antwortereignis

Das Antwortereignis ist ein Dictionary mit den folgenden Feldern:

bei Fehler:

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

bei Erfolg:

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

award_achievement

Ändert den Fortschritt eines Game Center-Achievements.

Parameter

Nimmt ein Dictionary als Parameter mit 3 Feldern:

  • name (String) den Namen des Achievements

  • progress (Float) der Achievements-Fortschritt von 0.0 bis 100.0 (übergeben an GKAchievement::percentComplete)

  • show_completion_banner (bool) ob Game Center ein Banner am oberen Rand des Bildschirms anzeigen soll

Beispiel:

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

Antwortereignis

Das Antwortereignis ist ein Dictionary mit den folgenden Feldern:

bei Fehler:

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

bei Erfolg:

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

reset_achievements

Löscht alle Game Center-Achievements. Die Funktion benötigt keine Parameter.

Antwortereignis

Das Antwortereignis ist ein Dictionary mit den folgenden Feldern:

bei Fehler:

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

bei Erfolg:

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

request_achievements

Fordert alle Game Center-Achievements an, bei denen der Spieler Fortschritte gemacht hat. Die Funktion benötigt keine Parameter.

Antwortereignis

Das Antwortereignis ist ein Dictionary mit den folgenden Feldern:

bei Fehler:

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

bei Erfolg:

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

request_achievement_descriptions

Fordert die Beschreibungen aller vorhandenen Game Center-Achievements unabhängig vom Fortschritt an. Die Funktion benötigt keine Parameter.

Antwortereignis

Das Antwortereignis ist ein Dictionary mit den folgenden Feldern:

bei Fehler:

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

bei Erfolg:

{
  "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

Zeigt das integrierte Game Center-Overlay mit Bestenlisten, Achievements und Herausforderungen an.

Parameter

Nimmt ein Dictionary als Parameter mit zwei Feldern:

  • view (String) (optional) der Name der zu präsentierenden Ansicht. Akzeptiert "default", "leaderboards", "achievements", oder "challenges". Standardmäßig wird "default" verwendet.

  • leaderboard_name (String) (optional) der Name des Leaderboards, das angezeigt werden soll. Wird nur verwendet, wenn "view" gleich "leaderboards" ist (oder "default" so konfiguriert ist, dass Leaderboards angezeigt werden). Wenn nicht angegeben, zeigt Game Center die Gesamtrangliste an.

Beispiele:

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

Antwortereignis

Das Antwortereignis ist ein Dictionary mit den folgenden Feldern:

beim Beenden:

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