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(بازیکن)
(دشمن می خواد بازیکن رو پیدا کنه و دنبالش کنه)
واسه هر دو تا ابجکت enemy و player کامپوننت rigidbody رو add کنید(بلد
نیستید پیام خصوصی بزنید چون این سوالات مبتدی جاش اینجا نیست)
من واسه plane تکستجر انداختم و نرمال مپ کردم و واسه دو تا ابجکت هم
متریال به رنگ دلخواه ساختم. شما می تونید اونا رو دلخواه تنظیم کنید مهم
نیستن زیاد.
plane رو انتخاب کنید و سپس گزینه ی static رو توی کادر خصوصیات فعال کنید.
از منوی window گزینه ی navigation رو انتخاب کنید.
در inspector وارد سربرگ bake شده و دکمه ی bake زو بزنید وچند لحظه صبر
کنید تا plane در اصطلاح bake بشه.(باعث میشه چیزی رو که به این bake نسبت
میدیم فقط بتونه روی همین plane حرکت کنه و از این محدوده خارج نتونه بشه)
چند لحظه صبر کنید اگه bake کامل بشه رنگ plane رو آبی می کنه
ابجکت دشمن enemy رو انتخاب کنید و سپس از منوی component گزینه ی navigation و سپس nav mesh agent رو انتخاب کنید.
یه اسکریپت سیشارپ بسازید و بعد از ذخیره بکشیدش روی enemy رها کنید:
void Update () {
enemy.SetDestination(player.transform.position);
}
البته کد رو توی تابع آپدیت نباید بذاریم چون در هر فریم از زمان اجرا میشه و وقت پردازنده رو می گیره و بهینه نیست . خودتون شرط بذارید هر وقت خواستید.
enemy رو انتخاب کنید و در پنل inspector در قمت اسکریپت
اضافه شده به متغیرهای player و enemy ابجکت های enmey و player رو نسبت
بدید(اونا رو بکشید و رها کنید توی کادر مربوط):
اجرا بگیرید و ببینید چه اتفاقی میفته .
نوعی از هوش رو با پلاگین های اماده می سازن. مثل AI
Driver Toolkit 3.3 که واسه ایجاد رقابت بین ماشین های مسابقه ای ازش
استفاده می کنن.
یه چیزی داریم توی هوش مصنوعی که توی یونیتی تحت عنوان rayCast ازش استفاده
میشه . واسه پرتاپ سیگنال برای اینکه چک کنیم مانعی در سر راه gameObject
وجود داره یا نه.
مثال : توی درس طراحی الگریتم دانشگاه یه متنی رو ترجمه کردم راجع به حرکت
ربات مسیر یاب. روش کار رو براتون شرح میدم و در کنارش عکسی از پرتاب
سیگنال در یونیتی رو میذارم که از فیلم خارجی ای برداشتم.
یک ربات مسیر یاب زیرش چند تا سنسور(حسگر) داره و چند تا چراغ قرمز.
فرض کنید این رباط م خواد روی یه زمین آبی روشن و دقیقا روی یک خط سفید حرکت کنه.
اما این دوتا هر دوشون روشن هستن و تشخیص اونا سخته.
در روانشناسی رنگ ها، جسمی که تیره تر باشه نور رو کمتر منعکس می کنه و
جسمی که رنگش روشن تر باشه نور رو بیشتر انشار میده(یا emit می کنه)
چراغ های زیر ماشین(چراغ های زیرین چپ و راست) نوری رو با زمین پرتاب می
کنن و سنسور های زیر ماشین (سنسورهای زیرین چپ و راست) منتظر دریافت
نورهای پرتاب شده هستند که توسط زمین زیرین ماشین باید منعکس بشن.
فرض کنید ماشین روی خط سفید هست و کمی به سمت چپ کج شده . یعنی لاستیک چپ روی خط سفید نیست و روی زمین آبی هست.
تمام لامپ های قرمز زیر ماشین دارن نور رو پرتاب می کنن.
اما فقط در این لحظه سنسورهای زیرین روبات که در سمت راست هستن نور رو
دریافت کردن. چون سمت راست ماشین روی خط سفید بود و طبق روانشناسی رنگ ،خط
سفید نور بیشتری رو باید بازتاب کنه. پس سنسورهای راست باید دستور بدن که
ماشین فرمون بده به سمت راست و بگه که ماشین باید کمی سرشو راست کنه.(یعنی
به چرخ چپ دستور چرخش به راست و چرخش رو می ده)
بعد از چند لحظه ماشین جلو میره و اینبار سرماشین به راست خم شده و
سنسورهای چپ روی line سفید قرار دارن. پس ماشین دستور می ده که به سمت چپ
فرمون بده و همینطور الی آخر.
در حقیقت اگه دقت کنید ماشین های line Tracker یا line Follower یا دنبال
کننده ی خط با روش چپ و راست کردن و چرخش چرخ ها توی مسیر به حرکت در میان
واسه همینه که وقتی توی تلویزیون می بینید روبات ها روی خط دارن راه می رن
کمی چپ و راست می کنن.
البته اگه تعداد چراغ ها و سنسور ها زیاد تر باشه دقت بیشتر میشه و همینکه
روبات از روی خط کمی چپ و راست شد سریع میاد روی خط و سعی می کنه توی همون
line حرکت کنه
توی یونیتی هم ما چیزی به اسم rayCast داریم که کار همون چک کردن مانع
ها(obstacle) رو انجام میدن(یعنی rayCast می کنه که جلوش چیزی هست یا نه).
حالا اینکار رو میشه با اسکریپت نویسی دستی انجام داد یا توابع مربوط که
میان خودشون همه ی کار رو انجام می دن و فقط بررسی می کنن مانع در سر راه
یا در زاویه ی فلان و فاصله ی فلان وجود داره یا خیر وبه ما یه خروجی بلی
یا خیر میدن:
true ( یا عدد 1) : وجود دارد/پاسخ مثبت است یا ...
false(معمولا عدد 0 تا هر چیزی غیر از 1 رو می گیم false) : وجود ندارد/پاسخ منفی است یا ....
تابع 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
(نکته:باز هم توصیه می کنیم شما سعی کنید با سیشارپ کدتون رو بنویسید چون استاندارد تره)
واسه تابع update هم می تونیم کدی بنویسیم که مثلا اگه کلیدی رو فشار داده
باشیم پایین،مقدار متغیر health رو کم کنه و اگه از منفی یک (-1) کمتر شد
اونو نابود کنه و یه پیام بده.