Unconfigured Ad Widget

تقليص

إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

[Unity3d][درس] عمل نظام شبكة _2_

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • [Unity3d][درس] عمل نظام شبكة _2_

    السلام عليكم و رحمة الله و بركاته

    اعود اليكم في الدرس الثاني من دروس الشبكة

    في هذا الدرس سوف نقوم بدراسة التواصل بين الجهازين و اساليبه

    و سوف نقوم بعمل مثال لتوضيح الامر

    بسم الله نبدأ:

    اولا يجب علينا التعرف على الكومبوننت 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();
                }
            }
            }
        }

    الان سوف نضيف الكومبوننت NetworkView الى الكاميرا

    وسوف نقوم بصنع لاعب بشكل بسيط

    اولا نضيف cube و نضيف كومبوننت charactercontroller و ايضا كومبوننت NetworkView ليظهر في الطرفين ثم نصنع كود جديد نسميه controller

    نضع بداخله

    كود PHP:
    using UnityEngine;
    using System.Collections;

    public class 
    controllerMonoBehaviour {
        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);
        }

    (ملاحظة : لا تسنى اضافة الـ prefab الذي صنعناه سابقا الى المتغير player , ايضا لا تنسى صنع ارضية لينزل عليها اللاعب, و قم بصنع جيم اوبجكت فارغ و اضيفه الى المتغير SpownPoint لكي يخرج منه اللاعبين فضعه في مكان مناسب )

    الان سوف تلاحظ عندما تجرب انه اذا في كل اتصال للسيرفر ينزل لاعب جديد

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

    الحل هنا هو اضافة

    كود PHP:
    if(networkView.isMine
    الى كود ال controller

    فيصبح هكذا :


    كود PHP:
    using UnityEngine;
    using System.Collections;

    public class 
    controllerMonoBehaviour {
        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

    الان قم بالتجربة , كل شيء سيكون تمام ان شاء الله

    لكن لا تنسى ان تُبقى لاعب افتراضي في اللعبة لمن يفتح السيرفر

    ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ ــــــــــــــــــــــــــ

    هنا نصل الى نهاية درسنا

    لا يزال يوجد دروس اخرى قريبا ان شاء الله

    اي ملاحظة او مشكلة او خطا ارتكبته اكتبه في رد


    تحياتي
    FaceBook
    Here

    Ask Me
    Here
    My Channel In Youtube
    Here

    ____________________________________________

    لكي تعيش عليك ان تتقن فن التجاهل باحتراف

  • #2
    حسنا انا متابعك بس ازاى اضافة الـ prefab الذي صنعناه سابقا الى المتغير player
    وما هيه SpownPoint وكيف اضيفها وشكرا

    تعليق


    • #3
      بارك الله فيك أخي الكريم
      شرح وافي و كافي
      و لكن هنالك خطأ بسيط في سكريبت connect
      كلمة transform


      كود:
      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);
          }
      }

      تعليق


      • #4
        المشاركة الأصلية بواسطة mido2000 مشاهدة المشاركة
        حسنا انا متابعك بس ازاى اضافة الـ prefab الذي صنعناه سابقا الى المتغير player
        وما هيه SpownPoint وكيف اضيفها وشكرا
        شكرا على مرورك اخي الكريم

        بالنسبة للـ prefab يمكنك اضافة واحد فارغ عن طريق الضغط بالزر الايمن في نافذة project ثم creat ثم Prefab

        البرفاب هو جيم اوبجكت فارغ يمكنك اضافة اي اوبجكت في اللعبة اليه كي تستطيع استخدامه في امور ثانية مثل instantiat

        اما ال spownpoint فهو اسم وضعته انا للمتغير , يمكنك تغييره لأي اسم , هذا شرح صور بسيط لما فعلته انا :







        المشاركة الأصلية بواسطة khaledlion مشاهدة المشاركة
        بارك الله فيك أخي الكريم
        شرح وافي و كافي
        و لكن هنالك خطأ بسيط في سكريبت connect
        كلمة transform


        كود:
        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);
            }
        }
        بارك الله فيك اخي الكريم و شكرا على مرورك و التنبيه تم التعديل
        FaceBook
        Here

        Ask Me
        Here
        My Channel In Youtube
        Here

        ____________________________________________

        لكي تعيش عليك ان تتقن فن التجاهل باحتراف

        تعليق


        • #5
          فى خطأ فى controller وانا مش غارف احله ده الخطأاضغط على الصورة لعرض أكبر. 

الإسم:	controller.jpg 
مشاهدات:	1 
الحجم:	19.4 كيلوبايت 
الهوية:	3286292

          تعليق


          • #6
            المشاركة الأصلية بواسطة mido2000 مشاهدة المشاركة
            فى خطأ فى controller وانا مش غارف احله ده الخطأ[ATTACH=CONFIG]85312[/ATTACH]
            انسخ لي نص الخطأ مع الكود حتى اشوف
            FaceBook
            Here

            Ask Me
            Here
            My Channel In Youtube
            Here

            ____________________________________________

            لكي تعيش عليك ان تتقن فن التجاهل باحتراف

            تعليق


            • #7
              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));
              }
              }
              }
              هاده هوه if(networkView.isMine

              تعليق


              • #8
                والكيوب لا يتحرك وشكرا والسيرفر شغال بس اللعبه لا تبدأ

                تعليق


                • #9
                  المشاركة الأصلية بواسطة mido2000 مشاهدة المشاركة
                  هاده هوه if(networkView.isMine
                  اخي الكود صحيح تاكد انك لم تقم بشيء خطأ او قم بنسخ الخطأ من نافذة الكونسول لي
                  FaceBook
                  Here

                  Ask Me
                  Here
                  My Channel In Youtube
                  Here

                  ____________________________________________

                  لكي تعيش عليك ان تتقن فن التجاهل باحتراف

                  تعليق


                  • #10
                    كنت ماخذ فكرة انو الموضوع اصعب بكثير
                    اشكرك علا التوضح هالمواضيع ابدا لم اتطرق لهااا
                    لا اله الا الله واشهد ان محمد رسول الله
                    اللهم اني اسألك باسمك الاعظم اللذي اذا دعيت به اجبت ان تنصر المسلمين وجندك على الظالمين
                    وتفتك باعدائك اعداء الدين

                    تعليق


                    • #11
                      المشاركة الأصلية بواسطة المناهل مشاهدة المشاركة
                      كنت ماخذ فكرة انو الموضوع اصعب بكثير
                      اشكرك علا التوضح هالمواضيع ابدا لم اتطرق لهااا
                      شكرا لمرورك اخي مبارك
                      ان شاء الله الدروس القادمة تكون افضل
                      FaceBook
                      Here

                      Ask Me
                      Here
                      My Channel In Youtube
                      Here

                      ____________________________________________

                      لكي تعيش عليك ان تتقن فن التجاهل باحتراف

                      تعليق


                      • #12
                        ما الذى يعنيه هذا (لكن لا تنسى ان تُبقى لاعب افتراضي في اللعبة لمن يفتح السيرفر) اتمنى الشر وانا اعتزر على اسئلتى الكثيره الغبيه

                        تعليق


                        • #13
                          المشاركة الأصلية بواسطة mido2000 مشاهدة المشاركة
                          ما الذى يعنيه هذا (لكن لا تنسى ان تُبقى لاعب افتراضي في اللعبة لمن يفتح السيرفر) اتمنى الشر وانا اعتزر على اسئلتى الكثيره الغبيه
                          لا اخي اسئلتك عادية
                          بس افضلك تتعلم برمجة بسيطة قبل تعلم برمجة شبكة
                          بكل الاحوال
                          اقصد بهذه العبارة
                          انه عندما استخدمنا فنكشن OnConnectedToServer التي تقوم بالعمل مرة عند كل دخول الى السيرفر
                          سوف يتولّد لاعب بكل مرة يدخل شخص
                          لكن الشخص الذي شغل السيرفر لن يكون له لاعب
                          اذا ابقي على لاعب داخل اللعبة بشكل افتراضي
                          فقط قم بسحب ال prefab يلي صنعته الى اللعبة سيظهر لاعب اتركه هكذا تكون نفذت المطلوب
                          FaceBook
                          Here

                          Ask Me
                          Here
                          My Channel In Youtube
                          Here

                          ____________________________________________

                          لكي تعيش عليك ان تتقن فن التجاهل باحتراف

                          تعليق


                          • #14
                            ابرهتنا يا ماهر جزاك الله خيرا

                            تعليق


                            • #15
                              المشاركة الأصلية بواسطة oussama23 مشاهدة المشاركة
                              ابرهتنا يا ماهر جزاك الله خيرا
                              مشكور على مرورك اخي اسامة
                              ان شاء الله تكون استفدت
                              FaceBook
                              Here

                              Ask Me
                              Here
                              My Channel In Youtube
                              Here

                              ____________________________________________

                              لكي تعيش عليك ان تتقن فن التجاهل باحتراف

                              تعليق

                              يعمل...
                              X