שילוב Netcode for GameObjects למולטיפלייר נייד (Unity)
אנו משלבים את Netcode for GameObjects (NGO) למולטיפלייר נייד ב-Unity. עם ניסיון של למעלה מ-5 שנים ו-30+ פרויקטי מולטיפלייר שהושלמו, אנו משיגים בעקביות פריסה מהירה ב-30% מפתרונות מותאמים אישית. NGO הוא הפתרון הרשתי הרשמי של Unity, המשולב עמוק עם Unity Gaming Services: Relay, Lobby ו-Matchmaker עובדים ישירות מהקופסה. עבור אפליקציית הנייד שלך, זה אומר התחלה מהירה ללא צורך בהגדרת תשתית שרת. בהשוואה ל-Mirror, NGO מקצר את זמן פיתוח ה-MVP בחצי ומפחית עלויות שרת ב-40% באמצעות Relay מובנה.
הגדרת NetworkManager ו-Relay למשחקי נייד
NGO דורש NetworkManager עם transport מוגדר. לנייד, אנו ממליצים על UnityTransport עם RelayServerData — Unity Relay מעביר תעבורת UDP דרך השרתים שלו, עוקף NAT ללא שרת ייעודי:
async Task StartHost()
{
var allocation = await RelayService.Instance.CreateAllocationAsync(maxPlayers: 4);
var joinCode = await RelayService.Instance.GetJoinCodeAsync(allocation.AllocationId);
var relayServerData = new RelayServerData(allocation, "udp");
NetworkManager.Singleton.GetComponent<UnityTransport>()
.SetRelayServerData(relayServerData);
NetworkManager.Singleton.StartHost();
// joinCode передаём в Lobby для других игроков
}ה-async Task StartHost() { var allocation = await RelayService.Instance.CreateAllocationAsync(maxPlayers: 4); var joinCode = await RelayService.Instance.GetJoinCodeAsync(allocation.AllocationId); var relayServerData = new RelayServerData(allocation, "udp"); NetworkManager.Singleton.GetComponent<UnityTransport>() .SetRelayServerData(relayServerData); NetworkManager.Singleton.StartHost(); // joinCode передаём в Lobby для других игроков } הוא מחרוזת של 6 תווים שלקוחות משתמשים בה כדי להתחבר דרך joinCode. זה מבטל את הצורך ב-IP ציבורי ל-P2P או בשרת ייעודי ללובי קטן. ללא Relay, NAT חוסם עד 40% מהמשתמשים הפוטנציאליים.
NetworkVariable כבסיס לסנכרון
JoinAllocationAsync הוא משתנה טיפוסי עם סנכרון אוטומטי. השרת כותב, הלקוחות קוראים. אנו משתמשים בתבנית זו בכל הפרויקטים: בריאות, ניקוד, מצבי מתג:
public class PlayerState : NetworkBehaviour
{
private NetworkVariable<int> _health = new NetworkVariable<int>(100, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server);
public override void OnNetworkSpawn()
{
_health.OnValueChanged += OnHealthChanged;
}
private void OnHealthChanged(int previous, int current)
{
healthUI.SetValue(current);
}
[ServerRpc]
public void TakeDamageServerRpc(int damage, ServerRpcParams rpcParams = default)
{
_health.Value = Mathf.Max(0, _health.Value - damage);
}
}NetworkVariable<T> — רק השרת כותב. public class PlayerState : NetworkBehaviour { private NetworkVariable<int> _health = new NetworkVariable<int>( 100, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server ); public override void OnNetworkSpawn() { _health.OnValueChanged += OnHealthChanged; } private void OnHealthChanged(int previous, int current) { healthUI.SetValue(current); } [ServerRpc] public void TakeDamageServerRpc(int damage, ServerRpcParams rpcParams = default) { _health.Value = Mathf.Max(0, _health.Value - damage); } } — רק הבעלים של האובייקט כותב. עבור חיזוי בצד הלקוח, הבעלים כותב מקומית, אך השרת הוא סמכותי ויכול לבצע rollback. בפרויקט אחד, זה הפחית את צריכת הרשת ב-50% על ידי הפחתת תדירות RPC.
NetworkBehaviour ובעלות
NGO מבדיל בקפדנות: NetworkVariableWritePermission.Server, NetworkVariableWritePermission.Owner, Owner, IsServer. IsClient עבור האובייקט הנשלט על ידי לקוח זה. טעות נפוצה היא לא לבדוק IsHost ב-IsOwner, מה שגורם לכל הלקוחות לעבד קלט עבור כל השחקנים. העברת בעלות דרך IsOwner = true שימושית עבור פריטי איסוף.
מה כלול בעבודה
אנו מספקים:
- קוד מקור לשילוב NGO עם Relay, Lobby, NetworkVariable.
- הגדרת סשן רקע ל-iOS/Android.
- אופטימיזציית תעבורה (batching, ticks, דחיסה).
- תיעוד על API ותהליך העדכון.
- הדרכת צוות (שעתיים אונליין).
- תמיכה בפריסה ל-App Store ו-Google Play.
השוואת NGO מול Mirror לפרויקטי נייד
| קריטריון | Netcode for GameObjects | Mirror |
|---|---|---|
| שילוב Relay | מובנה | דורש הגדרה ידנית |
| תמיכה ברקע בנייד | כן, דרך OnApplicationPause | לא, דורש עבודה מותאמת |
| פינג ממוצע (4 שחקנים) | 50–80 אלפיות השנייה דרך Relay | 60–100 אלפיות השנייה דרך שרת ייעודי |
| זמן פיתוח MVP | 1–2 שבועות | 3–4 שבועות |
Boss Room כהתייחסות
Unity פרסמה את Boss Room — פרויקט לדוגמה על NGO עם co-op מלא לנייד. הוא מיישם: סנכרון פעולה-אנימציה, anticipation (הלקוח מנגן אנימציה לפני אישור השרת), ותנועה עם סמכות לקוח ותיקון שרת. זהו המקור הטוב ביותר לתבניות NGO — הורד מ-GitHub לפני כתיבת קוד משלך.
בעיות מולטיפלייר נייד נפוצות ופתרונות NGO
| בעיה | פתרון NGO |
|---|---|
| חביון בנייד | הורדת קצב ticks ל-15 הרץ |
| אובדן חיבור ברקע | טיפול ב-OnApplicationPause + reconnect |
| בעלות על מספר שחקנים | שימוש ב-ChangeOwnership עם colliders |
Lobby ו-Matchmaking
var options = new CreateLobbyOptions
{
IsPrivate = false,
Data = new Dictionary<string, DataObject>
{
{ "GameMode", new DataObject(DataObject.VisibilityOptions.Public, "deathmatch") },
{ "Map", new DataObject(DataObject.VisibilityOptions.Public, "forest") }
}
};
var lobby = await LobbyService.Instance.CreateLobbyAsync("My Lobby", 4, options);Lobby SDK מאחסן מטא-דאטה, סינון דרך IsOwner. Heartbeat דרך Update — בלעדיו, הלובי נמחק לאחר 30 שניות.
ניואנסים לנייד
רקע. קרא ל-networkObject.ChangeOwnership(clientId) ב-var options = new CreateLobbyOptions { IsPrivate = false, Data = new Dictionary<string, DataObject> { { "GameMode", new DataObject(DataObject.VisibilityOptions.Public, "deathmatch") }, { "Map", new DataObject(DataObject.VisibilityOptions.Public, "forest") } } }; var lobby = await LobbyService.Instance.CreateLobbyAsync("My Lobby", 4, options); ב-iOS — אחרת חיבור ה-Relay נתקע ולא מתאושש בחזרה. ב-QueryFilter — קרא ל-LobbyService.Instance.SendHeartbeatPingAsync שוב עם ה-joinCode השמור.
Batching. NGO מאגד הודעות כברירת מחדל. NetworkManager.Singleton.Shutdown() קובע את קצב ה-ticks (30-60 הרץ). למשחקים מבוססי תורות, ניתן להוריד את ה-tick ל-10 הרץ — פחות אגודות, פחות תעבורה. בפרויקט אחד, הורדנו את ה-tick ל-15 הרץ, וחסכנו 35% תעבורה לכל סשן.
גרסאות. OnApplicationPause(true) + OnApplicationPause(false) — בעת עדכון האפליקציה, לקוחות ישנים לא יתחברו לשרתים חדשים. בנייד, יש לבדוק את גרסת הלקוח לפני תחילת סשן.
למה אנו בוחרים ב-NGO על פני Mirror
NGO מציע חיסכון של 30% בזמן פריסה, Relay ו-Lobby מובנים, ותמיכה רשמית של Unity. בפרויקטים מסחריים, זה מפחית סיכונים ומאיץ את זמן היציאה לשוק.
ניסיון ולוחות זמנים
אנו צוות של מפתחי נייד עם ניסיון של למעלה מ-5 שנים ו-10 מהנדסים. השלמנו 30+ פרויקטי מולטיפלייר על Unity — מדו-קרבים היפר-קז'ואליים לאסטרטגיות תחרותיות. שילוב NGO הוא הפרקטיקה היומיומית שלנו.
שילוב NGO בסיסי עם Relay, Lobby ו-NetworkVariable ל-2–4 שחקנים: 1–2 שבועות (החל מ-$5,000). מערכת מלאה עם חיזוי לקוח, matchmaking ואופטימיזציה לנייד: 1.5–2.5 חודשים ($15,000–$30,000). המחיר מחושב באופן אישי — צור קשר כדי להעריך את הפרויקט שלך. קבל ייעוץ לפרויקט שלך.
הזמן מולטיפלייר עם Netcode for GameObjects — קבל פתרון turnkey אמין עם תאימות מובטחת ל-App Store ו-Google Play.







