אנו מפתחים מערכות הישגים ולוחות תוצאות ששומרות על שחקנים באמצעות מטרות משניות ולחץ חברתי. במבט ראשון, נראה שמספיק דגל במסד הנתונים ובדיקת תנאי, אבל בפועל, אחרי שישה חודשים, מופיעים מלכודות: חוסר סנכרון של מונים לאחר התקנה מחדש של המשחק, חוסר יכולת להעניק הישגים רטרואקטיביים, וקונפליקטים בסביבות מרובות-תהליכונים. עם ניסיון של 10+ שנים ו-50+ פרויקטים מיושמים, אנו מנווטים את הבעיות הללו בשלב הארכיטקטורה.
למה הישגים קשים יותר ממה שהם נראים
בתחילת הפרויקט, הישגים נראים פשוטים: דגל במסד הנתונים, בדיקת תנאי ורישום. בפועל, אחרי שישה חודשים של פיתוח, אתה מגלה:
חוסר סנכרון של מצב המונה. הישג "הרוג 100 גובלינים" דורש מונה מתמשך שמתעדכן בכל הריגה. אם השחקן מתקין מחדש את המשחק, המונה מתאפס—ההישג הופך לבלתי ניתן להשגה, למרות שהוא מסומן כהושלם ב-Google Play / Game Center. זו בעיה קלאסית של מצב כפול: מצב מקומי ומצב פלטפורמה מתפצלים.
הישגים רטרואקטיביים. הצוות מוסיף הישג חדש שלושה חודשים לאחר ההשקה. שחקנים שכבר עמדו בתנאי לא מקבלים אותו אוטומטית. יש צורך בהליך backfill—חישוב מחדש מהסטטיסטיקות ההיסטוריות של השחקן. אם הסטטיסטיקות לא נשמרו, backfill בלתי אפשרי, ושחקנים כועסים.
מונים בטוחים לתהליכונים. בסביבה מרובת-תהליכונים (Unity עם Jobs System, לוגיקת שרת), הגדלת מונים בו-זמנית ללא פעולות אטומיות מניבה ערכים שגויים. מספר אירועים בבת אחת גורמים למונה לקפוץ ערכים. ב-90% מהמקרים, אנו רואים בעיה זו במהלך בדיקות עומס.
ארכיטקטורת מערכת הישגים
התכנית העובדת היא ארכיטקטורה מונעת-אירועים דרך AchievementService מרכזי. במקום שכל מודול משחק ידע על הישגים ויקרא ל-AchievementManager.CheckCondition(), מודולים יורים אירועים: GameEvent.EnemyKilled(enemyType, count), GameEvent.LevelCompleted(levelId, stars). ה-AchievementService נרשם לאירועים הנדרשים ומעדכן את המונים בעצמו.
כל הישג מתואר באמצעות קונפיג:
- סוג (
incremental,single,compound) - רשימת אירועים שהוא מגיב אליהם
- תנאי השלמה (lambda או ScriptableObject עם לוגיקה)
- פרס
הוספת הישג חדש פירושה קונפיג חדש, ללא שינויים בקוד המשחק.
סנכרון פלטפורמות. Google Play Games Services ו-Apple Game Center כוללים לוחות תוצאות והישגים משלהם, אבל עבודה ישירה איתם היא כואבת. ה-SDK של GPG ל-Unity עובד רק על Android, ו-Game Center רק על iOS. עבור פרויקטים חוצי-פלטפורמות, אנו משתמשים בשכבת ביניים: מסד הנתונים שלנו מאחסן את המצב הראשי, בעוד ש-SDK של הפלטפורמות מתעדכן כלוויינים. במקרה של קונפליקט (סשן לא מקוון), אנו ממזגים באמצעות עיקרון "קח מקסימום" עבור מונים מצטברים.
Achievement (video games) PlayFab ו-GameSparks מספקות מערכות הישגים מוכנות בצד השרת עם APIs—עבור F2P נייד, זה לעיתים קרובות מהיר וזול יותר מאשר backend מותאם אישית.
איך להימנע מרמאים בלוחות תוצאות?
שליחת ניקוד בצד הלקוח ללא אימות היא דרך ישירה לרמאים בראש. מינימום: הניקוד נחתם עם מפתח HMAC בצד הלקוח, והשרת מאמת את החתימה. הדרך הנכונה: השרת מחשב את הניקוד מיומני סשן המשחק; הלקוח שולח רק אירועים. אנו מיישמים אנטי-צ'יט בשתי הרמות: בדיקות שלמות build בצד הלקוח, וניטור חריגות בצד השרת (לדוגמה, קפיצה פתאומית של 300% במונה תוך 3 שניות).
לוחות תוצאות: מורכבות בקנה מידה
עבור משחק עם 1000 שחקנים מקבילים, SQLite או PostgreSQL עם ORDER BY score DESC LIMIT 100 עובדים מצוין. ב-100k+ רשומות, שאילתות ללא אינדקסים מתאימים מתחילות להאט. ב-1M+, יש צורך ב-Redis Sorted Set.
Redis ZADD leaderboard {score} {userId} + ZREVRANK leaderboard {userId} נותן הכנסה ב-O(log N) ושליפת דירוג ב-O(log N). ZREVRANGE leaderboard 0 99 WITHSCORES נותן את ה-100 הראשונים במיקרו-שניות. זהו הסטנדרט למשחקים ניידים עם קהלים גדולים.
לוחות תוצאות שבועיים ועונתיים. טבלה נפרדת (או Redis Sorted Set) לכל תקופה בתוספת משימת cron לרוטציה. ברוטציה—צילום זוכים לארכיון, חלוקת פרסים דרך תור (לא באופן סינכרוני—עם קהל גדול, חלוקת פרסים סינכרונית הורגת את השרת).
מה כלול בעבודה
| תוצר | תיאור |
|---|---|
| תיעוד API וסכמות נתונים | תיאור של אירועים, קונפיגים ונקודות קצה |
| כלי למעצב משחק | עורך קונפיגים להישגים (ממשק web או תוסף Unity/Unreal) |
| אינטגרציית פלטפורמות | GPG, Game Center, PlayFab—כולל סנכרון ומיזוג קונפליקטים |
| בדיקות עומס | בדיקת לוחות תוצאות עם 1000+ בקשות מקבילות |
| תמיכה לאחר השקה | תיקון באגים, התאמות קונפיג, ייעוץ לצוות |
שלבי פיתוח
- עיצוב סכמה—סוגי הישגים, אירועים, אחסון מצב, פלטפורמות.
- צד שרת—טבלאות/Redis, נקודות קצה API, אנטי-צ'יט.
- אינטגרציית לקוח—AchievementService, הרשמות לאירועים, UI.
- סנכרון פלטפורמות—GPG / Game Center / PlayFab.
- כלים למעצבי משחק—עורך קונפיגים להישגים.
- QA—בדיקת הישגים רטרואקטיביים, בדיקת תרחישים לא מקוונים, בדיקות עומס ללוחות תוצאות.
| היקף | לוח זמנים |
|---|---|
| הישגים מקומיים ללא שרת (נייד/קז'ואל) | 1–2 שבועות |
| הישגים מבוססי שרת + לוחות תוצאות לפלטפורמה אחת | 3–5 שבועות |
| מערכת חוצת-פלטפורמות עם אנטי-צ'יט ולוחות תוצאות עונתיים | 6–12 שבועות |
העלות נקבעת באופן אישי לאחר ניתוח ארכיטקטורת הפרויקט שלך ודרישות המדרגיות. הערך את הפרויקט שלך—צור קשר, ונספק תוכנית מותאמת לתקציב שלך.





