«یا اللهُ یا رَبِّ یا حَیُّ یا قَیّوم یا ذَالجَلالِ وَ الاکرام اَسئَلُکَ بِاسمِکَ اَلعَظیم اَلاَعظَم اَن تَرزُقَنی رِزقاً حَلالاً طَیِّباً بِرَحمَتِکَ الواسِعَه یا اَرحَمَ الرّاحِمِین.»
آموزش هوش مصنوعی در یونیتی artificial intelligence in unity tutorial :: گیم اور _ بازیسازی با unity + مطالب متفرقه

گیم اور _ بازیسازی با unity + مطالب متفرقه

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

به نام خدا
--
گروه قدیم ما promakers.ir یا پرومیکرز بود که بالای هزار اموزش توش ساخته بودم به اسم sajjad3011 ولی حیف ادمین سایتش عوض کرد
حالا سوالی بود کاری بود این شمارمه

قدیمیا دلم براتون تنگ شده... فقط معرفی کنید توی پیامک یا تماس یاد بیارید.
اگه جواب ندادم شاید موقعیت نداشته باشم.
بگید توی پیام از بچه های پرومیکرز هستید.

---
سوالی بود بذارید
نظر خصوصی نذارید
پاسخش سخته
دوست داشتید شماره بذارید تو واتساپ یا ایتا یا .... گروه بزنیم.
09358077198

بایگانی
پیوندها

gameover.blog.ir


AI = Artificial Intelligence به معنی هوش مصنوعی هست.

هوش رو با منطق(logic) (دستورات شرطی مثل and و not و or و if و ... ) میسازن.

بعضی جاهاشو هم با دستورات محاسبات یا ریاضیات (Mathematics) میسازن(مثل add و sub و ... و دستورات جمع و تفریق و ... که توی درس assembly یا ... می تونید بخونید توسط CPU انجام میشه)

سال 86 یا 87 بود اگه اشتباه نکنم یه کد هوش مصنوعی با CPP نوشته بودم که واقعا فکر می کرد و می تونست یاد بگیره و مغزشو گسترش بده و تصمیم بگیره تا در کل یک منطقه به حرکت در بیاد. روش کار من الگوریتم پر کردن یک ناحیه ی بسته بود که با داشتن مختصات داخل اون میومدم چهار جهتش رو بررسی می کردم اگه اطرافش خالی بود مختصات نقاط اون چهار طرف بالا و پایین و چپ و راست رو save می کردم توی یک stack یا پشته یا آرایه و بعدش اونا رو دونه دونه از آرایه بیرون میاوردم و چهار جهت هر یک از اونا رو دوباره بررسی می کردم که جای خالی داریم یا نه اگه داشتیم مختصات اون نقاط رو بازم می ریختم توی آرایه و همینطور الی آخر تا همه جا رنگ آمیزی بشه.

خوب این روش کمک های زیادی به ما می کنه و می تونیم چیزای زیادی برای درک خوش مصنوعی در زندگی و جاهای دیگه ازش یاد بگیریم.

ماشینی رو فرض کنید توی یک پارکینگ هست و می خواد درب خروج رو پیدا کنه. باید فاصله های بالا و چپ و اطراف رو با انداختن نویز یا اشعه یا توابع مخصوص بررسی کنه تا ببینه اون نقاط جای خالی دارن واسه حرکت یا خیر.

و همینطور باید جاهای بررسی شده تا رسیدن به اولین دیوار رو علامتگذاری کرد تا دوباره اون نقاط رو بررسی نکنه و وقت هدر نده.

اینا همش از لحاظ تئوری،توضیحات بود که من براتون دادم.

واسه اینکه هوش بنویسید باید توابع و روش ها و فکر خودتون رو شترش بدید و مهم از همه اینه که باید کد ببینید و فیلم های یوتیوب و سایت های ایرانی و غیره ... رو بررسی کنید یا مطالعه کنید.



هوش با هوش فرق می کنه.

مدلی از هوش مصنوعی رو توی ماشین های مسابقه ای مثل need for speed(نیاز برای سرعت) می بینیم که یک مسیر مشخص رو بعضی ماشین ها با فکر دنبال می کنن.

مدلی از هوش رو توی بازی کمبات می بینیم که دشمن در شرایط مختلف توسط توابع و درخت تصمیم(decision tree) یا گراف و ... می یاد تصمیماتی رو اتحاذ می کنه

و مدلی از هوش رو در بهترین برنامه های هوش داریم مثل شطرنج و فوتبال


در بحث کل کل کردن با هم همه استادیم و ابتدا تلاش های زیادی می کنیم تا کل همدیگرو بخوابونیم.
ولی در عمل می بینیم خیلی از ما ایرانی ها هنوز بلد نیستیم چطوری از فکرمون استفاده کنیم.
در مورد بازی فوتبال به صورت تئوری خودم قصد نوشتن یک فوتبال رو داشتم .مدت ها پیش تصوراتی توی ذهنم بود. توی فکرم این بود که konami از چه روشی استفاده می کنه جدای از گرافیک و سیار مباحث مثل فیزیک و ... .
اونچیزی که توی ذهنم بود این بود که بازیکن ها در فاصله هایی از هم قرار دارن و می تونن نسبت به هم تصمیم بگیرن.
تصمیم حرکت نزدیک ترین فرد تیم حریف به سمت کسی که توپ زیر پاش هست و توسط player داره کنترل می شه. حالا این کنترل می تونه توسط character controller یونیتی باشه و play کردن animation با استفاده از درخت ادغام(bledn tree) در animator componet یا توسط چیزای دیگه.

در هر صورت هرکس روش هایی رو بدست میاره و خودش درک می کنه.

اما مهم ترین چیز در یادگیری هوش اینه که دانش های همدیگه رو روی هم بذاریم و به document تبدیل کنیم و این کاری هست که من دنبال خواهم کرد و امیدوارم دوستان دیگه هم به ما کمک کنن تا در راستای هدف پیش بریم.

در درس بعد یکی از ساده ترین پروژه های هوش رو که از روی یک فیلم نیگا کردم بهتون خواهم آموخت.
زبان های پرولوگ و C و زبان های زیادی واسه نوشتن هوش بکار می رن(شما هم می تونید با زبون دلخواه script بسازید).

اما درگیر جزئیات نبشید و سعی کنید مسائل رو به شیوه ی خودتون و با راهکار(AlgoRithm) های مناسب خودتون حل کنید و یک clean code(به جای یک dirty code) بنویسید.

یه پروژه بسازید و یک plane و یک سیلندر و یک مکعب بذارید . مکعب اسمشو بذارید enemy(دشمن) و اسم سیلندر رو بذارید player(بازیکن)
(دشمن می خواد بازیکن رو پیدا کنه و دنبالش کنه)
[تصویر: player_enemy.jpg]
واسه هر دو تا ابجکت enemy و player کامپوننت rigidbody رو add کنید(بلد نیستید پیام خصوصی بزنید چون این سوالات مبتدی جاش اینجا نیست)
من واسه plane تکستجر انداختم و نرمال مپ کردم و واسه دو تا ابجکت هم متریال به رنگ دلخواه ساختم. شما می تونید اونا رو دلخواه تنظیم کنید مهم نیستن زیاد.
plane رو انتخاب کنید و سپس گزینه ی static رو توی کادر خصوصیات فعال کنید.
از منوی window گزینه ی navigation رو انتخاب کنید.
[تصویر: navigation.jpg]
در inspector وارد سربرگ bake شده و دکمه ی bake زو بزنید وچند لحظه صبر کنید تا plane در اصطلاح bake بشه.(باعث میشه چیزی رو که به این bake نسبت میدیم فقط بتونه روی همین plane حرکت کنه و از این محدوده خارج نتونه بشه)
چند لحظه صبر کنید اگه bake کامل بشه رنگ plane رو آبی می کنه
[تصویر: bake.jpg]
ابجکت دشمن enemy رو انتخاب کنید و سپس از منوی component گزینه ی navigation و سپس nav mesh agent رو انتخاب کنید.
[تصویر: navMeshAgent.jpg]
یه اسکریپت سیشارپ بسازید و بعد از ذخیره بکشیدش روی enemy رها کنید:
 void Update () {
        enemy.SetDestination(player.transform.position);
    }

البته کد رو توی تابع آپدیت نباید بذاریم چون در هر فریم از زمان اجرا میشه و وقت پردازنده رو می گیره و بهینه نیست . خودتون شرط بذارید هر وقت خواستید.
enemy رو انتخاب کنید و در پنل inspector در قمت اسکریپت اضافه شده به متغیرهای player و enemy ابجکت های enmey و player رو نسبت بدید(اونا رو بکشید و رها کنید توی کادر مربوط):
[تصویر: script_variables.jpg]
اجرا بگیرید و ببینید چه اتفاقی میفته .

نوعی از هوش رو با پلاگین های اماده می سازن. مثل AI Driver Toolkit 3.3 که واسه ایجاد رقابت بین ماشین های مسابقه ای ازش استفاده می کنن.
[تصویر: ai_driver_toolkit.jpg]
[تصویر: ai_driver_toolkit_2.jpg]
یه چیزی داریم توی هوش مصنوعی که توی یونیتی تحت عنوان rayCast ازش استفاده میشه . واسه پرتاپ سیگنال برای اینکه چک کنیم مانعی در سر راه gameObject وجود داره یا نه.
[تصویر: rayCasts.jpg]
مثال : توی درس طراحی الگریتم دانشگاه یه متنی رو ترجمه کردم راجع به حرکت ربات مسیر یاب. روش کار رو براتون شرح میدم و در کنارش عکسی از پرتاب سیگنال در یونیتی رو میذارم که از فیلم خارجی ای برداشتم.
یک ربات مسیر یاب زیرش چند تا سنسور(حسگر) داره و چند تا چراغ قرمز.
فرض کنید این رباط م خواد روی یه زمین آبی روشن و دقیقا روی یک خط سفید حرکت کنه.
اما این دوتا هر دوشون روشن هستن و تشخیص اونا سخته.
در روانشناسی رنگ ها، جسمی که تیره تر باشه نور رو کمتر منعکس می کنه و جسمی که رنگش روشن تر باشه نور رو بیشتر انشار میده(یا emit می کنه)
چراغ های زیر ماشین(چراغ های زیرین چپ و راست) نوری رو با زمین پرتاب می کنن و سنسور های زیر ماشین (سنسورهای زیرین چپ و راست) منتظر دریافت نورهای پرتاب شده هستند که توسط زمین زیرین ماشین باید منعکس بشن.
فرض کنید ماشین روی خط سفید هست و کمی به سمت چپ کج شده . یعنی لاستیک چپ روی خط سفید نیست و روی زمین آبی هست.
تمام لامپ های قرمز زیر ماشین دارن نور رو پرتاب می کنن.
اما فقط در این لحظه سنسورهای زیرین روبات که در سمت راست هستن نور رو دریافت کردن. چون سمت راست ماشین روی خط سفید بود و طبق روانشناسی رنگ ،خط سفید نور بیشتری رو باید بازتاب کنه. پس سنسورهای راست باید دستور بدن که ماشین فرمون بده به سمت راست و بگه که ماشین باید کمی سرشو راست کنه.(یعنی به چرخ چپ دستور چرخش به راست و چرخش رو می ده)

بعد از چند لحظه ماشین جلو میره و اینبار سرماشین به راست خم شده و سنسورهای چپ روی line سفید قرار دارن. پس ماشین دستور می ده که به سمت چپ فرمون بده و همینطور الی آخر.

در حقیقت اگه دقت کنید ماشین های line Tracker یا line Follower یا دنبال کننده ی خط با روش چپ و راست کردن و چرخش چرخ ها توی مسیر به حرکت در میان واسه همینه که وقتی توی تلویزیون می بینید روبات ها روی خط دارن راه می رن کمی چپ و راست می کنن.

البته اگه تعداد چراغ ها و سنسور ها زیاد تر باشه دقت بیشتر میشه و همینکه روبات از روی خط کمی چپ و راست شد سریع میاد روی خط و سعی می کنه توی همون line حرکت کنه
توی یونیتی هم ما چیزی به اسم rayCast داریم که کار همون چک کردن مانع ها(obstacle) رو انجام میدن(یعنی rayCast می کنه که جلوش چیزی هست یا نه).
حالا اینکار رو میشه با اسکریپت نویسی دستی انجام داد یا توابع مربوط که میان خودشون همه ی کار رو انجام می دن و فقط بررسی می کنن مانع در سر راه یا در زاویه ی فلان و فاصله ی فلان وجود داره یا خیر وبه ما یه خروجی بلی یا خیر میدن:
true ( یا عدد 1) : وجود دارد/پاسخ مثبت است یا ...
false(معمولا عدد 0 تا هر چیزی غیر از 1 رو می گیم false) : وجود ندارد/پاسخ منفی است یا ....
[تصویر: ai_sensor_raycast.jpg]
[تصویر: ray_1.jpg]
تابع RayCast رو هم اینجا توضیح دادیم قبلا:
http://gameover.blog.ir/1394/08/18/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-raycast-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C

مثالی از هوش :

کپسول: دارای تگ یا برچسب Player
مکعب : دشمن یا Enemy

خوب فکر کنید می خوایم کاری کنیم که اگه هر گیم ابجکتی با تگ یا برچسب "Player" در محدوده یا trigger دشمن باشه متغیر takDamage(وضعیت خطر) فعال یا true بشه و به محض خروج اون گیم ابجگت از محدوده ی دشمن،takDamage غیر فعال یا false بشه.

تا بعدا با بررسی مقدار true یا false بودن این متغیر ، عمل تیر اندازی یا تعقیب یا ... توسط دشمن انجام بشه.

برای تنظیم اینکار به کاراکتر دشمن یک کامپوننت فیزیک box Collider می دیم و siez.xyz رو در کادر inspector کمی زیاد می کنیم تا یک محدوده ی دلخواه برای دشمن ایجاد بشه.


[تصویر: box_collider_1.jpg]

اینم اسکریپتی js ای که باید بدیم به دشمن یا  Enemy :

(نکته:باز هم توصیه می کنیم شما سعی کنید با سیشارپ کدتون رو بنویسید چون استاندارد تره)

//js 
var health=10;//اینم نیاز نبود، حالا واسه سلامتی درست کردیم
var TakeDamage:boolean;

function OnTriggerEnter(other : Collider){
if(other.tag=="Player"){
TakeDamage=true;
}
}

function OnTriggerExit(other:Collider){
if(other.tag=="Player"){
TakeDamage=false;
}
}

واسه تابع update هم می تونیم کدی بنویسیم که مثلا اگه کلیدی رو فشار داده باشیم پایین،مقدار متغیر health رو کم کنه و اگه از منفی یک (-1) کمتر شد اونو نابود کنه و یه پیام بده.

function Update(){
if(TakeDamage) //or if(TakeDamage==true)
{
if(Input.GetButtonDown("Fire1"))//or if(Input.GetKey("هر حرفی که دوست داریم"))
 {
  health -- ; // health = health  - 1;
  }
 }
  
//اگه سلامتی صفر شد پیام بده دشمن مرد و گیم ابجکت دشمن رو نابود کن:
if(health < -1)
{
print("doshman mord");
health=0;
Destroy(gameObject);
}

}//update

نکته : اگه Tag یا برچسب رو نمی دونید چیه اینجا رو مطالعه کنید :

http://gameover.blog.ir/1394/11/22/%D8%AA%DA%AF-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-%DA%86%DB%8C%D8%B3%D8%AA-what-is-tag-in-unity

اینم یک سری اسکریپت در یونیتی:

http://gameover.blog.ir/1394/01/22/%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%AF%D8%B4%D9%85%D9%86-%D9%88-%D8%AD%D9%85%D9%84%D9%87-%D9%88-%D8%AC%D9%88%D9%86-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C




موافقین ۰ مخالفین ۰ ۹۴/۰۳/۰۸
مدیرکل

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی