Unity ابزاری عالی و دقیق است که برای توسعه چند پلتفرم مورد استفاده قرار می گیرد. درک اصول آن آسان است و شما می توانید به صورت غریزی شروع به تولید محصولات خود کنید. با این حال اگر بعضی از موارد در ذهن نباشد، وقتی از مرحله نمونه اولیه حرکت می کنید یا به نسخه نهایی نزدیک می شوید، وقتی کارتان را به مرحله بعدی برسانید، پیشرفت شما کند خواهد شد. یکسری کارهایی هستند که زمانی که در حال ساخت یک بازی در یونیتی هستید نباید آن ها را انجام دهید. خیلی از افراد ممکن است در حین ساخت بازی خود این اشتباهات را مرتکب شوند و متوجه این موضوع نباشند. در ادامه مقاله شما را با تعدادی از کارهایی که نباید هنگام ساخت بازی در یونیتی انجام دهید، آشنا خواهیم کرد.
-
دست کم گرفتن مرحله برنامه ریزی پروژه
برای هر پروژه مشخص کردن موارد مختلف قبل از شروع طراحی برنامه و برنامه نویسی پروژه بسیار مهم است. این روزها، هنگامی که بازاریابی محصول بخشی مهم از کل فرآیند است، همچنین داشتن یک ایده دقیق درباره نوع تجارتی که قرار است اپلیکیشن انجام دهد، بسیار مهم است. شما باید مطمئن باشید که برای چه پلتفرم هایی محصول انتشار خواهید کرد و چه برنامه هایی در برنامه شما وجود دارند. همچنین لازم است حداقل مشخصات دستگاه های پشتیبانی شده را تنظیم کنید (آیا از دستگاه های سطح پایین و قدیمی پشتیبانی می کنید یا فقط مدل های جدیدتر ؟) تا بتوانید تصور کنید که چه عملکرد و تصاویری را می توانید تهیه کنید.
از دیدگاه فنی تر لازم است که جلو بردن کل روند ایجاد دارایی ها (assets) و مدل ها را شروع کنید زمانی که آن ها را به برنامه نویس ارائه میدهید، با توجه خاص به این که مدل ها به برخی تغییرات و اصلاحات بیشتر نیاز دارند. شما باید یک ایده واضح در مورد نرخ فریم و بودجه مورد نظر داشته باشید، بنابراین هنرمند 3D در حداکثر رزولوشن می تواند بداند که مدل ها باید چگونه باشند و چه تعداد تغییرات LOD را باید انجام دهد. همچنین باید مشخص شده باشد چگونه تمام اندازه گیری ها را یکی میکنید که یک مقیاس سازگار و فرآیند واردات در کل برنامه داشته باشید.
نحوه طراحی مراحل برای کارهای آینده بسیار مهم است زیرا تقسیم مرحله روی عملکرد بسیار تأثیر می گذارد. هنگام طراحی مراحل جدید، نگرانی های مربوط به عملکرد باید همیشه در ذهن شما باشد. با دیدهای غیر واقعی پیش نروید. همیشه مهم است که از خود سوال کنید "آیا می توان به طور منطقی به آن دست یافت؟" اگر واقعا اینچنین نیست، نباید منابع باارزش خود را برای چیزی که به سختی قابل دستیابی است هدر دهید (البته درصورتی که به عنوان منفعت اصلی در رقابت، بخشی از استراتژی کسب و کار شما نباشد).
-
کار کردن با مدل های بهینه نشده
بسیار مهم است که همه مدل هایتان به خوبی آماده شده باشند تا بتوانید بدون تغییر بیشتر از آنها در صحنه های خود استفاده کنید. چندین چیز وجود دارد که یک مدل خوب باید آنها را برآورده کند. مهم است که مقیاس را به درستی تنظیم کنید. گاهی اوقات به دلیل واحدهای مختلفی که این برنامه ها از آن استفاده می کنند، امکان تنظیم صحیح این نرم افزار مدل سازی 3D وجود ندارد. برای درست کردن همه چیز فاکتور مقیاس را در تنظیمات واردات مدل ها تنظیم کنید و توجه داشته باشید که بعضی اوقات پس از تغییر تنظیم مقیاس، باید اشیا را دوباره وارد کنید. این تنظیمات باید اطمینان حاصل کند که شما می توانید از مقیاس اصلی 1،1،1 در صحنه های خود استفاده کنید تا رفتار مداومی داشته باشید و از نظر فیزیکی مشکلی نداشته باشید. بسته بندی پویا نیز به احتمال زیاد به درستی کار خواهد کرد. این قانون همچنین باید در مورد همه زیرمجموعه های مدل اعمال شود، نه فقط مورد اصلی. هنگامی که نیاز به تغییر ابعاد جسم دارید، این کار را با توجه به سایر اشیا به جای اینکه در Unity انجام دهید، در برنامه های مدل سازی 3D انجام دهید. با این حال می توانید مقیاس را در Unity آزمایش کنید تا مقادیر مناسب را بیابید اما برای برنامه نهایی و گردش کار ثابت خوب است قبل از وارد کردن به Unity همه چیز به خوبی آماده شود.
برای مواردی که برای جابجایی یا چرخش پویا برای اهداف انیمیشن یا تعاملات دیگر به آنها احتیاج دارید، قسمت هایی از شی را جدا کنید. هر جسم و زیرشاخه های آن باید محور خود را به درستی تراز کرده و با توجه به عملکرد اصلی خود بچرخانند. جسم اصلی باید محور Z را به سمت جلو نشان دهد و محوری برای قرار گرفتن بهتر در صحنه در پایین جسم باشد. تا آنجا که ممکن است از مواد کمتری روی اشیا استفاده کنید. همه دارایی ها (assets) باید دارای نام مناسب باشند که به راحتی نوع و عملکرد آن را توصیف کنند. این ثبات را در تمام پروژه های خود حفظ کنید.
-
معماری کد وابسته ساختمانی (Building Interdependent Code)
نمونه سازی و اجرای عملکرد در Unity بسیار آسان است. به راحتی می توانید هر ارجاعی را به اشیا other دیگر بکشید و رها کنید ، به تک تک اشیا موجود در صحنه آدرس دهید و به همه مولفه های (copmponents) موجود دسترسی پیدا کنید. با این حال این نیز می تواند به طور بالقوه خطرناک باشد. علاوه بر موارد قابل توجه عملکرد (پیدا کردن یک شی در سلسله مراتب و دسترسی به اجزای آن)، همچنین در ایجاد قسمت هایی از کد خود که به طور کامل به یکدیگر وابسته باشند، خطر بزرگی وجود دارد. یا وابستگی به سایر سیستم ها و اسکریپت های خاص برنامه یا حتی صحنه فعلی یا سناریوی فعلی. سعی کنید قسمت هایی با قابلیت استفاده مجدد ایجاد کنید که بتواند در سایر قسمت های برنامه شما استفاده شود یا حتی در کل نمونه کارها به اشتراک گذاشته شود.
روش های مختلفی برای اطمینان از این وجود دارد. مولفه های سیستم یونیتی یک نقطه شروع خوب است. وقتی اجزای خاص نیاز به برقراری ارتباط با سایر سیستم های برنامه دارند، ممکن است عوارض ایجاد شود. برای این منظور می توانید از رابط ها استفاده کنید تا قسمت هایی از سیستم خود را انتزاعی و قابل استفاده مجدد کنید. روش دیگر اینکه شما می توانید از یک رویکرد رویداد محور برای واکنش به رویدادهای خاص خارج از محدوده یا با ایجاد یک سیستم پیام رسانی یا با ثبت نام مستقیم در قسمت های دیگر سیستم به عنوان شنونده استفاده کنید. بهترین راه این است که سعی شود خصوصیات gameObject از منطق برنامه جدا شود، زیرا تشخیص اینکه کدام اشیا خاصیت تبدیل آن را تغییر میدهند، دشوار است مانند موقعیت و چرخش دشوار است. این مسئولیت منحصراً به عهده کنترل کننده آن است.
-
نادیده گرفتن مشکلات جمع آوری زباله (Garbage Collection)
بسیار ضروری است که متوجه شوید علی رغم این واقعیت که Garbage Collection یا GC خود به ما کمک می کند تا واقعاً کارآمد و متمرکز بر موارد مهم در برنامه نویسی باشیم، مواردی وجود دارد که باید صریحاً از آنها آگاه باشیم. استفاده از GC رایگان نیست. به طور کلی باید از تخصیص (allocations) حافظه غیرضروری دوری کنید تا از شلیک بیش از حد GC به خود، و در نتیجه از بین بردن عملکرد به وسیله سنسورهای فریم جلوگیری کنید. در حالت ایده آل نباید هیچ تخصیص حافظه جدیدی به طور منظم در هر فریم اتفاق بیفتد. با این حال چگونه می توان به این هدف رسید؟
- از تخصیص غیرضروری در لوپ های بروزرسانی شده، خودداری کنید.
- از ساختارها (structs) برای محفظه های ساده استفاده کنید، آن ها در گروه اختصاص داده نشده اند.
- سعی کنید آرایه ها یا لیست ها یا مجموعه های دیگر اشیا را از قبل اختصاص دهید، به جای اینکه آن ها را در لوپ های آپدیت شده بسازید.
- از استفاده کردن از موارد تک مسئله ای (مثل عبارات LINQ یا لوپ های foreach) خودداری کنید، زیرا یونیتی از نسخه بهینه نشده Mono استفاده میکند.
- برای شناسایی مشکلات احتمالی از پروفایلر استفاده کنید.
-
بهینه سازی حافظه و استفاده از فضا آخرین (Space Usage Last)
لازم است از ابتدای پروژه به کمترین میزان استفاده از حافظه و فضای برنامه توجه داشته باشید، زیرا انجام این کار در صورت رها کردن بهینه سازی مرحله قبل از انتشار، پیچیده تر است. در دستگاه های تلفن همراه این اهمیت بیشتری پیدا می کند، زیرا منابع موجود در آنجا کاملاً کم است. همچنین با نصب بیش از 100 مگابایت مقدار قابل توجهی از مشتریان خود را از دست میدهید. این به دلیل محدودیت 100 مگابایتی برای دانلود شبکه تلفن همراه و همچنین به دلایل روانشناختی است. همیشه وقتی برنامه شما منابع باارزش گوشی مشتری را هدر نمی دهد همیشه بهتر است و وقتی حجم آن کمتر باشد، احتمال دانلود کردن یا خرید برنامه شما بیشتر است.
-
اشتباهات رایج فیزیک
بعضی مواقع، هنگامیکه در حال جابه جا کردن اشیا در صحنه هستید، متوجه نمیشوید که آن شی یک برخورددهنده دارد و تغییر موقعیت آن، موتور را مجبور می کند کل جهان فیزیکی را دوباره حساب کند. در این صورت شما باید مولفه (component) Rigidbody در آن اضافه کنید.
برای تغییر دادن موقعیت جسم با Rigidbody روی آن یا زمانی که موقعیت جدید از موقعیت قبلی یا Rigidbody.MovePosition پیروی نمی کند، همیشه Rigidbody.position را تنظیم کنید. هنگام اصلاح آن، عملیات را همیشه در FixedUpdate اعمال کنید نه در عملکردهای Update. این رفتارهای ثابت فیزیک را تضمین می کند.
-
فکر کردن به اینکه پلاگین های Unity Asset Store تمام مشکلات را حل خواهد کرد.
بسیاری از افراد هستند که برای هرچیز کوچکی از پلاگین ها استفاده میکنند. منظور این نیست که پسوندهای مفیدی در Unity Asset Store نیستند؛ بسیاری از آنها وجود دارند و حتی گاهی اوقات دشوار است که تصمیم بگیرید کدام یک را انتخاب کنید. اما برای هر پروژه حفظ ثبات مهم است که می تواند با استفاده غیر عاقلانه از قطعات مختلف که به خوبی در کنار هم قرار نمی گیرند، از بین برود.
از طرف دیگر همیشه استفاده از محصولات کاملاً تست شده از فروشگاه Unity Asset Store برای عملکردهایی که مدت زمان طولانی برای اجرا شدن، طول می کشند، مفید است و می تواند مقدار زیادی از زمان توسعه شما را ذخیره کند. با این حال با دقت انتخاب کنید، از موارد اثبات شده استفاده کنید که بسیاری از مشکلات غیرقابل کنترل و عجیب را برای محصول نهایی شما به ارمغان نیاورد.
امیدوارم که این موارد برای پیشبرد پروژه های Unity شما مفید باشد. بسیاری از موارد خاص پروژه وجود دارد که قابل اعمال شدن نیستند، اما همیشه مفید است که برخی از قانون های اصلی را برای زمانی که سعی داریم یکسری مشکلات سخت و خاص را حل کنیم، در ذهن داشته باشیم.
اولین نفری باشید که نظر می دهد!