الشبكات في UNET Low Level API الدرس الأول

في هذا الموضوع سوف اغطي unity networking low level api
في ال high level api كان هناك كلاسس اسمه NetworkManager وهو من ينظم الاتصال سواء بالنسبة لل server او ال client غير ذلك كان يقوم بتنظيم كائنات الشبكة و ارسال الأوامر للاعبين والتزامن ومجال الرؤية … الخ
لكن في ال low level الامر بسيط جدا هناك فقط server و clients ليس هناك كائتات او تزامن او اشعارات في حال غادر لاعب او اتصل لاعب .
والطريقة الوحيدة للتخاطب بين اللاعب والخادم عن طريق رسائل network messages كما سوف نرى .

انشاء ال server

NetworkServer هو ال class المسؤول عن ال server ولايمكن عمل instance له فهو static class وكخطوة بسيطة بامكانك عمل الخادم بسطر واحد فقط

NetworkServer.Listen(port_number);//ip adress is 127.0.0.1

or 

NetworkServer.Listen(ip_adress,port_number);

وفي حال نجح او لا بامكانك التاكد عن طريق السطر التالي

NetworkServer.active //true if it success

في حال كانت اللعبة عال WebGL فعليك تفعيل ال WebSocket

NetworkServer.useWebSockets

وفي حال ارد اغلاق ال server وقطع جميع الاتصالات استدعي الامر Shutdown .

 

انشاء ال Client

بالنسبة لل client ايضا الاتصال بال server يكون باستخدام سطر واحد فقط

NetworkClient myClient = new NetworkClient();
myClient.Connect(ip_adress, port_number);

حتى تحصل على تنبيه في حال نجح الاتصال قم باضافة امر واحد ايضا قبل الامر Connect

NetworkClient myClient = new NetworkClient();
myClient.RegisterHandler(MsgType.Connect, (NetworkMessage message) => { print("connect to server"); });
myClient.Connect(ip_adress, port_number);

واذا ما اردت ان تتاكد باستمرار انك مازلت متصل

myClient.isConnected;//true mean is connected

وفي حال اردت الحصول على تنبيه في حال قطع الاتصال بال server

myClient.RegisterHandler(MsgType.Disconnect, (NetworkMessage message) => { print("disconnect from server"); });

قد يكون لديك في التطبيق أكثر من client للوصول اليهم جميعا

NetworkClient.allClients

وفي حال اردت قطع الاتصال من خلال ال client

NetworkClient.allClients[0].Disconnect();//no disconnect message sent to client unity 2017 client didnt deleate from NetworkClient.allClients
NetworkClient.allClients[0].connection.Disconnect();

او للانتها من استخدام ال client وقطع الاتصال وحذفه من قائمة NetworkClient.allClients

NetworkClient.allClients[0].Shutdown();

التعامل مع ال clients من خلال ال server

للحصول على تنبيهات في حال اتصل لاعب او انفصل لاعب

NetworkServer.RegisterHandler(MsgType.Connect, (NetworkMessage message) => { 
      print("client connect to server");
 });

NetworkServer.RegisterHandler(MsgType.Disconnect, (NetworkMessage message) => { 
      print("client disconnect from server"); 
});

للوصول الى جميع الاتصالات (احرص عند المرور على كل اتصال التاكد ان قيمته لا تساوي null حسب تجربة unity 2017.)

NetworkServer.connections

اللاعبين المتصلين يتم حفظهم في ال server على شكل مجومعة كائنات من الكلاسس NetworkConnection (هو كلاسس يمثل الاتصال من اللاعب للخادم او العكس )  وعن طريقه يمكن معرفة عنوات ال ip للاعب او قطع الاتصال عنه او مراسلته عن طريقها … الخ

foreach(NetworkConnection conn in NetworkServer.connections)
{
       if (conn != null)
      {
          print(conn.address);
          print(conn.isReady);
          print(conn.isConnected);
          conn.Disconnect();//قطع اتصال اللاعب
      }
 }

ملاحظة : في NetworkClient يوجد كائن وحيد NetworkConnection ومحفوظ في المتغير connection ويمثل الاتصال من اللاعب الى الخادم .

ولتغلق الاتصال على جميع اللاعبين من خلال ال server

NetworkServer.DisconnectAll()//قطع جميع اتصالات اللاعبين

تخصيص الكلاسس NtworkConnection

بامكانك تخصيص NetworkConnection بشكل اكثر وذلك بالوراثة منه بحيث تسمح له بتخزين بعض معلومات اللاعب مثال ذلك

public class PlayerConnection: NetworkConnection {

    public string PlayerName, PlayerID, Data;
    public int State;
    public List<string> Friends, Channels;

}

 Ready State

هذا الجزء يختص بال high level ولكن لا مانع ان نغطيه في هذا الموضوع
في حال كان اللاعب في حال الجهوزية (ready state) فانه سوف يتلقى اوامر ال spawn و ال commands وال يتزامن مع كائنات الشبكة … الخ
بينما الرسائل من والى السيرفر لا تحتاج منك ان تكون في حالة جهوزية .
ولكي تكون في هذه الحالة على السيرفر ان ينفذ الامر التالي

NetworkServer.SetClientReady(NetworkConnection)// ادخل اتصال اللاعب لوضعه في حالة الجهوزية

ولكنك لا تريد ان تكون في حالة جهوزية الا بعد ان تخبر السيرفر انك مستعد للعب فاليك الخطوات

//in client program
ClientScene.Ready(client.connection);

// in server program
NetworkServer.RegisterHandler(MsgType.Ready, (NetworkMessage message) => {
        NetworkServer.SetClientReady(message.conn); 
});

وفي حال قرر ال server ان اللاعب غير جاهز

//in client program
client.RegisterHandler(MsgType.NotReady, (NetworkMessage message) => { 
      print("iam not ready"); 
});

// in server program
NetworkServer.SetClientNotReady(NetworkConnection);

الى هنا ينتهي الدرس الأول في unity networking low level