برو به محتوای اصلی
علیرضا پورسهولت
برنامه‌نویس در Quiz of Kings
۲ سال پیش پرسیده شده

روش شما برای رفع Conflictهای ناشی از Merge در Sceneهای موتور بازی‌سازی Unity چیست؟ آیا از ابزار خاصی استفاده می‌کنید؟ تجربه‌تون در این مورد چطور بوده؟

من کجام؟ اینجا کجاست؟

در جامعه بازی‌سازان ایران می‌تونید در مورد هر موضوعی سوال کنید، به سوالای بقیه جواب بدید و تجربه‌تون رو به اشتراک بگذارید!

منصور جوادی
همکار سابق و دوست فعلی تاد و از اعضای جعبه آبی

همانطور که صادق گفت هرچه استقلال asset‌ها رو بیشتر کنید امکان Conflict کمتر هست اما نکته ای که در استفاده از گیت در یونیتی مهم هست اینه که روش سریالایز کردن صحنه‌ها رو از بایت به متن که همون YAML هست تغییر بدید. در اکثر اوقات خود گیت صحنه‌های YAML رو Resolve می‌کنه و در غیر این صورت رفع مشکل به صورت دستی در فایل‌های YAML اصلا سخت نیست.
خبر خوب اینکه در نسخه‌های 2019 سرعت سریالایز کردن به YAML سریعتر شده.

صادق برومند
برنامه نویس در Ubisoft Blue Byte

ما هم مثل امین جان سعی می‌کنیم که بیشتر از prefab‌ها توی sceneهامون استفاده کنیم که کمتر این مشکل پیش بیاد.
یه کار دیگه که ما انجام میدیم اینه که قسمت‌های مختلف بازی رو به Scene‌های مختلف منتقل می‌کنیم که کمتر به همدیگه وابسته باشن. مثلا Menu بازی و UI رو می‌بریم توی یک Scene دیگه و به صورت Async همزمان چند تا Scene رو Load می‌کنیم.
روش دیگه ای که به پیشگیری از این مشکل کمک میکنه استفاده از Sciptable Object هاست برای ذخیره و پاس دادن رفرنس‌ها به کلاس‌های مختلف.
مثلا اگر فرض کنید که یک بازی RPG داریم هر NPC یک Scriptable Object داره که اطلاعاتی مثل اسم و مقدار جونش و دیالوگ هاش رو توش ذخیره می‌کنیم و طراح بازی لازم نیست Scene یا حتی Prefab اون NPC رو تغییر بده. اینجوری چند نفر می‌تونن روی یک موضوع کار کنند بدون داشتن Conflict. 
البته اگر از همه این موارد هم استفاده کنید بازم Conflict پیش میاد که خب با هماهنگی بین اعضای تیم میشه ازش جلوگیری کرد.

در درجه اول تا جایی که میشه از Prefab‌ها استفاده می‌کنیم و عملا کار رو ریز‌تر می‌کنیم تا چنین مشکلی از ابتدا پیش نیاد. اما اگر پیش اومد،
ترکیب دو تا ابزار این کار رو برای ما انجام میده اول:
https://docs.unity3d.com/Manual/SmartMerge.html۷۴۹
که ابزار خود یوینیتی برای اینکار هست و دوم:
P4Merge که هرجا که اولی نتونست سین‌ها رو مرج کنه این کمک می‌کنه
در نهایت گاهی بازم هم به مشکل می‌خوریم و من فعلا راه حلی براش ندارم و مجبور میشم تغییرات رو برگردونم و دوباره انجامشون بدم، حالا احتمالا باقی دوستان راه حل‌های بهتری هم دارند.

مسعود افسر
عضو تیم اردیبهشت‌استودیو

در درجه اول باید ساختار داده‌های بازی و آبجکت‌ها رو سازمان بدید. این کار باعث میشه که بتونید به بهترین نحو بازی رو در Sceneها، Prefabها و Assetهای مجذا و مستقل توسعه بدید و ماژولار بشن.
سپس حتما از GIT LFS هم برای فایل‌های بزرگ استفاده کنید و فراموش نکنید که فایل‌های gitignore و gitattribute رو در پروژه قرار بدید. این لینک۱۲۴ می‌تونه کمک کنه.

اصلی‌ترین ابزاری که خود Unity برای رفع Conflict معرفی کرده Unity YAML Merge۲۰۸ هست که در مستندات یونیتی به طور کامل آموزش داده شده.

این ابزار چند فایل config هم داره که اگر تنظیم بشن خیلی کمک می‌کنند.

اولی فایل mergespecfile.txt که در مسیر زیر قرار دارد.

...\Unity\Editor\Data\Tools\mergespecfile.txt

در این فایل Fallback‌های Unity YAML Merge رو مشخص می‌کنید که هر فایل در صورت عدم رفع Conflict با چه ابزاری باز بشه. من از SourceGear استفاده می‌کنم.
فایل بعدی هم mergerules.txt هست که می‌تونید در اون رفتار YAML Merge رو در کامپوننت‌های مختلف تعیین کنید. 
مثلا تعیین کنید که اگر در MeshRenderer متریال در هر دو طرف تغییر کرده بود حتما Conflict بده تا به صورت دستی مقدار رو انتخاب کنید.

[exclusions]
exclude *.MeshRenderer.m_Materials.*

در آخر هم می‌تونید از GitMerge for Unity۱۵۰ که در Asset Store یونیتی وجود داره استفاده کنید تا به صورت Visual رفع Conflict کنید.