السلام عليكم و رحمة الله و بركاته
اعود اليكم في الدرس الثاني من دروس الشبكة
في هذا الدرس سوف نقوم بدراسة التواصل بين الجهازين و اساليبه
و سوف نقوم بعمل مثال لتوضيح الامر
بسم الله نبدأ:
اولا يجب علينا التعرف على الكومبوننت NetworkView
يمكنك اضافته من : Component > Miscellaneous > NetworkView
هذا الكومبوننت يوضع على اي اوبجكت تريده ان يكون نفسه في كلا طرفي الاتصال
يعني اذا وضعته على مكعب و شغلت اللعبة ستلاحظ المكعب في نفس الاحداثيات و نفس اللون و الحجم و كل شيء في كلا الجهازين
الان ننتقل للمثال االاول لتوضيح الامر اكثر
سنقوم في هذا المثال بعمل لاعبان يتحركان و يظهر كل منهما عند الاخر
في البداية يجب ان يكون السكربت الذي كتبناه في الدرس الماضي معك
(في حالة انك لم تشاهد الدرس الماضي هذا الرابط : http://www.maxforums.net/showthread.php?t=223538)
هذا السكربت :
الان سوف نضيف الكومبوننت NetworkView الى الكاميرا
وسوف نقوم بصنع لاعب بشكل بسيط
اولا نضيف cube و نضيف كومبوننت charactercontroller و ايضا كومبوننت NetworkView ليظهر في الطرفين ثم نصنع كود جديد نسميه controller
نضع بداخله
هذا سكربت بسيط للحركة فقط للتجربة لا داعي لشرحه
الان نضع السكربت بداخل اللاعب
و نصنع prefab فارغ و نضع اللاعب فيه
الان بعد عمل هذه الخطوات
يكون لدينا لاعب جاهز مع الحركة
الان يجب علينا اضافته للعبة عندما يدخل اي لاعب
سوف نضع امر Network.Instantiate الذي يقوم بادراج اللاعب على الشبكة ليظهر في الجهازين
لكن كيف نعلم ان اللاعب دخل الى الشبكة؟؟
يوجد فنكشن باسم OnConnectedToServer يقوم بالعمل عند كل دخول الى السيرفر
سوف نقوم بتطبيق الخطوات التي شرحناها الان في الكود connect ليصبح الكود هكذا
(ملاحظة : لا تسنى اضافة الـ prefab الذي صنعناه سابقا الى المتغير player , ايضا لا تنسى صنع ارضية لينزل عليها اللاعب, و قم بصنع جيم اوبجكت فارغ و اضيفه الى المتغير SpownPoint لكي يخرج منه اللاعبين فضعه في مكان مناسب )
الان سوف تلاحظ عندما تجرب انه اذا في كل اتصال للسيرفر ينزل لاعب جديد
ولكن لدينا هنا مشكلة : التحكم باللاعب سوف يكون من جميع الاطراف ان اللاعبين الاخرين يمكنهم التحكم بلاعبك و انت كذلك فما الحل؟
الحل هنا هو اضافة
الى كود ال controller
فيصبح هكذا :
هذا الشرط الذي اضفناه يقوم بالتعرف على من اضاف هذا اللاعب فاذا قام هذا الشخص بالضغط على ازرار الحركة سوف يتحرك اما اذا قام غيره بذلك فلن يتحرك
واذا لم تفهم شرحي انظر الى الريفرنس هنا : http://docs.unity3d.com/Documentatio...ew-isMine.html
الان قم بالتجربة , كل شيء سيكون تمام ان شاء الله
لكن لا تنسى ان تُبقى لاعب افتراضي في اللعبة لمن يفتح السيرفر
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ ــــــــــــــــــــــــــ
هنا نصل الى نهاية درسنا
لا يزال يوجد دروس اخرى قريبا ان شاء الله
اي ملاحظة او مشكلة او خطا ارتكبته اكتبه في رد
تحياتي
اعود اليكم في الدرس الثاني من دروس الشبكة
في هذا الدرس سوف نقوم بدراسة التواصل بين الجهازين و اساليبه
و سوف نقوم بعمل مثال لتوضيح الامر
بسم الله نبدأ:
اولا يجب علينا التعرف على الكومبوننت NetworkView
يمكنك اضافته من : Component > Miscellaneous > NetworkView
هذا الكومبوننت يوضع على اي اوبجكت تريده ان يكون نفسه في كلا طرفي الاتصال
يعني اذا وضعته على مكعب و شغلت اللعبة ستلاحظ المكعب في نفس الاحداثيات و نفس اللون و الحجم و كل شيء في كلا الجهازين
الان ننتقل للمثال االاول لتوضيح الامر اكثر
سنقوم في هذا المثال بعمل لاعبان يتحركان و يظهر كل منهما عند الاخر
في البداية يجب ان يكون السكربت الذي كتبناه في الدرس الماضي معك
(في حالة انك لم تشاهد الدرس الماضي هذا الرابط : http://www.maxforums.net/showthread.php?t=223538)
هذا السكربت :
كود PHP:
using UnityEngine;
using System.Collections;
public class connect : MonoBehaviour {
public string IP = "127.0.0.1";
public int Port = 25555;
void OnGUI(){
if(Network.peerType == NetworkPeerType.Disconnected){
IP = GUI.TextArea(new Rect(105,5,100,25),IP);
if(GUI.Button(new Rect(5,5,100,25),"Start Server")){
Network.InitializeServer(10,Port);
}
if(GUI.Button(new Rect(5,35,100,25),"Connect")){
Network.Connect(IP,Port);
}
}
else{
if(Network.peerType == NetworkPeerType.Client){
if(GUI.Button(new Rect(5,35,100,25),"Disconnect")){
Network.Disconnect();
}
}
if(Network.peerType == NetworkPeerType.Server){
if(GUI.Button(new Rect(5,35,100,25),"Turn off server")){
Network.Disconnect();
}
}
}
}
}
وسوف نقوم بصنع لاعب بشكل بسيط
اولا نضيف cube و نضيف كومبوننت charactercontroller و ايضا كومبوننت NetworkView ليظهر في الطرفين ثم نصنع كود جديد نسميه controller
نضع بداخله
كود PHP:
using UnityEngine;
using System.Collections;
public class controller: MonoBehaviour {
public CharacterController cc;
public float speed;
void Start(){
cc = GetComponent("CharacterController") as CharacterController;
speed = 0.1f;
}
void Update ()
{
cc.Move(new Vector3(Input.GetAxis("Horizontal")*speed,-2f,Input.GetAxis("Vertical")*speed));
}
}
الان نضع السكربت بداخل اللاعب
و نصنع prefab فارغ و نضع اللاعب فيه
الان بعد عمل هذه الخطوات
يكون لدينا لاعب جاهز مع الحركة
الان يجب علينا اضافته للعبة عندما يدخل اي لاعب
سوف نضع امر Network.Instantiate الذي يقوم بادراج اللاعب على الشبكة ليظهر في الجهازين
لكن كيف نعلم ان اللاعب دخل الى الشبكة؟؟
يوجد فنكشن باسم OnConnectedToServer يقوم بالعمل عند كل دخول الى السيرفر
سوف نقوم بتطبيق الخطوات التي شرحناها الان في الكود connect ليصبح الكود هكذا
كود PHP:
using UnityEngine;
using System.Collections;
public class connect : MonoBehaviour {
public string IP = "127.0.0.1";
public GameObject player;
public Transform SpownPoint;
public int Port = 25555;
void OnGUI(){
if(Network.peerType == NetworkPeerType.Disconnected){
IP = GUI.TextArea(new Rect(105,5,100,25),IP);
if(GUI.Button(new Rect(5,5,100,25),"Start Server")){
Network.InitializeServer(10,Port);
}
if(GUI.Button(new Rect(5,35,100,25),"Connect")){
Network.Connect(IP,Port);
}
}
else{
if(Network.peerType == NetworkPeerType.Client){
if(GUI.Button(new Rect(5,35,100,25),"Disconnect")){
Network.Disconnect();
}
}
if(Network.peerType == NetworkPeerType.Server){
if(GUI.Button(new Rect(5,35,100,25),"Turn off server")){
Network.Disconnect();
}
}
}
}
void OnConnectedToServer(){
Network.Instantiate(player,SpownPoint.position,Quaternion.identity,0);
}
}
الان سوف تلاحظ عندما تجرب انه اذا في كل اتصال للسيرفر ينزل لاعب جديد
ولكن لدينا هنا مشكلة : التحكم باللاعب سوف يكون من جميع الاطراف ان اللاعبين الاخرين يمكنهم التحكم بلاعبك و انت كذلك فما الحل؟
الحل هنا هو اضافة
كود PHP:
if(networkView.isMine)
فيصبح هكذا :
كود PHP:
using UnityEngine;
using System.Collections;
public class controller: MonoBehaviour {
public CharacterController cc;
public float speed;
void Start(){
cc = GetComponent("CharacterController") as CharacterController;
}
void Update ()
{
if(networkView.isMine){
cc.Move(new Vector3(Input.GetAxis("Horizontal")*speed,-2f,Input.GetAxis("Vertical")*speed));
}
}
}
واذا لم تفهم شرحي انظر الى الريفرنس هنا : http://docs.unity3d.com/Documentatio...ew-isMine.html
الان قم بالتجربة , كل شيء سيكون تمام ان شاء الله
لكن لا تنسى ان تُبقى لاعب افتراضي في اللعبة لمن يفتح السيرفر
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ ــــــــــــــــــــــــــ
هنا نصل الى نهاية درسنا
لا يزال يوجد دروس اخرى قريبا ان شاء الله
اي ملاحظة او مشكلة او خطا ارتكبته اكتبه في رد
تحياتي
تعليق