Topluluk içeriği, oyununuzun ömrünü nasıl uzatır?
Merhaba!
Şimdiye kadar başkalarının oyunlarını modlamayı konuştuk — bu sefer madalyonun diğer yüzü: kendi oyununuza mod desteği nasıl eklersiniz? Bu konuda pratik bir API tasarımı ve mimari yaklaşımı ele aldım.
• Oyununuzun ömrünü ciddi şekilde uzatabiliyor — Skyrim, Minecraft gibi oyunlar mod sayesinde yıllarca güncel kalıyor
• Topluluk katılımı ve bağlılığı artırıyor
• Bazı en iyi içerik fikirleri topluluktan gelebiliyor
• Ek maliyetsiz içerik genişlemesi sağlıyor
Python:
# Basit ama genişletilebilir bir mod/plugin sistemi mimarisi
# (Kavramsal örnek — Python ile, ama prensip her dile uygulanabilir)
import importlib.util
import os
from abc import ABC, abstractmethod
# ─── MOD ARAYÜZÜ — Her mod bu şablonu takip etmeli ──
class OyunModu(ABC):
"""
Tüm modların uygulaması gereken temel arayüz.
Bu, oyununuzun modlarla nasıl 'konuşacağını' tanımlıyor.
"""
@abstractmethod
def mod_bilgisi(self) -> dict:
"""Mod adı, versiyon, yazar bilgisi döndürür"""
pass
@abstractmethod
def yuklendiginde(self, oyun_api):
"""Mod yüklendiğinde bir kez çağrılır — kayıt işlemleri burada"""
pass
def her_karede_calis(self, delta_zaman: float):
"""Opsiyonel — her frame çağrılabilir (varsayılan: hiçbir şey yapma)"""
pass
# ─── OYUN API'Sİ — Modların erişebileceği güvenli arayüz ─
class OyunAPI:
"""
Modlara sunulan KONTROLLÜ erişim noktası.
Modlar oyunun iç koduna doğrudan erişemez — sadece
bu API üzerinden izin verilen işlemleri yapabilir.
Bu, güvenlik ve stabilite için kritik bir tasarım kararı.
"""
def __init__(self, oyun_durumu):
self._oyun_durumu = oyun_durumu
self._olay_dinleyicileri = {}
def yeni_esya_kaydet(self, esya_id: str, esya_verisi: dict):
"""Modların oyuna yeni eşya eklemesine izin ver"""
self._oyun_durumu.esya_kayitlari[esya_id] = esya_verisi
print(f"✅ Mod tarafından yeni eşya kaydedildi: {esya_id}")
def olay_dinle(self, olay_adi: str, geri_cagirma_fonksiyonu):
"""
Modların belirli oyun olaylarına (düşman öldü, seviye atlandı vb.)
tepki verebilmesi için event sistemi
"""
if olay_adi not in self._olay_dinleyicileri:
self._olay_dinleyicileri[olay_adi] = []
self._olay_dinleyicileri[olay_adi].append(geri_cagirma_fonksiyonu)
def olay_tetikle(self, olay_adi: str, **veri):
"""Oyun motoru tarafından çağrılır — kayıtlı tüm mod dinleyicilerini tetikler"""
for dinleyici in self._olay_dinleyicileri.get(olay_adi, []):
try:
dinleyici(**veri)
except Exception as hata:
# KRİTİK: Bir mod hata verirse, tüm oyun çökmemeli!
print(f"⚠️ Mod hatası (olay: {olay_adi}): {hata}")
def oyuncu_bilgisi_al(self) -> dict:
"""Modlara sadece OKUMA erişimi — yazmaya izin verilmiyor (güvenlik)"""
return {
"can": self._oyun_durumu.oyuncu_can,
"seviye": self._oyun_durumu.oyuncu_seviye,
}
# ─── MOD YÜKLEYİCİ ───────────────────────────────────
class ModYukleyici:
def __init__(self, mod_klasoru: str = "mods/"):
self.mod_klasoru = mod_klasoru
self.yuklu_modlar = []
def modlari_tara_ve_yukle(self, oyun_api: OyunAPI):
"""
mods/ klasöründeki her .py dosyasını güvenli şekilde
yükleyip mod arayüzünü uygulayan sınıfları bulur
"""
if not os.path.exists(self.mod_klasoru):
print(f"ℹ️ Mod klasörü bulunamadı: {self.mod_klasoru}")
return
for dosya_adi in os.listdir(self.mod_klasoru):
if dosya_adi.endswith('.py'):
try:
self._mod_dosyasini_yukle(dosya_adi, oyun_api)
except Exception as hata:
print(f"❌ Mod yüklenemedi ({dosya_adi}): {hata}")
# Bir mod başarısız olsa bile diğerleri yüklenmeye devam etmeli
def _mod_dosyasini_yukle(self, dosya_adi: str, oyun_api: OyunAPI):
dosya_yolu = os.path.join(self.mod_klasoru, dosya_adi)
modul_adi = dosya_adi[:-3]
spec = importlib.util.spec_from_file_location(modul_adi, dosya_yolu)
modul = importlib.util.module_from_spec(spec)
spec.loader.exec_module(modul)
# Modülde OyunModu'nu uygulayan sınıfları bul
for isim in dir(modul):
nesne = getattr(modul, isim)
if (isinstance(nesne, type) and issubclass(nesne, OyunModu)
and nesne is not OyunModu):
mod_ornegi = nesne()
bilgi = mod_ornegi.mod_bilgisi()
print(f"📦 Mod yükleniyor: {bilgi['isim']} v{bilgi['versiyon']}")
mod_ornegi.yuklendiginde(oyun_api)
self.yuklu_modlar.append(mod_ornegi)
print("✅ Mod sistemi mimarisi tanımlandı!")
print("💡 Bu yapı, güvenlik (izole API), esneklik (event sistemi) ve")
print(" dayanıklılık (bir mod hatası tüm oyunu çökertmiyor) sağlıyor")
Nasıl bir mimari kullandınız? Zorluklarınızı paylaşın!