مهم ترین المان در گیم پلی بازی های ویدیویی کاراکتر اصلی بازیکن است. در بحث امروز در رابطه با نحوه ی عملکرد و رفتار سایر کاراکترهای بازی ها صحبت می کنیم. این کاراکترها می توانند NPCها یا Enemyها باشند.
این کاراکترها براساس تصمیمات دیزاین می توانند سطح مشخصی از توانایی را داشته باشند. اگر کاراکترها در شرایط مختلف واکنش های متفاوتی ازخود نشان دهند، یک نوع هوشمندی را دارند که به واسطه ی آن می توان آن ها را یک AI نامید. AI فرم کوچک شده ی Artificial Intelligence به معنای هوش مصنوعی است. به بیانی بهتر کاراکترها در بازی طوری طراحی می شوند که تا حدی دارای هوشمندی برای انجام واکنش هایی دربرابر رفتارهای پلیر باشند. برای اینکه این رفتارها الگوی مشخص شده و قابل اجرایی داشته باشند، باید در ابتدا یک نمودار از حالت های مختلف وضعیت کاراکتر داشته باشیم و با توجه به تریگرهای مختلف، گذار بین حالت ها را مشخص کنیم. طراحی این موارد به ایجاد یک state machine یا ماشین حالت می انجامد. وجود این ماشین حالت برای پیاده سازی فنی کاراکتر تاحدی ضروری است. برای بهتر مشخص شدن این موضوع رفتار یک enemy فرضی را تشریح می کنیم.
فرض کنید یک نگهبان به عنوان یک enemy در یک بازی فرضی در یک مرحله ی فرضی طراحی شده است. این نگهبان باید در مسیر مشخص شده ای نگهبانی دهد. مثلا از نقطه ی ۱ به نقطه ی ۲ در حال رفت و برگشت باشد و میدان دید مشخصی هم برای این نگهبان در نظر گرفته شده است. این میدان دید عموما به شکل مخروطی است (cone of view). این رفتار نگهبان ثابت است تا اینکه پلیر در این میدان دید قرار بگیرد (تریگری برای تغییر رفتار enemy). بعد از این حالت نگهبان از فاز نگهبانی (patrol) به فاز تعقیب(chase) وارد می شود و طبیعتا با ایجاد تریگر بعدی نگهبان رفتار خود را به حالت بعدی تغییر می دهد. به بیانی واضح یا نگهبان به پلیر ضربه می زند (attack)، یا پلیر موفق می شود از دست نگهبان فرار کند (بازگشت به patrol). تریگرهای هر کدام از سناریوها هم می توانند برای مثال یک فاصله ی مشخص بین پلیر و نگهبان و قرار گرفتن پلیر در میدان دید نگهبان باشند.
با توجه به مثال بالا به دو فاکتور مهم در state machine می توان پی برد، یکی وضعیت یا حالت های مختلف یک سیسنم و دیگری شرایطی که گذار بین حالت ها را ایجاب می کند.
ماشین های حالتی که ما اصولا با آن ها سروکار داریم FSM هستند (Finite State machine). به بیانی دیگر با تعداد محدود و مشخصی حالت و شرایط گذار روبرو هستیم.
در بحث شخصیت های AI درون بازی می توانیم نتیجه بگیریم که تمام رفتارهای AIها مشخص و از قبل تعیین شده است. در برنامه نویسی و طراحی سیستم برای AIها معمولا از قبل نمودارها و فلوچارت هایی برای حالت ها و شرایط گذار ترسیم می شوند، تا بنوان به یک سیسنم مرتب و کم باگ رسید. قابل توسعه بودن این سیستم از مواردیست که به پویا بودن و حتی کم باگ بودن AI پیاده سازی شده کمک می کند.
اگر بخواهیم برای مثالی که پیشتر با هم بررسی کردیم یک سیستم ساده بنویسیم می توانیم یک رشته enum برای حالت ها ایجاد کنیم.
با تغییر متغییری از همین جنس می توان حالت فعلی AI را ست و در ادامه اتفاقی که در ان حالت می افتد را فراخوانی کرد.
برای ست شدن هر حالت و تغییر از حالت قبلی به بعدی باید تریگر گذار بین دو حالت مشخص فعال شود.
وضعیت نگهبان در حالت دیفالت PATROL است.
زمانی که نگهبان در حالت PATROL باشد، باید در بین نقاط مشخصی نگهبانی دهد. در اینجا چند نقطه ی مشخص که با تگ waypoint مشخص شده اند، نقطه شروع و پایان گشت نگهبان را مشخص می کنند. با رسیدن نگهبان به نقطه ی پایان یک گشت دوباره waypointای جدید برای نگهبان (به صورت رندوم) تعیین می شود. مادامی که نگهبان در حالت PATROL باشد این رفتار تکرار می شود.
(توابع مربوط به حرکت و مسیریابی AI برای رفتن از یک waypoint به waypoint دیگر در مقاله های بعدی شرح داده می شود.)
براساس ماشین حالت مثال ما، گذار حالت از PATROL به CHASE با فرار گرفتن پلیر در میدان دید نگهبان اتفاق می افتد. در اینجا شبیه سازی این اتفاق را با استفاده از مفهوم برخورد کلایدرها انجام می دهیم (برای اطلاعات بیشتر درباره ی کامپوننت collider به داکیومنت یونیتی مراجعه کنید). در صورتی که کلایدر میدان دید نگهبان با کلایدر پلیر برخورد کند، نگهبان وارد فاز CHASE می شود.
در حالت CHASE تا زمانیکه فاصله ی نگهبان تا پلیر بیشتر از مقدار مشخص شده ی AttackDistance باشد، نگهبان پلیر را تعقیب می کند. کمتر شدن این فاصله از AttackDistance،تریگر تغییر حالت از CHASE به ATTACK است.
(توابع مربوط به حرکت و مسیریابی AI برای دنبال کردن پلیر در مقاله های بعدی شرح داده می شود.)
در حالت ATTACK شرایطی برعکس حالت قبل داریم. حفظ فاصله ی کوچکتر از AttackDistance بین پلیر و نگهبان، نگهبان را در حالت ATTACK نگه می دارد، در حالی که افزایش فاصله نگهبان را به CHASE بر می گرداند.
با درک روندی که تا اینجا پیش بردیم می توانیم تغییر حالت از CHASE به PATROL انجام دهیم. حتی می توان حالت های دیگری به این ساختار اضافه کرد.
چیزی که تا اینجا یاد گرفتیم مقدمه ی کوتاهی بر رفتار AI ها در بازی ها بود. دنیای طراحی و پیاده سازی AIها در بازی های ویدیویی بسیار جذاب و گسترده است. به طوریکه در شرکت های بزرگ و متوسط پوزیشن هایی برای AI در زمینه ی برنامه نویسی و طراحی وجود دارد.
منابع:
- “Cert Prep Unity Certified Associate Game Developer Scripting with C sharp “By Alan Thorn
- Artificial Intelligence in Games 1st Edition by Paul Roberts
- Beginning Game AI with Unity: Programming Artificial Intelligence with C# By Sebastiano M. Cossu
نویسنده: فاطمه زارع