كل ما تحتاجه لدمج RTMPE في لعبة Unity الخاصة بك.
أضف حزمة RTMPE إلى مشروع Unity عبر Package Manager. افتح Window → Package Manager → + → Add package from git URL، أو عدّل ملف Packages/manifest.json مباشرةً.
{
"dependencies": {
"com.rtmpe.sdk": "https://github.com/Faisalzz1/unity-rtmpe-sdk.git"
}
}نصيحة: Window → RTMPE → Setup Wizard يقوم بكل الخطوات أدناه — ينشئ NetworkSettings asset، يربطه بـ NetworkManager، ويخزّن مفتاح API في خزنة بيانات نظام التشغيل.
في بوابة المطورين، أنشئ مشروعاً وانسخ مفتاح API المُولَّد بالإضافة إلى PSK ذي 64 محرفاً (يُستخدم لتشفير مفتاح API على السلك).
افتح بوابة المطورين ←كل NetworkManager يحتاج إلى ScriptableObject من نوع NetworkSettings يحدد عنوان البوابة، المنفذ، و PSK لمفتاح API. تجاوز هذه الخطوة يُبقي SDK على عنوان loopback الافتراضي ويفشل أول استدعاء لـ Connect() بصمت دون أي رسالة تشخيص.
// Project panel → right-click Assets folder
// → Create → RTMPE → Settings
//
// Inspector fields (minimum):
// Server Host : your gateway hostname (from RTMPE dashboard)
// Server Port : 7777 (UDP, default)
// Api Key Psk Hex : 64-char hex (from RTMPE dashboard)
//
// Save as e.g. Assets/RTMPESettings_Prod.assetأضف GameObject فارغاً باسم [RTMPE] NetworkManager إلى مشهد البدء، وألحق به component اسمه NetworkManager (Component → RTMPE → NetworkManager)، ثم اسحب RTMPESettings asset إلى حقل Settings. يُنفِّذ NetworkManager تلقائياً DontDestroyOnLoad().
using RTMPE.Core;
using UnityEngine;
public class GameBootstrap : MonoBehaviour
{
[SerializeField] private string _apiKey;
// اشترك في الأحداث قبل Connect() — OnConnected يُطلق بشكل متزامن
private void Awake()
{
// NetworkManager is a singleton attached to the [RTMPE] NetworkManager
// GameObject in your boot scene; its 'Settings' Inspector slot must
// reference the NetworkSettings asset created in Step 2.
NetworkManager.Instance.OnConnected += () =>
{
Debug.Log("[RTMPE] connected");
};
NetworkManager.Instance.Connect(_apiKey);
}
}أي سكربت يجب أن تكون حالته مرئية عبر الشبكة يرث من NetworkBehaviour (وليس MonoBehaviour). أضف NetworkTransform إلى الـ prefab لمزامنة الموضع والدوران بتردد 30 هرتز. لا يوجد component منفصل اسمه "NetworkObject" — NetworkBehaviour نفسه يحمل الهوية الشبكية.
using UnityEngine;
using RTMPE.Core; // NetworkBehaviour
using RTMPE.Sync; // NetworkTransform, NetworkVariable types
[RequireComponent(typeof(NetworkTransform))]
public class PlayerController : NetworkBehaviour
{
[SerializeField] private float _moveSpeed = 5f;
private NetworkVariableInt _health;
protected override void OnNetworkSpawn()
{
// Initialise NetworkVariables here — never in Awake / Start.
// 'variableId' must be unique per component (0, 1, 2 …).
_health = new NetworkVariableInt(this, variableId: 0, initialValue: 100);
}
private void Update()
{
// Only the owner reads input and moves the character. Other clients
// receive position automatically via NetworkTransform at 30 Hz.
if (!IsOwner) return;
var h = Input.GetAxis("Horizontal");
var v = Input.GetAxis("Vertical");
transform.position += new Vector3(h, 0f, v) * _moveSpeed * Time.deltaTime;
}
}بعد إطلاق OnConnected، سجّل كل prefab شبكي عبر SpawnManager.RegisterPrefab(prefabId, prefab) باستخدام نفس الـ ID على كل عميل. ثم أنشئ أو انضم لغرفة عبر مدير Rooms، وقم بـ spawn اللاعب المحلي من حدث OnRoomJoined.
using RTMPE.Core;
using RTMPE.Rooms;
using UnityEngine;
public class GameManager : MonoBehaviour
{
[SerializeField] private GameObject _playerPrefab;
[SerializeField] private uint _playerPrefabId = 1; // identical on every client
private void Start()
{
var net = NetworkManager.Instance;
net.OnConnected += () =>
{
// Register prefabs after connect; SpawnManager is recreated on
// every Connect() / Reconnect() so registrations live here, not
// in Awake.
net.Spawner.RegisterPrefab(_playerPrefabId, _playerPrefab);
net.Rooms.CreateRoom(new CreateRoomOptions
{
Name = "My Room", MaxPlayers = 4, IsPublic = true,
});
};
net.Rooms.OnRoomJoined += room =>
{
net.Spawner.Spawn(_playerPrefabId, Vector3.up, Quaternion.identity);
};
}
}علّم أي method عام في NetworkBehaviour بـ [RtmpeRpc(target)] لجعلها قابلة للاستدعاء عبر الشبكة. استدعِها من المالك عبر NetworkBehaviour.RPC("MethodName", args…). الأهداف: All (الافتراضي)، Others، Server، AllBuffered (يُعاد تشغيلها للمنضمين متأخراً).
using RTMPE.Core;
using RTMPE.Rpc;
public class WeaponSystem : NetworkBehaviour
{
// Owner calls. All clients (including sender) execute the body.
[RtmpeRpc(RpcTarget.All)]
public void FireRpc(Vector3 origin, Vector3 direction)
{
// VFX, sound, hit-scan — runs on every client.
}
public void Fire(Vector3 origin, Vector3 direction)
{
if (!IsOwner) return;
RPC(nameof(FireRpc), origin, direction); // dispatched over the network
}
}كل عنصر أدناه هو member عام في RTMPE SDK 1.1.0. الأعضاء الداخلية (internal) محذوفة عمداً — كود المستخدم لا يستطيع استدعاءها.
| Namespace | الفئة | الـ Method / الخاصية / الحدث | الوصف |
|---|---|---|---|
RTMPE.Core | NetworkManager | Instance | Singleton للوصول إلى NetworkManager النشط. يجب أن يكون الـ component موجوداً في المشهد مسبقاً. |
RTMPE.Core | NetworkManager | Connect(apiKey) | فتح الاتصال بالبوابة باستخدام مفتاح API المُمرَّر. يُشفَّر المفتاح بـ PSK المُهيأ قبل الإرسال. |
RTMPE.Core | NetworkManager | Disconnect() | قطع الاتصال بالبوابة بأمان. يرسل حزمة Disconnect ويوقف خيط الشبكة. |
RTMPE.Core | NetworkManager | IsConnected | صحيح بينما العميل لديه جلسة نشطة مع البوابة (بعد المصافحة وقبل قطع الاتصال). |
RTMPE.Core | NetworkManager | IsMasterClient | صحيح عندما يحمل العميل المحلي دور master client للغرفة الحالية (ترقية FIFO عند مغادرة المالك السابق). |
RTMPE.Core | NetworkManager | LocalTick | عداد دورة المحاكاة بتردد 30 هرتز monotonic. يُحرّك إرسال input والمصالحة (reconciliation). |
RTMPE.Core | NetworkManager | Rooms | مدخل RoomManager — إنشاء، انضمام، مغادرة، وسرد الغرف. |
RTMPE.Core | NetworkManager | Spawner | مدخل SpawnManager — تسجيل الـ prefabs و spawn الكائنات الشبكية. يُعاد إنشاء instance جديدة في كل Connect()/Reconnect(). |
RTMPE.Core | NetworkManager | Scene | مدخل NetworkSceneManager — تحميل المشاهد المنسَّق عبر جميع عملاء الغرفة. |
RTMPE.Core | NetworkManager | OnConnected | حدث — يُطلق فور اكتمال المصافحة ومعالجة SessionAck. |
RTMPE.Core | NetworkManager | OnDisconnected | حدث(DisconnectReason) — يُطلق بعد إنهاء الاتصال لأي سبب. |
RTMPE.Core | NetworkBehaviour | IsOwner | صحيح عندما أنشأ هذا العميل الـ spawn أو يحمل الملكية بعد transfer. المالك فقط يكتب قيم NetworkVariable أو يستدعي RPCs التي تتطلب الملكية. |
RTMPE.Core | NetworkBehaviour | IsSpawned | صحيح بين OnNetworkSpawn و OnNetworkDespawn. استخدمها لحماية وصول الحالة في Update(). |
RTMPE.Core | NetworkBehaviour | OnNetworkSpawn() | protected virtual — يُستدعى مرة عندما يُسجَّل الكائن على الشبكة. هيّئ NetworkVariables هنا — أبداً في Awake/Start. |
RTMPE.Core | NetworkBehaviour | OnNetworkDespawn() | protected virtual — يُستدعى مرة قبل إزالة الكائن من الشبكة. ألغِ الاشتراك من NetworkVariable.OnValueChanged هنا. |
RTMPE.Core | NetworkBehaviour | RPC(name, args) | إرسال method مُعلَّمة بـ [RtmpeRpc] عبر الشبكة من المالك. اسم الـ method هو الاسم الحرفي في C# (استخدم nameof() للسلامة). |
RTMPE.Rooms | RoomManager | CreateRoom(options) | إنشاء غرفة جديدة والانضمام إليها تلقائياً عند النجاح. يُطلق OnRoomCreated ثم OnRoomJoined. |
RTMPE.Rooms | RoomManager | JoinRoom(roomId) | الانضمام لغرفة موجودة عبر UUID الخاص بها. |
RTMPE.Rooms | RoomManager | JoinRoomByCode(code) | الانضمام لغرفة موجودة عبر رمز دعوة من 6 محارف (أبجدي رقمي بأحرف كبيرة). |
RTMPE.Rooms | RoomManager | LeaveRoom() | مغادرة الغرفة الحالية. يُطلق OnRoomLeft عند النجاح. |
RTMPE.Rooms | RoomManager | ListRooms(publicOnly) | طلب قائمة الغرف. publicOnly=true يعيد فقط الغرف ذات IsPublic=true. تصل النتيجة عبر OnRoomListReceived. |
RTMPE.Rooms | RoomManager | OnRoomJoined | حدث(RoomInfo) — يُطلق بعد نجاح CreateRoom أو JoinRoom. |
RTMPE.Rooms | RoomManager | OnPlayerJoined | حدث(PlayerInfo) — يُطلق عند انضمام لاعب آخر للغرفة الحالية. |
RTMPE.Core | SpawnManager | RegisterPrefab(id, prefab) | تسجيل prefab مقابل prefabId ثابت من نوع u32. يجب أن يسجل كل عميل نفس الـ prefabId لنفس الـ prefab حتى تتطابق حزم spawn. |
RTMPE.Core | SpawnManager | Spawn(id, position, rotation) | إنشاء نسخة من prefab مُسجَّل سابقاً عند الموضع والدوران المُعطى. يعيد NetworkBehaviour المُنشَأ، أو null عند الفشل. |
RTMPE.Core | SpawnManager | Despawn(objectId) | تدمير كائن شبكي عبر objectId من نوع u64. يقتصر على المالك. |
RTMPE.Sync | NetworkTransform | MarkClean() | تسجيل الـ transform الحالي كأساس للإرسال بحيث يكبح الـ tick التالي التحديثات المكررة. |
RTMPE.Sync | NetworkVariable<T> | Value | قراءة أو تعيين القيمة المُكرَّرة. الكتابة للمالك فقط؛ يرى العملاء البعيدون التغيير عبر OnValueChanged في الـ tick التالي. |
RTMPE.Sync | NetworkVariable<T> | OnValueChanged | حدث(oldValue, newValue) — يُطلق على كل عميل (بما فيهم المالك) عند تغير Value. اشترك في OnNetworkSpawn، وألغِ الاشتراك في OnNetworkDespawn. |
RTMPE.Rooms | NetworkSceneManager | LoadScene(name, mode) | توجيه جميع عملاء الغرفة الحالية لتحميل المشهد المُسمَّى. يقتصر على master client. |
RTMPE.Rooms | NetworkSceneManager | ReportReady() | إبلاغ الخادم بأن هذا العميل أنهى تحميل المشهد الحالي. يُحرّك عداد الجاهزية على مستوى الغرفة. |
RTMPE.Rooms | NetworkSceneManager | OnAllPlayersSceneLoaded | حدث(sceneName) — يُطلق عندما يبلّغ كل عملاء الغرفة عن جاهزيتهم لنفس اسم المشهد. |
RTMPE.Rooms | InterestManager | TrackedTransform | Transform يتم أخذ موضعه في العالم وإرساله إلى البوابة لتصفية الاهتمام (area-of-interest). |
RTMPE.Rooms | InterestManager | ReceiveFilterRadius | نصف قطر التصفية من جهة الاستقبال (وحدات العالم). 0 يعطل التصفية ويستقبل العميل كل تحديثات الحالة. |
RTMPE.Rpc | RtmpeRpcAttribute | [RtmpeRpc(target)] | تُعلّم method عاماً في فئة ترث NetworkBehaviour لتجعلها قابلة للاستدعاء عبر الشبكة كـ RPC. الافتراضي هو RpcTarget.All. |
RTMPE.Rpc | RpcTarget | All / Others / Server / AllBuffered | الجمهور المُستهدَف لـ [RtmpeRpc]: All (يشمل المرسل)، Others (يستثنيه)، Server (الخادم فقط)، AllBuffered (يشمل المنضمين متأخراً عبر buffer إعادة التشغيل في الخادم). |
افتح Window → Package Manager → RTMPE SDK → Samples لاستيراد أي من العيّنات المرفقة إلى مشروعك.
SDK مفتوح المصدر ويُوزَّع كحزمة Unity عبر workflow اسمه publish-unity-sdk-mirror في GitHub Actions على كل push إلى main.