بیشک یونیتی (Unity)، یکی از مشهورترین موتورهای بازیسازی است که ویژگیهای مثبت بسیاری دارد. اما یکی از فوق العادهترین امکانات آن، خروجی دادن برای اکثر دستگاهها و پلتفرمهای مهم موجود در بازار میباشد! اما واقعا چگونه یونیتی میتواند تنها با یک Export ساده، این طیف وسیع از پلتفرمها را پشتیبانی کند؟! در ادامه با فول کده همراه باشید تا به این سوال پاسخ دهیم.
لیست پلتفرم های خروجی یونیتی
- iOS
- Android
- Windows Phone
- BlackBerry
- Windows
- Windows Store Apps
- Mac OS X
- Linux
- Their native Web Player
- PS 3
- Xbox 360
- Wii U
- PS 4
- Xbox One
- Tizen
- SamsungTV
- PS Vita
- Gear VR
- Oculus Rift
این مساله واقعا فوقالعاده است! برای فهمیدن چگونگی انجام این کار توسط Unity، بهتر است ویژگیهای مختلف این موتور را جداگانه بررسی کنیم. باید توجه داشته باشیم علاوه بر اینکه Unity Technologies قابلیت چند پلتفرمه بودن (multi platform) را در یونیتی تعبیه کرده است، اما پیادهسازی این قابلیت بدون کمک کمپانیهای شخص ثالث، ممکن نبود. در ادامه چگونگی پیادهسازی این قابلیت با توجه به ویژگیهای مختلف موتور بررسی میشود.
گرافیک
چندین API گرافیکی توسط یونیتی پشتیبانی میشود: OpenGL، OpenGL ES، WebGL، Metal و DirectX. هر کدام از این API ها، پلتفرمهای مختلفی را هدف قرار دادهاند!
- «OpenGL» به طور گسترده مورد استفاده قرار میگیرد؛ از MacOS X و برخی دستگاههای iOS گرفته تا لینوکس و حتی ویندوز.
- «OpenGL ES» که با دستگاههای موبایل (بیشتر اندروید و در برخی موارد iOS) سازگار است.
- «WebGL» نیز تکنولوژیای میباشد که برای اپلیکشنها و بازیهای قابل اجرا بر روی مرورگر معرفی شده و کاربر را از پلاگینهایی مانند Flash و Unity web player و … بینیاز میکند.
- «Metal» نیز به تازگی توسط اپل معرفی شده و با دستگاههای iOS جدیدتر سازگار است.
- و نهایتا، «DirectX» که API توسعه داده شده توسط مایکروسافت میباشد و با پلتفرمهای ویندوز، ویندوزفون (Windows phone) و XBox سازگار است.
بنابراین با وجود اینکه مهندسان یونیتی زمان زیادی را برای گرافیک موتور بازی خود صرف کردهاند، اما بیشتر زمانشان صرف تجمیع این ابزارها و API ها برای موتور شده است، نه اینکه از ابتدا این API ها را خودشان نوشته باشند! (که در این صورت دهانشان سرویس میشد 😀 )!
فیزیک
وقتی بحث فیزیک میشود، یونیتی تنها به یک ابزار اطمینان دارد و آن هم «Nvidia PhysiX» است که توسط تمامی پلتفرمهای خروجی یونیتی پشتیبانی میشود. دلیل وجود تنها یک راه کار فیزیک برای تمامی پلتفرمها، ثبات میباشد. چراکه تمامی برخوردها و حرکات باید بر روی تمامی دستگاههای مورد پشتیبانی به یک شکل عمل کنند.
و جالب است بدانید که «PhysiX»، از نسخهی ابتدایی یونیتی که با نام «NovodeX» شناخته میشد، در اختیار «Nvidia» نبود و به عنوان یک موتور فیزیکی قدرتمند و مورد اطمینان در یونیتی تعبیه شده است.
نور
برای پیادهسازی سیستم نور، یونیتی به یک ابزار خارجی وابسته است. قبل از «Unity 5» از «Autodesk Beast» به عنوان ابزاری برای نور از پیش رندر شده استفاده میشد، اما هماکنون یونیتی از «Geomeric’s Enlighten» برای نورهای از پیش رندر شده (Baken Lighting) و بلادرنگ (Real time lighting) بهره میبرد.
اسکریپت نویسی (کدنویسی)
یونیتی به ما این امکان را میدهد تا به زبانهای C# و JavsScript برنامهنویسی کنیم و بدون استفاده از هیچ ابزار تبدیلی، بازی خودمان را برای پلتفرمهای ذکر شده صادر کنیم. اما چگونه این قابلیت امکان پذیر شده است؟! جواب این است که در واقع کلید موفقیت یونیتی در «Mono» خلاصه میشود! «Mono» خود یک چارچوب نرمافزاری کراس پلتفرم و منبعباز .Net است. اما اجازه دهید تاریخچه «Mono» را کمی دقیقتر بررسی کنیم.
درست زمانی که مایکروسافت، چارچوب نرمافزاری .Net را در سال ۲۰۰۰ به عنوان یک پلتفرم جدید، بر اساس استاندارد اینترنت معرفی کرد، فردی به نام «Miguel de Icaza» از «Xamarin» به استفاده از این چارچوب جهت توسعه در سیستم لینوکس علاقمند شد. اما از آنجایی که مایکروسافت .Net از پلتفرم لینوکس یا دیگر پلتفرمهای غیر ویندوزی پشتیبانی به عمل نمیاورد، Miguel تصمیم گرفت تا چارچوبی را مثل .Net اما به صورت کراس پلتفرم توسعه دهد. او پروژهی منبع باز mono را در سال ۲۰۰۱ کلید زد. و خب در واقع Mono یک پروژهی OpenSource است که امکانات .Net شامل کامپایلر C# و CLR را برای پلتفرمهای دیگری هم عرضه کرده است. همچنین در ابتدا Mono از لحاظ قابلیتها از .Net بسیار عقبتر بود، اما هماکنون علاوه بر امکانات .Net، ویژگیهای بیشتری نیز به Mono اضافه شده است.
اجازه دهید کمی از Mono دور شده و مجددا به دوستانمان در یونیتی بپردازیم. خب با تمام این تفاصیل، ما چگونه اسکریپتمان را در یونیتی برنامهنویسی میکنیم؟! مطمئنا سیشارپ یا UnityScript. ولی خب اگر ما با زبان سیشارپ برنامهنویسی میکنیم، واقعا چگونه برنامهی ما بر روی پلتفرمهای مختلف اجرا میشود؟!
- آیا اندروید از جاوا (Java) و iOS از Objective-C یا Swift به جای سیشارپ استفاده نمیکند؟!
- آیا یونیتی تمامی کدهای بازی را به زبان اصل پلتفرم کامپایل میکند؟!
اجازه دهید از سوال آخر شروع کنیم؛ که جواب نه است! یونیتی تمام خطهای کد بازی را به زبان بومی آن پلتفرم کامپایل نمیکند، چون این واقعا دیوانگی است! و همچنین اندروید تنها از جاوا استفاده نمیکند و شما میتوانید در اندروید با استفاده از کدهای بومی (C/C++) به توسعهی اپلیکیشن بپردازید؛ اما خب هیچ کس علاقهای به انجام این کار ندارد. البته به جز Mono!
حالا به جواب سوال اول برگردیم: دستگاه اندرویدی کاربر چگونه بازیای که به زبان سیشارپ نوشته شده است را اجرا میکند؟! در حالی که زبان برنامهنویسی اندروید به جز زبان بومی آن، جاوا است؟ با توجه به اینکه هیچ محیط زمان اجرایی (runtime environment) برای اجرای سیشارپ بر روی گوشی کاربر نصب نیست؟!
خب در واقع این Mono است که بازی را اجرا میکند! اما کاربر که Mono را بر روی گوشی نصب نکرده است و این سوال به وجود میآید که Mono چگونه به گوشی کاربر راه پیدا میکند؟! جواب ساده است، با هر بازی ساخته شده با یونیتی (و هر برنامهی توسعه داده شده با Mono)، یک محیط زمان اجرایی Mono نیز به پروژه اضافه میشود! (دلیل اصلی زیاد شدن حجم بازی بدون قرار دادن هیچ چیز دیگری در پروژه همین است). همچنین وجود این مساله در وبسایت Xamarin به صورت زیر توضیح داده شده است:
برنامههای خود را به زبان C# بنویسید و هر API بومی پلتفرم را که خواستید، مستقیما از C# صدا بزنید. کامپایلر Xamarin ، محیط اجرایی .Net و یک برنامه اجرایی بومی ARM را در پکیج اندروید یا iOS برنامهتان بستهبندی میکند.
حالا یک سوال دیگر مطرح میشود: آیا یک برنامه توسعه داده شده با Mono، تمامی چارچوب را با خودش به همراه دارد؟!
خیر، کلاسهای استفاده نشده از چارچوب در زمان Linking کنار گذاشته میشوند. بنابراین تنها قسمتهایی از چارچوب که استفاده کردهایم درون پکیج نهایی قرار خواهند گرفت. برای اطلاعات بیشتر درباره اینکه محصولات Xamarin چگونه کار میکنند، به این لینک مراجعه کنید.
نظرات ثبت شده بدون دیدگاه