Hızlı başlangıç
Betiği index.html dosyanıza ekleyin ve IzySDK.init() fonksiyonunu bir kez çağırın. Her zaman başarıyla sonuçlanır: izy.gg'de siteye bağlanır, başka her yerde test reklamları ve yerel kayıtlarla bağımsız olarak çalışır.
<script src="https://izy.gg/sdk/v1.js"></script>
<script>
(async () => {
const izy = await IzySDK.init(); // always resolves, also outside izy.gg
// Language and sound from izy.gg
game.setLanguage(izy.locale); // "en", "ru", …
game.mute(izy.muted);
izy.on("audio", ({ muted }) => game.mute(muted));
// Loading screen
izy.loading(40); // 0..100
await game.load();
izy.ready();
})();
</script>API referansı
Her şey IzySDK.init() fonksiyonunun döndürdüğü nesnede bulunur:
- izy.locale: oyuncunun izy.gg'deki dili ("en", "ru", …).
- izy.device: "desktop", "mobile" veya "tablet".
- izy.user: oturum açmış oyuncunun { name, avatar } bilgisi ya da null.
- izy.muted: oyuncunun sitenin sesini kapatıp kapatmadığı. izy.on("audio", ({ muted }) => …) bu değer değiştiğinde size haber verir.
- izy.test: izy.gg dışında ve portal önizlemesinde true olur (reklamlar test reklamıdır, hiçbir şey sayılmaz).
- izy.loading(progress) ve izy.ready(): izy.gg yükleme ekranını yönetir.
- izy.gameplayStart() ve izy.gameplayStop(): gerçek oynanışın ne zaman sürdüğünü izy.gg'ye bildirir. Reklamlar oynanışı asla kesmez.
- izy.ads.interstitial() ve izy.ads.rewarded(): aşağıdaki Reklamlar bölümüne bakın.
- izy.save(data) ve izy.load(): aşağıdaki Bulut kayıtları bölümüne bakın.
- izy.happyTime(): bir rekor ya da tamamlanan bir seviye gibi bir sevinç anı.
- izy.on("pause" | "resume", callback): her reklamdan önce ve sonra tetiklenir. "pause" geldiğinde oyununuzun sesini kapatın ve oyunu duraklatın.
Reklamlar
Geçiş reklamları seviyeler arasında veya oyun bittikten sonra gösterilir. izy.gg oyuncuları korur: oyununuz ne kadar sık isterse istesin, ilk 90 saniyede geçiş reklamı gösterilmez ve en fazla 2 dakikada bir gösterilir. Reklamı doğal duraklama anlarında çağırın ve promise tamamlandığında oyuna devam edin.
Ödüllü reklam her zaman oyuncunun kendi tercihi olmalıdır (ödülü açıkça belirten bir düğme) ve ödül yalnızca promise true ile sonuçlandığında verilir.
Geçiş reklamı oynanışı asla kesmez: oyununuz oynanışın sürdüğünü bildirdiği sürece (gameplayStop olmadan gameplayStart) istek false ile sonuçlanır. Örnekteki gibi önce gameplayStop çağırın.
// Between levels: izy.gg decides if an ad fits (at most one every 2 minutes)
izy.gameplayStop();
await izy.ads.interstitial(); // → true if an ad was shown
izy.gameplayStart();
// Only when the player taps "Watch an ad for +1 life"
if (await izy.ads.rewarded()) { // → true only if watched to the end
player.lives += 1;
}
// izy.gg pauses your game around every ad
izy.on("pause", () => game.pause());
izy.on("resume", () => game.resume());Bulut kayıtları
Oturum açmış oyuncular ilerlemelerini tüm cihazlarında korur, misafirler ise tarayıcıda. Kayıtlar bir sürüme değil oyuna aittir: her güncellemeden sonra korunur. İlk seviyeyi başlatmadan önce load() çağrısını her zaman await ile bekleyin.
// Any JSON up to 256 KB. Signed-in players get it on every device.
await izy.save({ level: 7, coins: 1200 });
const progress = await izy.load(); // → your object, or null
if (progress) game.restore(progress);Unity, Godot, Construct, Phaser ve diğer motorlar
SDK düz JavaScript ile yazılmıştır, bu yüzden HTML5 veya WebGL dışa aktarımı olan her motor onu kullanabilir. Unity onu bir .jslib eklentisi ve küçük bir C# betiği üzerinden çağırır; WebGL şablonu Unity'nin yükleme çubuğunu izy.gg'ye bağlar. Godot 4 JavaScriptBridge, Construct 3 ise bir proje betiği kullanır.
// Assets/Plugins/WebGL/izy.jslib
mergeInto(LibraryManager.library, {
IzyInit: function () {
IzySDK.init().then(function (izy) {
window.izy = izy;
izy.on("pause", function () { SendMessage("IzyBridge", "OnPause", ""); });
izy.on("resume", function () { SendMessage("IzyBridge", "OnResume", ""); });
izy.on("audio", function (a) { SendMessage("IzyBridge", "OnMuted", a.muted ? "1" : "0"); });
SendMessage("IzyBridge", "OnInit", izy.locale + "|" + (izy.muted ? "1" : "0"));
});
},
IzyGameplayStart: function () { if (window.izy) window.izy.gameplayStart(); },
IzyGameplayStop: function () { if (window.izy) window.izy.gameplayStop(); },
IzyInterstitial: function () {
window.izy.ads.interstitial().then(function () { SendMessage("IzyBridge", "OnAdDone", ""); });
},
IzyRewarded: function () {
window.izy.ads.rewarded().then(function (ok) { SendMessage("IzyBridge", "OnRewarded", ok ? "1" : "0"); });
},
IzySave: function (json) { window.izy.save(JSON.parse(UTF8ToString(json))); },
IzyLoad: function () {
window.izy.load().then(function (data) { SendMessage("IzyBridge", "OnLoaded", JSON.stringify(data)); });
},
});
// Assets/Scripts/IzyBridge.cs: on a GameObject named "IzyBridge" in the first scene.
using System;
using System.Runtime.InteropServices;
using UnityEngine;
public class IzyBridge : MonoBehaviour
{
[DllImport("__Internal")] static extern void IzyInit();
[DllImport("__Internal")] static extern void IzyGameplayStart();
[DllImport("__Internal")] static extern void IzyGameplayStop();
[DllImport("__Internal")] static extern void IzyInterstitial();
[DllImport("__Internal")] static extern void IzyRewarded();
[DllImport("__Internal")] static extern void IzySave(string json);
[DllImport("__Internal")] static extern void IzyLoad();
public static string Locale = "en";
static Action<bool> onReward;
static Action<string> onLoaded;
void Awake()
{
DontDestroyOnLoad(gameObject);
#if UNITY_WEBGL && !UNITY_EDITOR
IzyInit();
#endif
}
public static void GameplayStart() { IzyGameplayStart(); }
public static void GameplayStop() { IzyGameplayStop(); }
public static void Interstitial() { IzyInterstitial(); }
public static void Rewarded(Action<bool> done) { onReward = done; IzyRewarded(); }
public static void Save(object data) { IzySave(JsonUtility.ToJson(data)); }
public static void Load(Action<string> done) { onLoaded = done; IzyLoad(); }
// Called from JavaScript
void OnInit(string s) { var p = s.Split('|'); Locale = p[0]; AudioListener.volume = p[1] == "1" ? 0 : 1; }
void OnPause() { AudioListener.pause = true; Time.timeScale = 0; }
void OnResume() { AudioListener.pause = false; Time.timeScale = 1; }
void OnMuted(string m) { AudioListener.volume = m == "1" ? 0 : 1; }
void OnAdDone(string _) { }
void OnRewarded(string ok) { onReward?.Invoke(ok == "1"); }
void OnLoaded(string json) { onLoaded?.Invoke(json); }
}
<!-- WebGL template index.html: the izy.gg loading bar follows Unity's -->
<script src="https://izy.gg/sdk/v1.js"></script>
<script>
const izyReady = IzySDK.init();
createUnityInstance(canvas, config, (p) => izyReady.then((izy) => izy.loading(p * 100)))
.then(() => izyReady.then((izy) => izy.ready()));
</script>
# Godot 4, Web export. Export > HTML > Head Include:
# <script src="https://izy.gg/sdk/v1.js"></script>
var izy = null
# Keep callbacks in variables, or Godot frees them.
var _on_init_cb = JavaScriptBridge.create_callback(_on_init)
var _on_reward_cb = JavaScriptBridge.create_callback(_on_reward)
func _ready():
if OS.has_feature("web"):
JavaScriptBridge.get_interface("IzySDK").init().then(_on_init_cb)
func _on_init(args):
izy = args[0]
TranslationServer.set_locale(izy.locale)
izy.ready()
func show_interstitial():
if izy: izy.ads.interstitial()
func show_rewarded():
if izy: izy.ads.rewarded().then(_on_reward_cb)
func _on_reward(args):
if args[0]:
give_reward()
// Construct 3: after export add <script src="https://izy.gg/sdk/v1.js"></script> to index.html,
// then in a project script:
let izy;
runOnStartup(async (runtime) => {
izy = await IzySDK.init();
runtime.globalVars.Locale = izy.locale; // a global variable "Locale" in your event sheet
});
// Events: "Execute JavaScript" -> izy.ads.interstitial()
// Phaser
this.sound.mute = izy.muted;
izy.on("audio", ({ muted }) => (this.sound.mute = muted));
izy.on("pause", () => this.game.pause());
izy.on("resume", () => this.game.resume());
// GameMaker, Defold, Cocos Creator, PlayCanvas: add the script tag to the HTML5 export's index.html
// and call the same functions from the engine's JavaScript bridge.Derleme gereksinimleri
- izy.gg SDK betiği zorunludur: bu betik olmadan bir derleme incelemeye gönderilemez.
- Kök dizinde (veya tek bir klasörün içinde) index.html bulunan bir zip dosyası. Sıkıştırılmış olarak en fazla 100 MB, açıldığında en fazla 300 MB ve 3000 dosya.
- Yalnızca göreli yollar kullanın; oyunun ihtiyaç duyduğu her şey zip dosyasının içinde olmalıdır. Hiçbir şeyi şifresiz http üzerinden yüklemeyin.
- Çalıştırılabilir dosya veya sunucu tarafı betik olmamalıdır (.exe, .php, .sh ve benzerleri reddedilir).
- Kendi analitik araçlarınız, izleyicileriniz veya reklamlarınız olmamalıdır: reklamları izy.gg yönetir, oyuncuların gizliliği ise onay kurallarımızla korunur.
- Her pencere boyutuna uyum sağlamalı ve mobil uyumlu olarak işaretlediyseniz dokunmatik ekranda çalışmalıdır. Oyununuz izygames.formarrival.com üzerinde korumalı (sandbox) bir çerçevede çalışır.
- Unity WebGL: Brotli veya Gzip sıkıştırması kullanılabilir (dosyalar doğru kodlama ve türle sunulur), decompression fallback gerekmez.
Test etme
Yerel ortamda: index.html dosyanızı herhangi bir yerel sunucudan açın. SDK bağımsız çalışır, 3 saniyelik bir test reklamı katmanı gösterir ve ödüllü reklamları true ile sonuçlandırır.
Portalda: bir derleme yükledikten sonra "Derlemeyi test et" düğmesine basın. Derleme, siz incelemeye göndermeden önce test reklamlarıyla, tam olarak izy.gg'deki gibi çalışır.
İnceleme
Her yeni oyun ve her yeni sürüm, genellikle 2 iş günü içinde bir kişi tarafından kontrol edilir. Aşağıdaki durumlarda oyunu reddederiz:
- yüklenmiyor, çöküyor veya desteklediğini belirttiği cihazlarda oynanamıyorsa;
- kötü amaçlı yazılım, kripto para madencisi, kimlik avı (phishing) veya gizli yönlendirmeler içeriyorsa;
- yetişkinlere yönelik, nefret söylemi içeren veya yasa dışı içerik gösteriyor ya da kullanım hakkına sahip olmadığınız varlıklar kullanıyorsa;
- kendi reklamlarını veya başka oyun sitelerine bağlantılar gösteriyor ya da kişisel veri istiyorsa;
- ödüllü reklamları kötüye kullanıyor veya oyuncuları reklam izlemeye zorluyorsa.
Otomatik güvenlik taraması
Yüklenen her derleme, bir kişi incelemeden önce taranır. Tarayıcıda çalışan bir kripto para madencisi içeren derleme, yükleme sırasında reddedilir. izy.gg sayfasını yönlendiren, açılır pencere açan, service worker kaydeden, paketlenmiş eval kullanan veya başka platformların reklam ve analitik SDK'lerini yükleyen kod, inceleyici için işaretlenir. Oyunun kaynak yüklediği harici alan adları da listelenir.
Oyunlar ayrı bir alan adında (izygames.formarrival.com), korumalı (sandbox) bir çerçevede çalışır ve izy.gg hesaplarına veya çerezlerine erişemez.
Güncellemeler ve ekran yönü
Bir oyun yayınlandıktan sonra başlığı, açıklaması, kategorisi ve etiketleri sabitlenir; bunları talep üzerine destek ekibi değiştirebilir (direct@izy.gg). Nasıl oynanır metni, derleme, kapak, oynanış videosu, ekran yönü ve diller değiştirilebilir ve her değişiklik incelemeden geçer. Değişiklik onaylanana kadar oyuncular incelenmiş sürümü görmeye devam eder.
Yeni sürümlerin otomatik incelemesi: yalnızca yeni bir derleme gönderip başka hiçbir şeyi değiştirmediğinizde, derleme aynı oyun gibi görünüyorsa hemen yayınlanır: güvenlik uyarısı yok, SDK yerinde, yeni harici alan adı yok, başlangıç dosyası aynı, boyut ve dosya sayısı benzer, dosya adlarının çoğu değişmemiş. Günde en fazla 3 böyle güncelleme yapılabilir; art arda 5 güncellemeden sonra bir sonrakine moderatör bakar. Geri kalan her şey her zamanki gibi moderatörlere gider ve moderatörler otomatik bir güncellemeyi geri alabilir.
Ekran yönü telefonlar ve bilgisayarlar için ayrı ayrı ayarlanır. Telefonlarda gerektiğinde oyuncudan cihazı döndürmesi istenir. Bilgisayarlarda oyun varsayılan olarak geniş bir 16:9 sahne alır ve buna uyum sağlamalıdır (veya kendi yan çubuklarını çizmelidir); "Yalnızca dikey" seçeneğini yalnızca oyun buna uyum sağlayamıyorsa seçin.
Bir oyunu istediğiniz zaman yayından kaldırıp yeniden yayına alabilir ya da silebilirsiniz. Silinen oyun siteden ve portaldan kaldırılır; kazandığı tutar bakiyenizde kalır.
Oyun sayfası, diller ve medya
izy.gg İngilizce, Rusça, Türkçe ve İspanyolca olarak yayında. Başlığı, açıklamayı ve Nasıl oynanır metnini bunlardan birinde (orijinal) yazın. Sitenin diğer her dili için şunlardan birini seçin: otomatik çevir (yapay zekâ orijinali kaydettiğinizde ve orijinal her değiştiğinde yeniden çevirir) veya kendiniz yazın. Başlığın çevirisini açmadığınız sürece başlık orijinaldeki gibi kalır. Moderatör her dili kontrol eder.
Oyunun dilleri: oyunun kendisinin desteklediği diller, oyunun sayfasında gösterilir. Etiketler: en fazla 6 tane, oyunu koleksiyonlara ve arama sonuçlarına yerleştirir.
Kapak: en fazla 2 MB boyutunda PNG, JPEG veya WebP, 16:10 oranında kırpılır. Oynanış videosu: en fazla 25 MB boyutunda MP4 veya WebM, 10 ila 30 saniyelik sessiz, gerçek oynanış; katalogda üzerine gelindiğinde oynatılır ve video aramalarında görünür.
Analitik
Portaldaki oyun sayfası son 30 günün gerçek rakamlarını gösterir. Katalog görüntülemeleri: oyun kartının en az yarısı bir saniye boyunca ekranda kaldığında sayılır, sayfa görüntüleme başına bir kez. Tıklamalar ve CTR: karttaki tıklamaların katalog görüntülemelerine bölümü. Sayfa görüntülemeleri ve başlatma oranı: başlatmaların oyun sayfası ziyaretlerine bölümü.
Oynanış oranı: oyunun izy.gameplayStart() çağırdığı başlatmaların payı. Oyuncuların nerede ayrıldığını görmek için bunu gerçek oyun başladığında (yükleme ve menülerden sonra) çağırın. Geri dönen oyuncular: en az iki farklı günde oynayan oyuncular. Beğeniler ve beğenmemeler oyuncuların gerçek oylarıdır.
Tanıtım
Yayındaki oyunlar kazanç bakiyesinden tanıtılabilir: ana sayfadaki "Tanıtılan oyunlar" satırında bir yer (sayılan her 1000 gösterim için ödenir) veya oyunun kategorisindeki en üst sıra (günlük ödenir, kategori başına bir oyun). Fiyatlar sabit ve herkese açıktır, açık artırma yoktur.
Tanıtılan yerler oyunculara her zaman etiketle belirtilir. Tanıtımdan gelen oynamalar hiçbir zaman puanlara, en iyiler listelerine veya önerilere sayılmaz. Bir gösterim, ziyaretçi başına günde bir kez sayılır, botlar hariç tutulur. Her kampanya önce incelenir ve harcanmayan tutar bakiyeye geri döner.
Kazançlar ve ödemeler
Oyunlarınızın içinde gösterilen reklamlardan gelir payınızı (varsayılan olarak %70) kazanırsınız. Kazançlar portalda her gün görünür; son iki günün tutarları tahminidir ve 48 saat içinde kesinleşir.
Bakiyeniz alt sınıra (varsayılan olarak 50 USD) ulaştığında Kazançlar sayfasından ödeme talep edin. 10 iş günü içinde PayPal, Payoneer, Wise, USDT (TRC-20) veya banka havalesiyle ödeme yaparız.
Yardım
SDK, inceleme veya ödemelerle ilgili sorular: direct@izy.gg.