תארו לעצמכם: משחק ה-Unity הנייד שלכם, שילבתם את Photon, אבל כשעוברים מ-Wi-Fi ל-4G החיבור נופל והשחקנים נזרקים מהחדר. בעיה מוכרת? אנחנו פותרים אותה ברמת הקוד: מגדירים playerTtl, reconnect וסנכרון ידני כך שהתעבורה לא תתבזבז. הרבה מפתחים עושים את אותה טעות: מסתמכים על רכיבי PhotonTransformView ברירת המחדל, מה שמוביל לתעבורה מוגזמת ולבעיות חיבור מחדש. אנחנו מציעים גישה מוכחת שמפחיתה תעבורה פי 3–5 ומספקת חיבורים יציבים במכשירים ניידים. ב-5 שנות עבודה עם Photon, השלמנו 15+ פרויקטים למשחקי מובייל — מלובי פשוטים ועד משימות מורכבות עם matchmaking. אם אתם רוצים להימנע מבעיות טיפוסיות ולחסוך בתעבורה, צרו קשר לשילוב Photon במשחק שלכם.
איך לסנכרן אובייקטים ב-Photon בצורה נכונה?
PhotonView הוא רכיב הסנכרון המרכזי. כל אובייקט רשתי מקבל ViewID. סנכרון מיקום וסיבוב דרך PhotonTransformView הוא ברירת המחדל — זה עובד, אבל שולח עדכונים בכל FixedUpdate, גם אם האובייקט לא זז.
הגישה הנכונה: ליישם IPunObservable.OnPhotonSerializeView עם שליטה ידנית על שליחת נתונים:
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) {
if (stream.IsWriting) {
// Отправляем только если изменилось значимо
if (Vector3.Distance(_lastSentPosition, transform.position) > 0.01f) {
stream.SendNext(transform.position);
stream.SendNext(transform.rotation);
_lastSentPosition = transform.position;
}
} else {
_networkPosition = (Vector3)stream.ReceiveNext();
_networkRotation = (Quaternion)stream.ReceiveNext();
}
}בצד הלקוח, ה-public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.IsWriting) { // Отправляем только если изменилось значимо if (Vector3.Distance(_lastSentPosition, transform.position) > 0.01f) { stream.SendNext(transform.position); stream.SendNext(transform.rotation); _lastSentPosition = transform.position; } } else { _networkPosition = (Vector3)stream.ReceiveNext(); _networkRotation = (Quaternion)stream.ReceiveNext(); } } שהתקבל לא מוחל ישירות — אנחנו מבצעים אינטרפולציה דרך _networkPosition או Vector3.MoveTowards באמצעות זמן החבילה מ-Lerp. כפי שמצוין ב-תיעוד Photon, גישה זו ממזערת תעבורת רשת מבלי לפגוע בחלקות.
השוואת שיטות סנכרון:
| שיטה | תעבורה (חבילות/שנייה) | השהיה | פשטות |
|---|---|---|---|
| PhotonTransformView | 20 חבילות (ברירת מחדל) | נמוכה | גבוהה |
| IPunObservable (ידני) | 1–2 חבילות (רק בעת שינוי) | בינונית | בינונית |
סנכרון ידני מפחית תעבורה פי 3–5. למשחקי מובייל זה קריטי כי Photon מחויב לפי CCU.
איך RPC עובד ומתי להשתמש בו?
PhotonMessageInfo.SentServerTime — לאירועים שחייבים להגיע בוודאות: נזק, מוות, איסוף פריט. photonView.RPC שולח לכולם בחדר כולל השולח. RpcTarget.All שולח לכולם חוץ ממנו.
טעות נפוצה: שימוש ב-RPC לעדכוני מיקום. RPC הוא אמין (התנהגות דמוית TCP), מוסיף תקורה של אישורי קבלה. למיקומים — RpcTarget.Others + PhotonNetwork.SendRate; לאירועים חשובים — RPC.
OnPhotonSerializeView ברירת המחדל היא 20, PhotonNetwork.SendRate היא 10. למובייל, איזון בין תעבורה לחלקות: 15/10.
חיבור וחדרים
PhotonNetwork.ConnectUsingSettings(); // использует PhotonServerSettings asset
void OnConnectedToMaster()
{
PhotonNetwork.JoinRandomOrCreateRoom(
expectedCustomRoomProperties: null,
expectedMaxPlayers: 4,
matchingType: MatchmakingMode.FillRoom,
typedLobby: null,
sqlLobbyFilter: null,
createIfNotFound: true
);
}SerializationRate — מערך של מפתחות הנראים בלובי לסינון. אל תעבירו הכל למאפייני לובי: רק מה שמסונן (אזור, מצב משחק, מפה).
למה שחקנים מתנתקים בעת שינוי רשת?
שינוי רשת. ה-SDK של Photon תומך ב-PhotonNetwork.ConnectUsingSettings(); // использует PhotonServerSettings asset void OnConnectedToMaster() { PhotonNetwork.JoinRandomOrCreateRoom( expectedCustomRoomProperties: null, expectedMaxPlayers: 4, matchingType: MatchmakingMode.FillRoom, typedLobby: null, sqlLobbyFilter: null, createIfNotFound: true ); } — אבל רק אם לחדר יש RoomOptions.CustomRoomPropertiesForLobby. ברירת המחדל היא PhotonNetwork.ReconnectAndRejoin(), השחקן נחשב מנותק מיד. למובייל: הגדירו playerTtl (10 שניות לחיבור מחדש).
iOS ברקע. כשעוברים לרקע, iOS מנתק באגרסיביות חיבורי רשת. Photon יתנתק תוך 5–10 שניות. למשחקים שבהם זה קריטי — השתמשו ב-playerTtl = 0 (בזהירות, אפל עלולה לדחות) או ניתוק אלגנטי.
תעבורה. Photon Realtime מחויב לפי CCU (משתמשים בו-זמנית). 20 CCU בחינם. בעת שילוב, כדאי להוסיף Photon Dashboard לניטור — אפשר לראות מספר הודעות, בתים, שיאים. אנחנו כוללים בעבודה שלנו הגדרת Photon Dashboard ואופטימיזציית קוד להפחתת תעבורה ב-30–50%.
טעויות טיפוסיות בשילוב Photon במכשירים ניידים
- חוסר playerTtl — שחקנים עוזבים את החדר מיד בניתוק זמני.
- שימוש ב-PhotonTransformView לכל האובייקטים — תעבורה גבוהה שלא לצורך.
- קריאות RPC תכופות למיקומים — מגביר השהיה ועומס.
- התעלמות מהגדרות SendRate ו-SerializationRate — אפשר להוריד ללא פגיעה באיכות.
קל לתקן את הטעויות האלה במהלך הפיתוח. הזמינו ביקורת על הפרויקט שלכם כדי לזהות אותן לפני השחרור.
מה כוללת העבודה שלנו לשילוב Photon?
- ביקורת על היישום הקיים (אם יש)
- הגדרת SDK של Photon וקונפיגורציה (אזורים, חדרים, TTL)
- יישום סנכרון דרך IPunObservable (ניהול תעבורה ידני)
- שילוב matchmaking עם מאפיינים מותאמים אישית
- הגדרת RPC ואירועים אמינים
- אופטימיזציה למכשירים ניידים (חיבור מחדש, תעבורה, רקע)
- בדיקות על 10+ מכשירים אמיתיים ברשתות שונות
- מתן תיעוד ותמיכה לאחר הפריסה
לוח זמנים ועלות
שילוב בסיסי של Photon Realtime עם חדרים, סנכרון מיקום ו-RPC: בין 3 ל-7 ימים. מערכת מלאה עם matchmaking, מאפיינים מותאמים אישית ואופטימיזציה למובייל: בין 2 ל-3 שבועות. העלות מחושבת באופן אישי — נעריך את הפרויקט שלכם תוך יום אחד.
מוכנים לדון בפרטים? צרו קשר לייעוץ והערכה מדויקת. פנו אלינו לשילוב Photon אמין במשחק הנייד שלכם.







