Bloga Dön

Yeni Godot Asset Store, Backend Eklentileri İçin Versiyonlama ve Güncelleme Cehennemini Nasıl Çözüyor?

Yayınlanma tarihi 27 Mayıs 2026
Yeni Godot Asset Store, Backend Eklentileri İçin Versiyonlama ve Güncelleme Cehennemini Nasıl Çözüyor?

Özet olarak

Yeni Godot Asset Store, eklenti geliştiricilerinin karşılaştığı versiyonlama ve güncelleme uyumluluğu sorunlarını yerleşik çoklu sürüm desteği ve hedef motor eşleme özellikleri ile çözüme kavuşturuyor. Gelişmiş yayıncı analitiği, hata telemetrisi ve zorunlu yapılandırılmış değişiklik günlükleri sayesinde, canlıdaki backend entegrasyonlarının kararlılığı önemli ölçüde artırılıyor. Ayrıca, backend gizli anahtarlarının istemci tarafında açığa çıkmasını önlemek için sunucu yetkili güvenlik önlemlerinin ve otomatik GitHub Actions yayın hatlarının önemi vurgulanıyor.

Godot 4'te Backend SDK Entegrasyonunun Çilesi

Her Godot geliştiricisi, küçük bir oyun motoru güncellemesinin ardından konsolu açıp kırmızı stack trace yığınlarıyla karşılaşmanın dehşetini çok iyi bilir. Envanter kodunuzun tek bir satırını bile değiştirmemişsinizdir, ancak çekirdek bir HTTP sınıfının versiyonlar arasındaki davranış değişikliği nedeniyle tüm multiplayer veritabanı bağlantınız çökmüştür. Eski Godot Asset Library içinde bir backend eklentisi (plugin) barındırmak, geliştiriciler için tam bir kabustu. Kullanıcılarınızı yalnızca belirli bir motor sürümünde çalışan devasa, tek parça bir zip dosyasına mahkum etmek ya da her küçük Godot sürümü için beş farklı asset sayfası yönetmek arasında seçim yapmak zorundaydınız.

Eklentiniz hassas oyun sunucusu iletişimini, oyuncu kimlik doğrulamayı (authentication) veya gerçek zamanlı durum senkronizasyonunu (real-time state syncing) yönetiyorsa riskler daha da büyür. Hatalı bir SDK güncellemesi, oyuncu profillerini sessizce bozabilir veya daha kötüsü, export edilmiş oyun istemcilerinde geliştirici API anahtarlarını (API keys) açığa çıkarabilir. Açık kaynaklı oyun motorlarında backend anahtarlarını korumak da malum olduğu üzere oldukça zordur.

Eğer eklentiniz geliştiricileri backend gizli anahtarlarını (secrets) autoload singleton'ları içine hardcode etmeye zorluyorsa, oyunculara bu anahtarları ele geçirmeleri için adeta açık bir davetiye sunuyorsunuz demektir. Bu teorik bir tehdit değildir. The Star Citizen Data Breach Explained Architecting Game Backends To Survive Compromises analizimizde detaylandırdığımız gibi, küçük bir mimari gözden kaçırmanın nasıl felaket boyutunda veri sızıntılarına yol açtığını gördük.

Godot 4.7 sürümüne geçişle birlikte, bu kaotik ortam büyük bir dönüşüm geçiriyor. Yeni Godot Asset Store'un lansmanı, eklenti geliştiricileri için bu versiyonlama, güvenlik ve dağıtım sorunlarını çözmek üzere özel olarak tasarlanmış bir altyapı sunuyor. Gelin bu mağazanın getirdiği teknik değişikliklere ve kurşungeçirmez backend entegrasyonları oluşturmak için bunlardan nasıl yararlanabileceğinize birlikte bakalım.

Godot Asset Store'da Neler Yeni: Teknik Bir Derin Bakış

Eski Godot Asset Library yıllarca işini gördü, ancak çekirdek mimarisi temelde basit ve düz bir katalogdan ibaretti. Sürüm geçmişi, hedef uyumluluğu veya yayıncı telemetrisi gibi yerleşik kavramlar olmaksızın, bir Git depo (repository) dalından tek bir zip arşivi çekiyordu. Yeni godot asset store ise birleşik hesap sistemi, kararlı yayın kanalları (release channels) ve ayrıntılı yayıncı araçları üzerine kurulmuş modern ve güçlü bir pazaryeridir.

Çoklu Versiyon Desteği ve Hedef Motor Eşleme

Yeni godot asset store sayesinde yayıncılar artık tek bir 'en son' (latest) arşivle sınırlı değil. Artık her biri belirli motor sürümlerine bağlı olan, tek bir eklentinin birden fazla aktif versiyonunu yükleyebilir ve yönetebilirsiniz. Bir geliştirici Godot 4.7 içinden mağazaya göz attığında, istemci, kendi küçük motor sürümü için derlenmiş olan tam build'i otomatik olarak filtreler ve çeker. Bu, betiklerinizin (scripts) içinde karmaşık çalışma zamanı (runtime) uyumluluk kontrolleri yazma ihtiyacını ortadan kaldırır.

Ayrı sürüm yollarında (release tracks) en son özellikleri (Godot 4.7 için v2.0.0) piyasaya sürerken, aynı anda kararlı, LTS uyumlu bir eklenti versiyonunu (örneğin Godot 4.2 için v1.4.0) koruyabilirsiniz. Bu sayede, otomatik bir araç güncellemesinin ardından geliştiricinin canlıdaki (production) oyun netcode'unun derleme hatasıyla (compile-crash) çökmemesi garanti altına alınır.

Gelişmiş Yayıncı Analitiği ve Hata Telemetrisi

Backend eklenti geliştiricileri için, entegrasyonunuzun sahada nasıl performans gösterdiğini görebilmek son derece kritiktir. Yeni yayıncı paneli (dashboard); haftalık indirmeler, aktif kurulum tabanları ve versiyon dağılımı hakkında detaylı analitikler sunuyor. En önemlisi, geliştiricilerin hataları doğrudan belirli eklenti versiyonlarının altında bildirmesine olanak tanıyan entegre bir kullanıcı incelemesi ve derecelendirme sistemi içeriyor.

Bu telemetri, yeni yayınlanan bir mikro güncellemenin kullanıcı tabanınız genelinde network timeout'lara veya veritabanı hatalarına neden olup olmadığını anında tespit edebileceğiniz anlamına gelir. Böylece, hatalar canlı ortam (production) hatalarına dönüşmeden önce hızlıca yamalar (patch) yayınlayabilirsiniz. Panelin görsel arayüzü, yayıncıları manuel olarak sorgulama yapmaya gerek kalmadan bilgilendirerek anında geri bildirim sağlar.

Özel Değişiklik Günlükleri (Changelogs) ve Asset Versiyon Karşılaştırma (Diffing)

Canlıdaki (production) bir backend bağımlılığını (dependency) güncellemek her zaman risklidir. Yeni mağaza, yüklenen her versiyon için yapılandırılmış changelog'ları zorunlu kılarak bu riski azaltıyor. Gelen güncellemenin indirilmesini onaylamadan önce geliştiriciler, detaylı diff'leri ve güncelleme günlüklerini doğrudan editörün içinden görebilirler.

Bu şeffaflık, eklenti yayıncılarını katı bir Semantic Versioning (SemVer) yaklaşımı benimsemeye ve her bozucu API değişikliğini (breaking API change) belgelemeye zorlar. Artık bir yama güncellemesinin (patch update) asenkron matchmaking döngülerinizi bozup bozmayacağını veya yerel kullanıcı önbelleklerini (caches) silip silmeyeceğini tahmin etmek zorunda kalmayacaksınız.

Pratik İnceleme: 'Bozucu Motor API'si' Kabusunu Çözmek

Yerleşik versiyonlamanın neden bu kadar önemli olduğunu anlamak için yaygın bir soruna bakalım: HTTP ağ (network) iletişimini yönetmek. Erken Godot 4.x sürümlerinde, asenkron HTTP istekleri çok fazla boilerplate kod gerektiriyordu ve küçük motor güncellemeleri sık sık iş parçacığı (thread) yönetimini veya yanıt kodu (response code) ayrıştırmasını değiştiriyordu. Geliştiriciler, backend iletişimlerinin ana oyun iş parçacığını (main game thread) dondurmadığından emin olmak için özel wrapper sınıfı yazmak zorundaydı.

Aşağıda, tam uyumluluk kontrolleriyle güvenli backend iletişimini yöneten, güçlü ve sözdizimsel olarak doğru bir GDScript sınıfı yer almaktadır. Modern bir backend eklentisinin, ana oyun motoru iş parçacığını dondurmadan asenkron API çağrılarını, token tabanlı kimlik doğrulamayı (authentication) ve bağlantı zaman aşımlarını (connection timeouts) nasıl yönettiğini göstermektedir.

# res://addons/my_backend_plugin/backend_client.gd
@tool
extends Node

# Signal definitions for asynchronous state tracking
signal request_completed(response_code: int, response_data: Dictionary)
signal connection_failed(error_message: String)

const DEFAULT_TIMEOUT = 10.0

@export var api_url: String = "https://api.example.com/v1"
@export_placeholder("Enter your client public token") var client_token: String = ""

# Internal node references
var _http_client: HTTPRequest

func _ready() -> void:
    # Initialize the HTTPRequest node dynamically
    _http_client = HTTPRequest.new()
    add_child(_http_client)
    _http_client.request_completed.connect(_on_request_completed)
    
    # Configure limits safely for high-throughput mobile and desktop networking
    _http_client.max_redirects = 3
    _http_client.timeout = DEFAULT_TIMEOUT

## Sends an authenticated, asynchronous POST request to the backend database server
func send_backend_request(endpoint: String, payload: Dictionary) -> Error:
    if client_token.is_empty():
        connection_failed.emit("Initialization failed: Client API token is missing.")
        return ERR_UNCONFIGURED

    var url = api_url + endpoint
    var json_query = JSON.stringify(payload)
    
    # Standard security headers for backend API communication
    var headers = [
        "Content-Type: application/json",
        "Authorization: Bearer " + client_token,
        "X-Engine-Client: Godot " + str(Engine.get_version_info().major) + "." + str(Engine.get_version_info().minor)
    ]
    
    # Execute the non-blocking network request
    var err = _http_client.request(url, headers, HTTPClient.METHOD_POST, json_query)
    if err != OK:
        connection_failed.emit("Failed to initialize HTTP request. Error code: " + str(err))
    return err

# Callback handler for the HTTPRequest signal
func _on_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
    if result != HTTPRequest.RESULT_SUCCESS:
        connection_failed.emit("Network failure. Internal HTTPRequest result code: " + str(result))
        return

    var body_string = body.get_string_from_utf8()
    var parser = JSON.new()
    var parse_err = parser.parse(body_string)
    
    if parse_err != OK:
        connection_failed.emit("JSON parsing error on line " + str(parser.get_error_line()) + ": " + parser.get_error_message())
        return
        
    var response_dict = parser.data as Dictionary
    
    if response_code >= 200 and response_code < 300:
        request_completed.emit(response_code, response_dict)
    else:
        var err_msg = response_dict.get("error", "Unknown server-side error.")
        connection_failed.emit("Server returned error status " + str(response_code) + ": " + err_msg)

Bu betiğin (script) teknik detaylarını inceleyelim. Betiğin en üstünde @tool ifadesini nasıl kullandığımıza dikkat edin. Bu, eklentinin oyun daha başlamadan önce Godot editörü içinde doğrulama mantığını (validation logic) çalıştırabilmesini sağlar. Geliştiricinin istemci token'ının (client token) mevcut olduğunu doğrulamak için bu son derece önemlidir.

Betik, dinamik olarak bir HTTPRequest düğümü (node) oluşturur ve bir sunucu askıda kaldığında sonsuz engelleme döngülerini (infinite blocking loops) önlemek için standart zaman aşımlarını (10.0 saniye) ve yönlendirme sınırlarını (redirect limits) yapılandırır. Payload'umuzu JSON.stringify() kullanarak biçimlendirip X-Engine-Client başlığını (header) açıkça ayarlayarak, backend tarafının istemci versiyonlarını doğru bir şekilde takip edebilmesini sağlıyoruz. Yanıt gövdesini okumak için PackedByteArray kullanılması da yüksek frekanslı ağ alışverişleri sırasında optimum bellek kullanımını garanti eder.

Godot Eklentilerinde Backend Bilgilerini Güvenli Hale Getirmek: En İyi Pratikler

Bağımsız (indie) oyun mimarilerindeki en büyük güvenlik açıklarından biri, anahtarların açığa çıkmasıdır (key exposure). Backend eklentiniz bir veritabanı bağlantı dizesi (connection string) veya master API anahtarı (master API key) gerektiriyorsa, bunu standart bir GDScript Singleton içine yerleştirmek büyük bir güvenlik riskidir. Bir Godot projesini export ettiğinizde, tüm betik dosyaları bir .pck ikili (binary) dosyası halinde paketlenir.

Bir oyuncu basit bir decompiler indirip kaynak kodunuzu çıkarabilir ve yazma yetkisine sahip veritabanı kimlik bilgilerinizi bir dakikadan kısa sürede çalabilir. Bu durum tüm backend sisteminizi veri silinmelerine, yapay skor tablosu (leaderboard) eklemelerine ve sunucu tarafı istismarlara (exploitation) açık hale getirir. Ticari sürüm hazırlayan herkes için bu yolları güvenli hale getirmek hayati önem taşır.

Bunu önlemek için, backend eklentileri çalışma zamanı ortam değişkenlerine (runtime environment variables) veya güvenli, sunucu yetkili geçitlerine (server-authoritative gateways) dayanmalıdır. İstemcinin doğrudan birincil veritabanınızla konuşmasına izin vermek yerine, yazma işlemlerini yürütmeden önce oyuncunun kimliğini doğrulayan bir yetkilendirme ara sunucusu (authentication proxy) üzerinden tüm trafiği zorlamalısınız. İstemci yalnızca genel ve düşük yetkili bir API token tutmalı, yüksek yetkili anahtarlar ise sunucu tarafındaki ortamlarda güvenli bir şekilde kilitli kalmalıdır.

Bu güvenli backend altyapısını kendi başınıza kurmak; yük dengeleyiciler (load balancers), veritabanı bölümleme (database sharding), kullanıcı oturum depoları (user session stores) ve özel kimlik doğrulama geçitleri (custom authentication gateways) yapılandırmayı gerektirir ki bu da en az 4 ila 6 haftalık bir mimari çalışma demektir. İşte bu noktada tam yönetimli bir Backend-as-a-Service, Godot geliştiricileri için muazzam bir avantaja dönüşür. Özel güvenlik wrapper'ları yazmak ve anahtar rotasyonlarını (key rotations) manuel olarak yönetmek yerine, horizOn istemci SDK'sı doğrudan tam yönetimli ve sunucu yetkili bir backend altyapısına bağlanır.

Kimlik doğrulama (auth), matchmaking ve oyuncu envanteri gibi süreçleri güvenli ve önceden yapılandırılmış bir altyapıya devrederek, anahtarların açığa çıkmasını önleyebilir ve haftalarca sürecek backend geliştirme yükünü ortadan kaldırabilirsiniz. En son yüksek performanslı backend sistemlerimizi devasa trafik artışlarına dayanacak şekilde nasıl tasarladığımıza göz atmak için Blood Sweat And Code Inside Horizons Biggest Indie Game Backend Update Yet başlıklı teknik incelememizi okuyabilirsiniz. Bu mimari geçiş, hem zamandan tasarruf sağlar hem de sunucu tarafındaki baş ağrılarını giderir.

Godot 4.7'ye Geçiş: Backend Eklenti Geliştiricileri İçin Göç Kılavuzu

Şu anda Godot için bir backend SDK veya eklenti yönetiyorsanız, yeni godot asset store mimarisine geçiş yapmak, yayın hattınızı (release pipeline) yeniden yapılandırmanızı gerektirir. Kod yapınızı, metadata yapılandırmanızı ve deployment süreçlerinizi mağazanın yeni gereksinimleriyle uyumlu hale getirmelisiniz.

Adım 1: plugin.cfg Metadatasını Yeniden Yapılandırmak

plugin.cfg dosyası, eklentinizin (addon) kalbidir. Eski sistemde bu dosya için yalnızca ad, versiyon ve yazar bilgileri yeterliydi. Yeni mağazanın çoklu versiyon filtrelemesiyle entegre olmak için açık uyumluluk anahtarları eklemeniz gerekir.

[plugin]
name="Secure Backend SDK for Godot"
description="An ultra-secure, server-authoritative SDK providing real-time database syncing, matchmaking, and authentication."
author="Ecosystem Integration Team"
version="2.1.0"
script="plugin_init.gd"
supported_godot_versions="4.7.x, 4.8.x"
category="Networking"

supported_godot_versions eklemek, editörün dahili asset yöneticisinin kodunuzu hangi motor sürümlerinin güvenle yükleyebileceğini tam olarak bilmesini sağlar. Bu, daha eski 4.0 veya 4.2 sürümlerindeki kullanıcıların uyumluluk derleme hatalarıyla (compilation errors) karşılaşmasını engeller. Ayrıca asset store için net arama dizini etiketleri sağlar.

Adım 2: Motora Özel Ağ (Network) Uygulamalarını Ayrıştırmak

Eklentiniz hem Godot 3.x hem de Godot 4.x sürümlerini destekliyorsa veya Godot 4.2 ile 4.7 arasında farklı thread-safety modellerini yönetiyorsa, tüm durumları kapsayan tek bir monolitik script yazmaya çalışmayın. Bunun yerine, deponuzu (repository) farklı dal hiyerarşilerine ayırın (örneğin release/v1-godot4.2 ve release/v2-godot4.7). Yeni mağazanın yükleme sistemi, belirli zip paketlerini belirli Git etiketlerine (tags) bağlamanıza izin vererek sürüm hatlarınızı otomatik olarak temiz tutar.

Adım 3: Yükleme Hattını GitHub Actions ile Otomatikleştirmek

Eklentinizin addons/ klasörünü manuel olarak bir zip dosyasında paketlemek ve bir web formu aracılığıyla yüklemek hataya çok açık bir süreçtir. Modern eklenti geliştirme süreci otomasyon gerektirir. Yeni bir sürüm etiketi (release tag) gönderdiğinizde tetiklenen basit bir GitHub Action kurabilirsiniz.

Bu eylem (action), depoyu kontrol eder (checkout), eklenti dizinini ayrıştırır, içerikleri zip ile sıkıştırır ve güvenli ortam sırlarını (environment secrets) kullanarak doğrudan Asset Store API uç noktalarına (endpoints) gönderir. Aşağıda, bu otomatik yayın hattını elde etmek için kullanabileceğiniz eksiksiz ve gerçek bir iş akışı (workflow) dosyası bulunmaktadır.

name: Deploy Plugin to Godot Asset Store

on:
  release:
    types: [published]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Create Distribution Zip
        run: |
          mkdir -p dist/addons/my_backend_plugin
          cp -r addons/my_backend_plugin/* dist/addons/my_backend_plugin/
          cd dist
          zip -r ../my_backend_plugin_v${{ github.event.release.tag_name }}.zip addons/
          
      - name: Push to Godot Asset Store API
        env:
          ASSET_STORE_TOKEN: ${{ secrets.GODOT_STORE_TOKEN }}
          ASSET_ID: "87654"
        run: |
          curl -X POST "https://api.store.godotengine.org/v1/assets/$ASSET_ID/versions" \
            -H "Authorization: Bearer $ASSET_STORE_TOKEN" \
            -F "file=@my_backend_plugin_v${{ github.event.release.tag_name }}.zip" \
            -F "version=${{ github.event.release.tag_name }}" \
            -F "godot_version=4.7"

Bu yayın hattı, addons/my_backend_plugin dizinini otomatik olarak çıkarır, temiz bir zip dağıtımı oluşturur ve şifrelenmiş bir taşıyıcı token (bearer token) kullanarak curl aracılığıyla Godot Asset Store API'sine yayınlar. Bu, kullanıcılarınızın manuel müdahaleye gerek kalmadan her zaman doğrulanmış, kararlı bir sürüm almasını garanti eder. Ayrıca yayına alma (deployment) aşamasındaki insan hatasını tamamen ortadan kaldırır.

Godot Backend Eklentileri İçin Savaşta Test Edilmiş En İyi Pratikler

Eklentinizin maksimum değer sağlamasını ve binlerce kurulumda kararlı kalmasını garantilemek için bu mimari en iyi pratikleri hemen benimseyin:

  1. Arayüz (UI) ve Çekirdek Backend Mantığını Ayrıştırın (Decouple): Backend istek mantığını asla doğrudan UI betiklerinizin içine yazmayın. Veri serileştirme (serializing), token depolama ve ağ kuyruklarını (network queues) yöneten özel bir BackendService autoload oluşturun. UI düğümleri (nodes) yalnızca bu singleton üzerindeki metotları çağırmalı ve görevler tamamlandığında sinyalleri dinlemelidir. Bu ayrım, UI betiklerine dokunmadan backend SDK'sının temelindeki ağ çağrılarını değiştirmenize olanak tanır.

  2. Hatasız Çevrimdışı ve Yeniden Bağlanma Arabellekleri (Reconnection Buffers) Uygulayın: Bağımsız (indie) oyunlar sık sık ağ aksamalarıyla karşılaşır. Güçlü bir backend eklentisi, bir oyuncunun bağlantısı koptuğunda durum değişikliklerini depolamak için yerel bir kuyruk (local queue) uygulamalıdır. Bağlantı yeniden kurulduğunda, eklenti kuyruktaki işlemleri toplu olarak yükleyebilir (batch-upload) ve sunucu yükünü azaltabilir. Bu yerel önbellek (cache), ani ağ kesintilerine karşı bir güvence görevi görür.

  3. Dağıtılan PCK Dosyalarını Temizleyin (Sanitize): Staging API anahtarlarını, geliştirme kimlik bilgilerini veya yerel test yapılandırmalarını asla nihai .pck dosyanızın içine derlenen klasörlerde saklamayın. Başlatma betiklerinizin içinde ortam tabanlı yapılandırma geçitleri (environment-based configuration gates) kullanın; çalışma zamanında (runtime) canlı ortam sırlarını (production secrets) ortam değişkenlerinden (environment variables) veya güvenli harici veritabanlarından yükleyin. Bu, hassas sunucu yollarınızı meraklı gözlerden uzak tutar.

  4. Godot Asset Store Versiyon Geçitlerinden Yararlanın: Tüm oyuncuların eklentinizin en son sürümünü çalıştırdığını varsaymayın. Yeni özelliklerin yüklenmesini uyumlu motor sürümleriyle sınırlandırmak için uyumluluk filtrelerini kullanın. Bu, eski editör çalışma zamanlarında (editor runtimes) derleme çökmelerini (compilation crashes) önler.

Sonuç ve Sonraki Adımlar

Yeni godot asset store'un lansmanı, Godot ekosistemi için büyük bir dönüm noktasıdır. Çoklu versiyon hedef eşleme, otomatik güncelleme döngüleri ve gelişmiş telemetri sunarak mağaza, oyun geliştiricilerinin harici backend entegrasyonlarını yönetme şeklini kökten değiştiriyor. Manuel zip çıkarma ve bozucu küçük motor güncellemeleri dönemi nihayet sona erdi.

Backend eklenti geliştiricileri için bu durum, oyuncuların ve geliştiricilerin güvenini kazanan son derece kararlı, versiyona özel SDK'lar sunmak için inanılmaz bir fırsatı temsil ediyor. Eğer bir multiplayer oyun geliştiriyorsanız ve sıfırdan özel matchmaking, veritabanları ve anahtar rotasyon (key rotation) çerçeveleri yazma zahmetinden kaçınmak istiyorsanız, horizOn önceden yapılandırılmış ve canlıya hazır (production-ready) bir sunucu mimarisi sunuyor.

Multiplayer backend sisteminizi ölçeklendirmeye hazır mısınız? horizOn'u ücretsiz deneyin veya sunucu yetkili (server-authoritative) matchmaking, veritabanı depolama ve güvenli kimlik doğrulamayı (authentication) bugün Godot projenize entegre etmenin ne kadar kolay olduğunu görmek için API docs sayfasına göz atın.


Kaynak: Introducing the Godot Asset Store