שחקן בדיוק הפסיד בשלב 10 — בילה 15 דקות, תסכול, והדחף לעזוב. מודעות Rewarded הממוקמות כראוי הופכות את התסכול הזה להכנסה ללא פגיעה בנאמנות. אבל אינטגרציה שגויה שוברת את כלכלת המשחק ומפחיתה שימור. אנחנו עוסקים באינטגרציות Rewarded כבר 5+ שנים, סיפקנו 30+ פרויקטים ל-iOS ואנדרואיד — מהיפרד-קז'ואל ועד RPG. מקרה אחד: לאחר הגדרת המשך-אחרי-כישלון, השימור גדל ב-12%, ו-eCPM עלה ב-25%. גידול ממוצע ב-eCPM לאחר הכוונון שלנו הוא 25-40% (לדוגמה, מ-$6 ל-$9 עבור פרויקט אחד). בואו נפרק את הניואנסים הטכניים ואת המלכודות.
איך לבחור מיקומים למודעות Rewarded?
מיקום הוא נקודה בלולאת המשחק שבה לשחקן יש צורך שהוא מוכן "לשלם" עבורו בצפייה במודעה. היעילים ביותר:
-
המשך אחרי כישלון — המרה של 30–50% בתנאי שהשחקן לא ראה מודעה על המסך הזה קודם. הצג אחרי
onGameOver, לפני מסך התוצאות. מגבלה: 1–2 לניסיון. - מכפיל בונוס יומי — "צפה במודעה — קבל x3 תגמול יומי". לא שובר איזון, ההמרה גבוהה באופן עקבי.
- מטבע נוסף / פתיחת תיבה — הצעה ספציפית: "+50 יהלומים" במקום "בונוס". עובד בתפריט הראשי או אחרי שלב.
| מיקום | המרה | השפעה על שימור | מגבלה מומלצת |
|---|---|---|---|
| המשך אחרי כישלון | 30–50% | ניטרלי (עם מגבלה) | 1–2 לניסיון |
| מכפיל בונוס יומי | 20–35% | חיובי | 1 ליום |
| מטבע נוסף | 15–25% | ניטרלי | 3–5 ליום |
איך לשלב טכנית Rewarded ב-Unity?
אנחנו משתמשים ב-AdMob (Google Mobile Ads) או ב-IronSource (LevelPlay) SDK. לאתחול AdMob:
private RewardedAd rewardedAd;
public void LoadRewardedAd()
{
var adUnitId = Application.platform == RuntimePlatform.Android ? "ca-app-pub-xxx/yyy" : "ca-app-pub-xxx/zzz";
RewardedAd.Load(adUnitId, new AdRequest(), (ad, error) =>
{
if (error != null)
{
Debug.LogWarning($"Rewarded load failed: {error}");
return;
}
rewardedAd = ad;
RegisterRewardedAdEvents(rewardedAd);
});
}
private void RegisterRewardedAdEvents(RewardedAd ad)
{
ad.OnAdFullScreenContentClosed += () =>
{
LoadRewardedAd();
};
}
public void ShowRewardedAd(System.Action<int> onRewarded)
{
if (rewardedAd == null || !rewardedAd.CanShowAd())
{
Debug.Log("Rewarded not ready");
return;
}
rewardedAd.Show(reward =>
{
onRewarded?.Invoke(reward.Amount);
});
}IronSource (LevelPlay) דורש קריאה ל-private RewardedAd rewardedAd; public void LoadRewardedAd() { var adUnitId = Application.platform == RuntimePlatform.Android ? "ca-app-pub-xxx/yyy" : "ca-app-pub-xxx/zzz"; RewardedAd.Load(adUnitId, new AdRequest(), (ad, error) => { if (error != null) { Debug.LogWarning($"Rewarded load failed: {error}"); return; } rewardedAd = ad; RegisterRewardedAdEvents(rewardedAd); }); } private void RegisterRewardedAdEvents(RewardedAd ad) { ad.OnAdFullScreenContentClosed += () => { LoadRewardedAd(); }; } public void ShowRewardedAd(System.Action<int> onRewarded) { if (rewardedAd == null || !rewardedAd.CanShowAd()) { Debug.Log("Rewarded not ready"); return; } rewardedAd.Show(reward => { onRewarded?.Invoke(reward.Amount); }); } מראש, ולהציג את הכפתור רק כאשר IronSource.Agent.loadRewardedVideo().
void Start() {
IronSource.Agent.loadRewardedVideo();
}
public void OnShowRewardedClicked() {
if (IronSource.Agent.isRewardedVideoAvailable()) {
IronSource.Agent.showRewardedVideo();
}
}
private void OnRewardedVideoAdRewarded(IronSourcePlacement placement) {
int rewardAmount = placement.getRewardAmount();
// начислить награду
} | SDK | תמיכה ב-SSV | קלות אינטגרציה | eCPM (ממוצע) |
|---|---|---|---|
| AdMob | + (ECDSA) | בינוני | $8-12 |
| Unity Ads | + | קל | $6-10 |
| IronSource | + (LevelPlay) | קשה (נדרשת הגדרת waterfall) | $10-15 |
למה אימות בצד השרת (SSV) הוא חובה?
אם Rewarded נותן מטבע קשה (יהלומים, קריסטלים) — ללא SSV, התגמולים מזויפים עם כלים כמו Frida תוך דקות. AdMob SSV מעבד קריאה חוזרת (callback) מהר יותר מ-IronSource, ומפחית את עיכוב ההענקה ב-200 אלפיות שנייה. תכנית:
- הלקוח מעביר
IronSource.Agent.isRewardedVideoAvailable() == trueו-void Start() { IronSource.Agent.loadRewardedVideo(); } public void OnShowRewardedClicked() { if (IronSource.Agent.isRewardedVideoAvailable()) { IronSource.Agent.showRewardedVideo(); } } private void OnRewardedVideoAdRewarded(IronSourcePlacement placement) { int rewardAmount = placement.getRewardAmount(); // начислить награду }ייחודי ב-userIdבעת בקשת מודעה. - AdMob/IronSource כוללים אותם בקריאה החוזרת של SSV לשרת שלך עם חתימת ECDSA.
- השרת מאמת את החתימה, את ייחודיות ה-nonce (כדי שקריאה חוזרת אחת לא תוכל לעבור פעמיים), ומעניק מטבע.
יישום בצד הלקוח — 0.5 יום, חלק השרת — יום אחד עם בדיקות.
דוגמה למטפל בקריאה חוזרת של SSV ב-Python
from flask import Flask, request
from ecdsa import VerifyingKey
import json
app = Flask(__name__)
@app.route('/ssv_callback', methods=['POST'])
def ssv_callback():
data = request.json
signature = data['signature']
payload = data['payload']
vk = VerifyingKey.from_pem(open('public_key.pem').read())
if vk.verify(signature, payload.encode()):
# Проверить nonce в Redis
return 'OK', 200
return 'Invalid signature', 400
אילו מגבלות צפייה להגדיר?
המגבלות חייבות להיות על השרת, לא רק על הלקוח (PlayerPrefs מתאפס). בפרויקט MMO, הגדרנו מגבלות דרך Redis כדי להבטיח ייחודיות nonce אפילו ב-RPS גבוה. אופייני: 5-10 Rewarded ליום למטבע, 1-2 ליום להמשך. מגבלה קשיחה הורגת הכנסה, מגבלה רכה הורסת כלכלה. אנו ממליצים להתחיל עם 8 Rewarded ליום ולבצע בדיקות A/B בקפיצות של ±2. בדיקות A/B עוזרות לאזן בין הכנסה לכלכלה ללא סיכון.
איך אנחנו משלבים מודעות Rewarded: תהליך שלב-אחר-שלב
- ביקורת על האינטגרציה הנוכחית (אם קיימת) והמלצות להגדלת eCPM.
- בחירת מיקומים לכלכלת המשחק שלך.
- יישום ב-Unity (AdMob, IronSource) או SDKs מקוריים (iOS/Android).
- הגדרת שרת SSV (כל טכנולוגיה: Node.js, Python, Go).
- בדיקות A/B למיקומים ומגבלות.
- תיעוד ותמיכה למשך חודש.
מה אתה מקבל כתוצאה
לאחר סיום, אתה מקבל:
- מיקומי Rewarded עובדים עם תזמון הצגה אופטימלי.
- אימות SSV בצד השרת עם הגנה מפני רמאות.
- תיעוד לסקריפטים והגדרות מפתח.
- גישה לקוד השרת לשינוי עצמי.
- חודש של תמיכה טכנית וייעוץ.
לוחות זמנים משוערים
אינטגרציה בסיסית עם 2-3 מיקומים ומגבלות — מיומיים. עם SSV ולוגיקת תגמול בצד השרת — מ-3 ימים. העלות מחושבת באופן אישי.
הזמן ביקורת על האינטגרציה הנוכחית שלך — נעריך את הפרויקט שלך. צור קשר לייעוץ.







