Unconfigured Ad Widget

تقليص

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

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

[تجربة] ذكاء إصطناعي للعدو

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

  • [تجربة] ذكاء إصطناعي للعدو

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

    في محاولة لتطبيق ذكاء اصطناعي للعدو لتتبع اللاعب كانت هذه هى النتيجة

    http://www.youtube.com/watch?v=1o1O3aMtP7k

    سعيد باستطاعتى تنفيذها وفهم الالية وتحديد المسار الاقرب للاعب , وهذه الطريقة يمكن تنفيذها على بيئة اللعبة اى كانت ولكني استخدمت بيئة بسيطة للتطبيق
    الشرح من احد دروس السلسلة الجميلة
    http://www.youtube.com/playlist?list...eature=g-all-a

    كما يظهر فى الجانب الايسر من الفيديو يوجد ارضيات خضراءواللتى لا تظهر اثناء اللعب وهى عبارة عن تحديد للمسار المسموح للعدو السير فيها
    والمكعبات الحمراء هى كأبواب للمناطق الخضراء وهى التى تربط القطع الخضراء ببعضها وعن طريقها يتم احتساب الطريق الاقرب الى اللاعب

    السكربت الرئيسى
    يحتوى على تجميع البيانات عن المسارات وتحديد بعد كل منطقة وتخزينها
    كود:
    #pragma strict
    
    var cells = new Array();       
    var cellsList = new Array();    
    var nearCells = new Array();    
    var waitForGetCells : float = 2;
    var patheInProgress : boolean = true;
    var stage : int = 1;
    
    function Awake() {
        cells = GameObject.FindGameObjectsWithTag('AIpathCell');
        cellsList.length = cells.length;
    }
    
    function Update() {
    
        if(patheInProgress && waitForGetCells <= 0)
        {
            // set stage 1
            for(var nearCell : GameObject in nearCells)
            {
                for(var i = 0; i < cells.length; i++)
                {
                    if(cells[i] == nearCell)
                        cellsList[i] = stage;
                }
            }
            
            // set other stages
            for (stage = 2; stage <= cells.length; stage++)
            {
                for (i = 0; i < cells.length; i++)
                {
                    if (cellsList[i] == stage - 1)
                    {
                        var cell = cells[i] as GameObject;
                        for (var checkDoor : GameObject in cell.GetComponent(AIpathCell).links)
                        {
                            if (checkDoor != gameObject)
                            {
                                for (var checkCell : GameObject in checkDoor.GetComponent(AIpathLink).nearCells)
                                {
                                    for (var j : int = 0; j <= cells.length - 1; j++)
                                    {
                                        if (cells[j] == checkCell && cellsList[j] == null)
                                            cellsList[j] = stage;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            
            patheInProgress = false;
        }
        else
            waitForGetCells -= 1;
    }
    
    function OnTriggerEnter(other : Collider) {
        if(other.name == 'cell')
            nearCells.Add(other.gameObject);
    }

    سكربت العدو

    كود:
    #pragma strict
    
    var currentCell : GameObject;
    var playerCell : GameObject;
    var playerScript : player;
    var closestLink : GameObject;
    var closestSteps : float;
    var waitToStart : float = 5;
    
    function Start () {
        playerScript = GameObject.FindGameObjectWithTag('Player').GetComponent(player);
    }
    
    function Update () {
        if(waitToStart <= 0)
        {
            playerCell = playerScript.currentCell;
            closestSteps = Mathf.Infinity;
            
            for(var link : GameObject in currentCell.GetComponent(AIpathCell).links)
            {
                var pathLink = link.GetComponent(AIpathLink);
                for(var i : int = 0; i < pathLink.cells.length; i++)
                {
                    if(pathLink.cells[i] == playerCell)
                    {
                        var stepts : float = pathLink.cellsList[i];
                        if(stepts < closestSteps)
                        {
                            closestLink  = link;
                            closestSteps = pathLink.cellsList[i];
                        }
                    }
                }
            }
        }
        else
            waitToStart -= 1;
        
        // move
        if(closestLink)
        {
            if(currentCell == playerCell) 
                transform.position += (playerScript.transform.position - transform.position).normalized * 3.0 * Time.deltaTime;
            else
                transform.position += (closestLink.transform.position - transform.position).normalized * 3.0 * Time.deltaTime;
        }
        
    }
    
    function OnTriggerEnter (other : Collider) {
        if(other.name == 'cell')
            currentCell = other.gameObject;
    }
    {قل لي وسوف أنسى, أرني ولعلي أتذكر, أشركني وسوف أفهم}

  • #2
    تسلم الله ينور عليك
    MY PROFILE ON BEHANCE

    تعليق


    • #3
      الفكرة جدا غريبة ما قدرت استوعب السكربت ولم اكمل قرائة السكربت الثاني

      السكربت يبتدا من اخر .... من دالة
      function OnTriggerEnter(other : Collider) {
      if(other.name == 'cell')
      nearCells.Add(other.gameObject);
      }


      بالبداية يتم nearCells . وهو دائما يحمل جيم اوبجكت واحد فقط

      فخلال عدد فريمين waitForGetCells : float = 2; يتم تعين stage



      حاول تتبع السكربت وقرائتة ولكني وصلت الي هنا وضعت

      // set other stages
      for (stage = 2; stage <= cells.length; stage++)
      {
      for (i = 0; i < cells.length; i++)
      {
      if (cellsList[i] == stage - 1)
      {
      var cell = cells[i] as GameObject;
      for (var checkDoor : GameObject in cell.GetComponent(AIpathCell).links)
      {
      if (checkDoor != gameObject)
      {
      for (var checkCell : GameObject in checkDoor.GetComponent(AIpathLink).nearCells)
      {
      for (var j : int = 0; j <= cells.length - 1; j++)
      {
      if (cells[j] == checkCell && cellsList[j] == null)
      cellsList[j] = stage;
      }
      }
      }
      }
      }
      }
      }

      ما كنت لافكر بهذه الطريقة التي اجدها معقدة ولا اعلم ان كانت مثالية او لا ,,, او ان هنالك طرق افضل منها لاعطاء نفس النتيجة

      هذه التقنية لم تقرع في المنتدى ولم يتحدث عنها احد ... حسب علمي وجميل ان تتعلم تقرع هذه الابواب وهي غاية في الاهمية

      فاغلب الالعاب هنا قائمة على مبدا التصادم اذا تصادم هذا مع هذا افعل كذااا
      اللهم اني اسألك باسمك الاعظم اللذي اذا دعيت به اجبت ان تنصر المسلمين وجندك على الظالمين
      وتفتك باعدائك اعداء الدين


      تعليق


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


        تعليق


        • #5
          المشاركة الأصلية بواسطة احمد teeka مشاهدة المشاركة
          تسلم الله ينور عليك
          الله يخليك

          المشاركة الأصلية بواسطة لا اعلم مشاهدة المشاركة
          تتبع العدو في الماضي استخدمت طريقة الواي بوينت وعدلت عليها الكثير وكانت النتيجة سيئة
          ولكن ارى ان النتيجة بالفيدو ممتازة وافضل بكثير مما حصلت عليه
          اهلا اخى العزيز
          فعلا الطريقة معقدة لكن مفيدة جدا برمجيا ولتغيير طريقة التفكير
          ساحاول اشرحها بشكل مبسط قدر الامكان

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

          هنا يجب على العدو تحديد المربعات التى من خلالها يصل اسرع الى اللاعب

          - يوجد سكربت على كل مربع يقوم بتخزين الابواب المتصلة مه هذا المربع
          - يوجد سكربت على كل باب ويقوم بتخزين الخلايا المتصل بها

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





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



          كل سطر خاص باب وكل رقم هو عدد الخطوات المطلوبة للوصول لهذه الخلية المسجلة داخل مصفوفة
          اذا من الباب الاول ليت الوصول الى الخلية الثالثة يحتاج 5 خطوات

          بعد الانتهاء من عمل هذه الخريطة من الارقام فى بداية السكربت
          يقوم العدو بالاتصال بالابواب الموجودة على المربع الحالى له مثلا ثلاث ابواب
          سيرسل لكل باب رقم الخلية المراد الذهاب اليها فيرد كل باب بعدد الخطوات التى يحتاجها من خلال هذه الباب ويتم الاختيار من خلال تحديد الاقل فى الخطواط

          أتمني ان اكون ساعدت فى توصيل اى قدر صغير عن الفكرة
          وهذا هو الفيديو الاول من مجموعة فديوهات لشرح الفكرة وتطبيقها على اليونيتي
          http://www.youtube.com/watch?v=i3HunQfX5fA&feature=youtu.be


          {قل لي وسوف أنسى, أرني ولعلي أتذكر, أشركني وسوف أفهم}

          تعليق


          • #6
            انا لم افهم الطريقة جيدا
            ما هي الابواب
            و كيف قمت بتقسيم المرحلة الى مربعات ؟؟؟
            FaceBook
            Here

            Ask Me
            Here
            My Channel In Youtube
            Here

            ____________________________________________

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

            تعليق


            • #7
              شكراً أخي على هذا الشرح, لم أجرب أن أعمل مثل هذا الـ ai قبل ذلك, وعلى فكرة هذا المبدأ في الـ ai هو المدخل لبقية المفاهيم الأكثر تعقيداً

              تعليق


              • #8
                مشكور اخي GameGun على الفائده جعلها الله في ميزان حسناتك
                What do you do if your dream is impossible to reach him



                Cry and try to

                تعليق


                • #9
                  المشاركة الأصلية بواسطة matrixinc مشاهدة المشاركة
                  انا لم افهم الطريقة جيدا
                  ما هي الابواب
                  و كيف قمت بتقسيم المرحلة الى مربعات ؟؟؟
                  الطريقة معقدة ولكن سهلة فقط تحتاج للكثيييييير من التركيز مع الكود لفهمها
                  اولا المربعات هى مكعبات عادية على ارضية اللعبة مقسمة كقطع ستجدها فى الفيديو على الجانب الايسر باللون الاخضر
                  ولابواب هى مكعبات بين كل مربع والمربع المجاور كتحديد لعلاقة كل مربع بالمربعات الاخرى

                  المشاركة الأصلية بواسطة ديك المجد مشاهدة المشاركة
                  شكراً أخي على هذا الشرح, لم أجرب أن أعمل مثل هذا الـ ai قبل ذلك, وعلى فكرة هذا المبدأ في الـ ai هو المدخل لبقية المفاهيم الأكثر تعقيداً
                  فعلا بعد تطبيقها تجد الكثير من الافكار الجديدة

                  المشاركة الأصلية بواسطة princelove مشاهدة المشاركة
                  مشكور اخي GameGun على الفائده جعلها الله في ميزان حسناتك
                  تسلم اخي العزيز
                  {قل لي وسوف أنسى, أرني ولعلي أتذكر, أشركني وسوف أفهم}

                  تعليق


                  • #10
                    شغل جميل اخى

                    والحركة احس فيها بسلاسة كبيرة ودة كويس جدا والمطلوب لان فى مثل هذا الاذكاء بتحدث عملية بطء فى بعض الاحيان
                    (عند استخدام الاساليب الخاطئة نوعا ما) ولاكن الاسكربت حلها حل جميل

                    ولاكن هناك طرق خرى لعمل مثل هذا الذكاء ولا تحتاج لكل هذة الاكواد ولاكنها تردي تحليل للنظام اكثر من هذا قليلا

                    ودى طريقة انا كونت عاملها من فترة كبيرة من مشروع للعبة من نوع هاك اند سلاش بس اجلتو دلؤاتى

                    دة بالنسبة لعملية تحديد الوحش
                    كود:
                    using UnityEngine;
                    using System.Collections;
                    using System.Collections.Generic;
                    
                    public class Targetting : MonoBehaviour
                    {
                        public List<Transform> targets;
                        public Transform selectedTarget;
                    
                        private Transform myTransform;
                    
                        // Use this for initialization
                        void Start()
                        {
                            targets = new List<Transform>();
                            selectedTarget = null;
                            myTransform = transform;
                    
                            AddAllEnemies();
                        }
                    
                        public void AddAllEnemies()
                        {
                            GameObject[] go = GameObject.FindGameObjectsWithTag("Enemy");
                    
                            foreach (GameObject enemy in go)
                                AddTarget(enemy.transform);
                        }
                    
                        public void AddTarget(Transform enemy)
                        {
                            targets.Add(enemy);
                        }
                    
                        private void SortTargetsByDistance()
                        {
                            targets.Sort(delegate(Transform t1, Transform t2)
                            {
                                return (Vector3.Distance(t1.position, myTransform.position).CompareTo(Vector3.Distance(t2.position, myTransform.position)));
                            });
                        }
                    
                        private void TargetEnemy()
                        {
                            if (selectedTarget == null)
                            {
                                SortTargetsByDistance();
                                selectedTarget = targets[0];
                            }
                            else
                            {
                                int index = targets.IndexOf(selectedTarget);
                                if (index < targets.Count - 1)
                                {
                                    index++;
                                }
                                else
                                {
                                    index = 0;
                                }
                                DeselectTarget();
                                selectedTarget = targets[index];
                            }
                            SelectTarget();
                        }
                    
                        private void SelectTarget()
                        {
                            selectedTarget.renderer.material.color = Color.red;
                    
                            PlayerAttack pa = (PlayerAttack)GetComponent("PlayerAttack");
                    
                            pa.target = selectedTarget.gameObject;
                        }
                    
                        private void DeselectTarget()
                        {
                            selectedTarget.renderer.material.color = Color.blue;
                            selectedTarget = null;
                        }
                    
                        // Update is called once per frame
                        void Update()
                        {
                            if (Input.GetKeyDown(KeyCode.Tab))
                            {
                                TargetEnemy();
                            }
                        }
                    }
                    زدة عشان الوحش يتجة نحيتك لما تقترب منو مسافة معينة

                    كود:
                    using UnityEngine;
                    using System.Collections;
                    
                    public class EnemyAI : MonoBehaviour
                    {
                        public Transform target;
                        public int moveSpeed;
                        public int rotationSpeed;
                        public int maxDistance;
                    
                        private Transform myTransform;
                    
                        void Awake()
                        {
                            myTransform = transform;
                    
                        }
                    
                        // Use this for initialization
                        void Start()
                        {
                            GameObject go = GameObject.FindGameObjectWithTag("Player");
                    
                            target = go.transform;
                    
                            maxDistance = 2;
                        }
                    
                        // Update is called once per frame
                        void Update()
                        {
                            Debug.DrawLine(target.position, myTransform.position, Color.red);
                    
                            //Look at target
                            myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
                    
                            //Move towards target
                            if (Vector3.Distance(target.position, myTransform.position) > maxDistance)
                            {
                                myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
                            }
                        }
                    }
                    -:| My Games |:-
                    AfterEarth Online SOON

                    -:| Contact Us |:-
                    Facebook Page :- NTStudio

                    تعليق


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


                      تعليق


                      • #12
                        المشاركة الأصلية بواسطة لا اعلم مشاهدة المشاركة
                        مشكور علا الشرح الفكرة جدا جميلة
                        اذا كانت المساحة اكبر هل سوف يستهلك بروسيسر اكثر ؟ هل تصبح اللعبة ابطئ؟
                        ودي اسالك من اين حصلت علا السكربتات ؟
                        هل كتبتهم يدويا !
                        ان يقوم كل باب بعمل البحث على كل الخلايا فى الغالب سيكون التاثير اكبر على العدد اذا كان كبير ولكن مدي التاثير للاسف لا اعرف

                        الطريقة كانت من هذه السلسلة
                        http://www.youtube.com/playlist?list...eature=g-all-a
                        بداية من الدرس 33 اسمه FPS1.32 AI Path Finding Intro/Theory

                        ويمكن الحصول على السكربتات من هنا
                        http://forum.unity3d.com/threads/127...cripts-FPS1.33

                        ولكن انا من كتب الاكواد الخاصة بي فكما اخبرتك لا استخدم اكواد الا بعد ان افهمها
                        هذه الطريقة استهلكت منى يوم كامل حتى افهمها واطبقها بشكل كامل
                        {قل لي وسوف أنسى, أرني ولعلي أتذكر, أشركني وسوف أفهم}

                        تعليق


                        • #13
                          يوجد فى اليونيى شاشة اسمها Profiler لمعرفة كل تفاصيل استهلاك اللعبة
                          ولكنى غير مهتم بالتسحين (optimization) حاليا فكما تعلم انا فى مراحل التعلم الاولي

                          شرح Profiler
                          http://vs1.3dbuzz.com/hb/Unity/Funda...6_Profiler.rar
                          {قل لي وسوف أنسى, أرني ولعلي أتذكر, أشركني وسوف أفهم}

                          تعليق


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


                            تعليق


                            • #15
                              تفضل اخى العزيز ملفات المشروع

                              http://www.mediafire.com/?0sl0q8au5v5zmxg

                              وفى الخدمة لاي توضيح او استفسار
                              {قل لي وسوف أنسى, أرني ولعلي أتذكر, أشركني وسوف أفهم}

                              تعليق

                              يعمل...
                              X