🟢 درود دوستان!
این پست مخصوص دوستانیه که هنوز از نسخههای قدیمیتر یونیتی (Unity) استفاده میکنن و به خاطر محدودیتهای جدید مارکتها (مثل Google Play یا کافهبازار)، دیگه نمیتونن بازی رو با Target API پایین منتشر کنن.
اما با این ترفند، لیست Android APIها توی یونیتی آپدیت میشه و مشکل حل میشه! 🔧
✅ مشکل چیه؟
یونیتی نسخههای جدید Android API رو نشون نمیده، گاهی حتی اگه SDK رو بهروز کرده باشید هم ممکنه یونیتی اونها رو توی لیست نشون نده.
✅ راه حل چیه؟
1. اول از همه، چون ما در ایران هستیم و ممکنه دسترسی به سرورهای گوگل محدود باشه، فیلتر شکن رو روشن کنید و روی حالت VPN قرار بدید.
2. برید به مسیر نصب Android SDK:
3. توی این مسیر، یه ترمینال (CMD یا PowerShell) باز کنید و این دستور رو بزنید:
این دستور باعث میشه SDK لیست پکیجها رو با سرور گوگل هماهنگ کنه و فایلهای اطلاعاتی (مثل
❗️ نکته مهم:
گاهی یونیتی بلافاصله لیست جدید APIها رو تشخیص نمیده.
برای اطمینان از اینکه همهچیز درست انجام شده، بعد از اجرای دستور بالا، حتما یه خروجی بگیرید. این کار باعث میشه یونیتی لیست جدید APIها رو بهدرستی شناسایی و آپدیت کنه.
⚡️ اگه اعمال نشد، یونیتی رو ببندید و دوباره باز کنید تا تغییرات اعمال بشه.
🛠 چطور مسیر SDK رو پیدا کنیم؟
در یونیتی از این مسیر:
بعد از این مراحل، به Unity برگردید، برید به Build Settings > Player Settings و حالا باید بتونید Target API جدید رو از لیست انتخاب کنید ✅
اگه این آموزش برات مفید بود، حتما برای بقیه هم بفرست 🔁
اگه سؤالی داشتی، همینجا بپرس ✌️
🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
این پست مخصوص دوستانیه که هنوز از نسخههای قدیمیتر یونیتی (Unity) استفاده میکنن و به خاطر محدودیتهای جدید مارکتها (مثل Google Play یا کافهبازار)، دیگه نمیتونن بازی رو با Target API پایین منتشر کنن.
اما با این ترفند، لیست Android APIها توی یونیتی آپدیت میشه و مشکل حل میشه! 🔧
✅ مشکل چیه؟
یونیتی نسخههای جدید Android API رو نشون نمیده، گاهی حتی اگه SDK رو بهروز کرده باشید هم ممکنه یونیتی اونها رو توی لیست نشون نده.
✅ راه حل چیه؟
1. اول از همه، چون ما در ایران هستیم و ممکنه دسترسی به سرورهای گوگل محدود باشه، فیلتر شکن رو روشن کنید و روی حالت VPN قرار بدید.
2. برید به مسیر نصب Android SDK:
SDK\cmdline-tools\latest\bin
3. توی این مسیر، یه ترمینال (CMD یا PowerShell) باز کنید و این دستور رو بزنید:
sdkmanager --list
این دستور باعث میشه SDK لیست پکیجها رو با سرور گوگل هماهنگ کنه و فایلهای اطلاعاتی (مثل
packages.xml) بهروز بشن.❗️ نکته مهم:
گاهی یونیتی بلافاصله لیست جدید APIها رو تشخیص نمیده.
برای اطمینان از اینکه همهچیز درست انجام شده، بعد از اجرای دستور بالا، حتما یه خروجی بگیرید. این کار باعث میشه یونیتی لیست جدید APIها رو بهدرستی شناسایی و آپدیت کنه.
⚡️ اگه اعمال نشد، یونیتی رو ببندید و دوباره باز کنید تا تغییرات اعمال بشه.
🛠 چطور مسیر SDK رو پیدا کنیم؟
در یونیتی از این مسیر:
Edit > Preferences > External Tools > Android SDK
بعد از این مراحل، به Unity برگردید، برید به Build Settings > Player Settings و حالا باید بتونید Target API جدید رو از لیست انتخاب کنید ✅
اگه این آموزش برات مفید بود، حتما برای بقیه هم بفرست 🔁
اگه سؤالی داشتی، همینجا بپرس ✌️
🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
❤7👍2
💡 کد سیشارپ تو یونیتی چطوری اجرا میشه؟
🔥 خیلیا فکر میکنن چون داریم با C# تو یونیتی کار میکنیم، پس کل پروژه با داتنت اجرا میشه، ولی واقعیت خیلی عمیقتره..
🧩 ساختار
یونیتی در باطن یه موتور بازیسازیه که با زبان C++ ساخته شده. یعنی بخشهای اصلیش مثل فیزیک، رندرینگ، مدیریت صحنه، و غیره، کاملاً به زبان C++ هستن.
سیشارپ فقط یه لایه واسط برای تعامل راحتتر با این سیستم C++ هست.
⚙️ فرایند خروجی گرفتن
مثلاً وقتی خروجی اندروید میگیری، اون دستگاه اصلاً داتنت یا C# رو نمیشناسه.
یونیتی باید کل کدهای شما رو به یه چیزی تبدیل کنه که اندروید بفهمه. این کار با تکنولوژیای به نام IL2CPP انجام میشه.
🎯 فرق بین API یونیتی و کد داتنت
اگه فقط از APIهای خود یونیتی مثل
● سریعتر اجرا میشه
● حجم خروجی کمتره
● مصرف رم پایینتره
⛔️ ولی اگه...
اگه از کدهای خود داتنت استفاده کرده باشی، مثل:
● 📁 فایل:
● 🌐 دانلود:
● ⏳ غیربلوک:
● 🔍 تحلیل:
یونیتی باید یه لایهی شبیهسازی برای اجرا کردن اینا بذاره، چون اینا مستقیم به موتور یونیتی وصل نیستن، بلکه به خود CLR داتنت وابستهان.
🐢 نتیجه چیه؟
کدی که به سیستم داتنت وابسته باشه تو خروجی:
● کندتر اجرا میشه (چون شبیهسازی میشه)
● خروجی بازی حجیمتره
● ممکنه روی بعضی پلتفرمها درست کار نکنه یا با باگهای خاص مواجه بشی
🚀 راه حل چیه؟
تا جایی که میتونی از ابزارهای خود یونیتی استفاده کن. مثلاً:
● به جای
● به جای
● برای پردازشهای سنگین از
🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
🔥 خیلیا فکر میکنن چون داریم با C# تو یونیتی کار میکنیم، پس کل پروژه با داتنت اجرا میشه، ولی واقعیت خیلی عمیقتره..
🧩 ساختار
یونیتی در باطن یه موتور بازیسازیه که با زبان C++ ساخته شده. یعنی بخشهای اصلیش مثل فیزیک، رندرینگ، مدیریت صحنه، و غیره، کاملاً به زبان C++ هستن.
سیشارپ فقط یه لایه واسط برای تعامل راحتتر با این سیستم C++ هست.
⚙️ فرایند خروجی گرفتن
مثلاً وقتی خروجی اندروید میگیری، اون دستگاه اصلاً داتنت یا C# رو نمیشناسه.
یونیتی باید کل کدهای شما رو به یه چیزی تبدیل کنه که اندروید بفهمه. این کار با تکنولوژیای به نام IL2CPP انجام میشه.
🎯 فرق بین API یونیتی و کد داتنت
اگه فقط از APIهای خود یونیتی مثل
Transform, Rigidbody, Animator و امثال اینا استفاده کرده باشی، یونیتی خیلی راحت اونها رو مستقیماً به C++ تبدیل میکنه. این یعنی:● سریعتر اجرا میشه
● حجم خروجی کمتره
● مصرف رم پایینتره
⛔️ ولی اگه...
اگه از کدهای خود داتنت استفاده کرده باشی، مثل:
● 📁 فایل:
System.IO برای خوندن فایل● 🌐 دانلود:
System.Net.HttpClient برای ارتباطات اینترنتی● ⏳ غیربلوک:
async/await و Task برای انجام کارها بهصورت غیرهمزمان● 🔍 تحلیل:
Reflection, Linq, Regex برای بررسی، جستجو یا پردازش ساختار کد و دادههایونیتی باید یه لایهی شبیهسازی برای اجرا کردن اینا بذاره، چون اینا مستقیم به موتور یونیتی وصل نیستن، بلکه به خود CLR داتنت وابستهان.
🐢 نتیجه چیه؟
کدی که به سیستم داتنت وابسته باشه تو خروجی:
● کندتر اجرا میشه (چون شبیهسازی میشه)
● خروجی بازی حجیمتره
● ممکنه روی بعضی پلتفرمها درست کار نکنه یا با باگهای خاص مواجه بشی
🚀 راه حل چیه؟
تا جایی که میتونی از ابزارهای خود یونیتی استفاده کن. مثلاً:
● به جای
async/await از Coroutine استفاده کن● به جای
HttpClient از UnityWebRequest● برای پردازشهای سنگین از
Job System و Burst استفاده کن🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
🔥7👍2❤1
📣 معرفی OpenUPM: دروازه ای برای پکیجهای یونیتی
امروز میخوام بهتون OpenUPM رو معرفی کنم، یک مخزن (registry) متنباز برای پکیجهای یونیتی (Unity Package Manager - UPM) که کار رو برای توسعهدهندگان خیلی آسونتر کرده.
اوپنیوپیام در واقع یک جایگزین عالی برای رجیستری پیشفرض یونیتیه که به شما اجازه میده پکیجهای مختلف رو به راحتی پیدا کنید، نصب کنید و حتی پکیجهای خودتون رو منتشر کنید.
اهمیت اوپنیوپیام از چند جهت مشخصه:
● دسترسی آسانتر: میتونید به هزاران پکیج متنباز که توسط کامیونیتی یونیتی ساخته شده، دسترسی داشته باشید.
● انتشار آسان: توسعهدهندهها میتونن پکیجهای خودشون رو با دردسر کمتری منتشر کنند و با بقیه به اشتراک بذارن.
● کنترل بیشتر: شما کنترل بیشتری روی نسخههای پکیجهاتون و وابستگیهاشون خواهید داشت.
ابزارهای OpenUPM
اوپنیوپیام یک سری ابزار کاربردی داره که کار باهاش رو راحتتر میکنه:
● سایت اوپنیوپیام (openupm.com): جایی که میتونید پکیجها رو جستجو کنید، اطلاعاتشون رو ببینید و مستندات رو مطالعه کنید.
● ابزار OpenUPM CLI: یک ابزار خط فرمان که بهتون اجازه میده پکیجها رو نصب و مدیریت کنید.
انتشار پکیج در OpenUPM
شما هم میتونید پکیجهای خودتون رو در OpenUPM منتشر کنید!
● برای این کار، پکیج شما باید از ساختار UPM پیروی کنه.
● همچنین، کد شما باید متنباز باشه و روی گیتهاب (GitHub) یا پلتفرمهای مشابه موجود باشه.
● سپس، میتونید درخواست (pull request) بدید تا پکیج شما به لیست OpenUPM اضافه بشه.
نصب OpenUPM CLI و افزودن پکیج
برای استفاده از OpenUPM CLI، ابتدا باید Node.js رو روی سیستمتون نصب داشته باشید.
سپس، میتونید با دستور زیر OpenUPM CLI رو نصب کنید:
بعد از نصب، برای افزودن یک پکیج به پروژه یونیتی خودتون، کافیه در پوشه پروژه دستور زیر رو اجرا کنید.
به عنوان مثال، برای پکیج خودم `wold.magic.webads`، دستور به این صورته:
با این کار، پکیج به پروژه شما اضافه میشه و میتونید ازش استفاده کنید.
🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
امروز میخوام بهتون OpenUPM رو معرفی کنم، یک مخزن (registry) متنباز برای پکیجهای یونیتی (Unity Package Manager - UPM) که کار رو برای توسعهدهندگان خیلی آسونتر کرده.
اوپنیوپیام در واقع یک جایگزین عالی برای رجیستری پیشفرض یونیتیه که به شما اجازه میده پکیجهای مختلف رو به راحتی پیدا کنید، نصب کنید و حتی پکیجهای خودتون رو منتشر کنید.
اهمیت اوپنیوپیام از چند جهت مشخصه:
● دسترسی آسانتر: میتونید به هزاران پکیج متنباز که توسط کامیونیتی یونیتی ساخته شده، دسترسی داشته باشید.
● انتشار آسان: توسعهدهندهها میتونن پکیجهای خودشون رو با دردسر کمتری منتشر کنند و با بقیه به اشتراک بذارن.
● کنترل بیشتر: شما کنترل بیشتری روی نسخههای پکیجهاتون و وابستگیهاشون خواهید داشت.
ابزارهای OpenUPM
اوپنیوپیام یک سری ابزار کاربردی داره که کار باهاش رو راحتتر میکنه:
● سایت اوپنیوپیام (openupm.com): جایی که میتونید پکیجها رو جستجو کنید، اطلاعاتشون رو ببینید و مستندات رو مطالعه کنید.
● ابزار OpenUPM CLI: یک ابزار خط فرمان که بهتون اجازه میده پکیجها رو نصب و مدیریت کنید.
انتشار پکیج در OpenUPM
شما هم میتونید پکیجهای خودتون رو در OpenUPM منتشر کنید!
● برای این کار، پکیج شما باید از ساختار UPM پیروی کنه.
● همچنین، کد شما باید متنباز باشه و روی گیتهاب (GitHub) یا پلتفرمهای مشابه موجود باشه.
● سپس، میتونید درخواست (pull request) بدید تا پکیج شما به لیست OpenUPM اضافه بشه.
نصب OpenUPM CLI و افزودن پکیج
برای استفاده از OpenUPM CLI، ابتدا باید Node.js رو روی سیستمتون نصب داشته باشید.
سپس، میتونید با دستور زیر OpenUPM CLI رو نصب کنید:
npm install -g openupm-cli
بعد از نصب، برای افزودن یک پکیج به پروژه یونیتی خودتون، کافیه در پوشه پروژه دستور زیر رو اجرا کنید.
به عنوان مثال، برای پکیج خودم `wold.magic.webads`، دستور به این صورته:
openupm add wold.magic.webads
با این کار، پکیج به پروژه شما اضافه میشه و میتونید ازش استفاده کنید.
🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
🔥8
🎨 فرمتدهی متن در Debug.Log یونیتی با HTML
در
🔹 ضخیمکردن متن — `<b>`
نمایش متن با ضخامت بیشتر در خروجی:
🔹 کجکردن متن — `<i>`
نمایش متن به حالت ایتالیک (کج):
🔹 تغییر رنگ — `<color>`
نمایش متن با رنگ دلخواه:
🔹 تغییر اندازه — `<size>`
تنظیم اندازه فونت متن:
🔹 ترکیبی — `<b><color>`
نمایش متن با ضخامت و رنگ همزمان:
این تگها به شما کمک میکنند متنهای دیباگ را زیبا، خواناتر و معنیدارتر کنید و موارد مهم را بهسرعت از بقیه تشخیص دهید.
🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
در
Debug.Log یونیتی میتوان از تگهای HTML برای فرمتدهی به متن استفاده کرد تا اطلاعات بهتر سازماندهی و برجسته شوند. در ادامه، چند نمونه پرکاربرد را میبینید:🔹 ضخیمکردن متن — `<b>`
نمایش متن با ضخامت بیشتر در خروجی:
Debug.Log("<b>Important Message:</b> This is an important message.");🔹 کجکردن متن — `<i>`
نمایش متن به حالت ایتالیک (کج):
Debug.Log("<i>Notice:</i> This is a notice.");🔹 تغییر رنگ — `<color>`
نمایش متن با رنگ دلخواه:
Debug.Log("<color=red>Error:</color> This is an error message."); // نمایش قرمز🔹 تغییر اندازه — `<size>`
تنظیم اندازه فونت متن:
Debug.Log("<size=20>Big Message:</size> This is a big message."); // اندازه 20 پیکسل🔹 ترکیبی — `<b><color>`
نمایش متن با ضخامت و رنگ همزمان:
Debug.Log("<b><color=blue>Info:</color></b> This is an informational message."); // آبی و ضخیماین تگها به شما کمک میکنند متنهای دیباگ را زیبا، خواناتر و معنیدارتر کنید و موارد مهم را بهسرعت از بقیه تشخیص دهید.
🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
❤6
🛡 حفظ اشیاء در زمان بارگذاری صحنه
متد
مثال:
فرض کنید یک شیء به نام "GameManager" داریم که شامل اطلاعات وضعیت بازی و دسترسی به منابع مهم است. میخواهیم این شیء را در تمامی صحنهها حفظ کنیم تا اطلاعات بازی از دست نرود. برای این منظور، میتوانیم از متد DontDestroyOnLoad استفاده کنیم.
در این مثال، وقتی که "GameManager" بارگذاری میشود، ما از DontDestroyOnLoad استفاده میکنیم تا از از دست رفتن "GameManager" در هر تغییر صحنه جلوگیری کنیم. این کار باعث میشود که "GameManager" در تمامی صحنههای بازی حضور داشته باشد و اطلاعات مهم بازی در آن حفظ شود.
توضیحات تکمیلی و نکات مهم
● ✅ حفظ کل هیرارکی: وقتی
● ⚠️ اجتناب از تکراری شدن: اگر هنگام بارگذاری چندباره صحنه یا بازگشت به منوی اصلی یک Prefab که شامل GameManager است دوباره ساخته شود، نسخههای تکراری ایجاد میشود. الگوی singleton (مانند نمونه بالا) برای حذف اشیاء تکراری ضروری است.
● 🧠 محدودیت در Editor / Domain Reload: در زمانهایی که Unity Domain Reload انجام میدهد (مثلاً هنگام ورود/خروج از Play با تنظیمات پیشفرض)، اشیاء با
● 🔌 ارجاع به اشیاء صحنهای: اگر GameManager به اشیاء خاصی در یک صحنه ارجاع میدهد، آن ارجاعات ممکن است پس از لود صحنه جدید نامعتبر شوند. بهتر است ارجاعات وابسته به صحنه را هنگام
● 🧹 رویدادها و مموریلیک: اشیاء ماندگار ممکن است به ایونتها یا دلیگیتها subscribe کنند — حتماً در صورت نیاز unsubscribe کن یا در Destroy/OnDisable تمیزکاری را انجام بده تا مموریلیک رخ ندهد.
🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
متد
DontDestroyOnLoad به عنوان یک متد استاتیک در Unity استفاده میشود تا از از دست رفتن یک شیء در زمان بارگذاری صحنه جلوگیری کند. این متد معمولاً برای حفظ اجزاء مهمی که باید در تمامی صحنهها حضور داشته باشند، مورد استفاده قرار میگیرد، مثل اجزاء UI یا منابع مرکزی.مثال:
فرض کنید یک شیء به نام "GameManager" داریم که شامل اطلاعات وضعیت بازی و دسترسی به منابع مهم است. میخواهیم این شیء را در تمامی صحنهها حفظ کنیم تا اطلاعات بازی از دست نرود. برای این منظور، میتوانیم از متد DontDestroyOnLoad استفاده کنیم.
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager instance;
void Awake()
{
// بررسی وجود چنین شیءی
if (instance == null)
{
// اگر شیء وجود نداشت، این شیء را تنظیم کنید
instance = this;
// این شیء از بین نمیرود و در تمامی صحنهها حفظ میشود
DontDestroyOnLoad(gameObject);
}
else
{
// اگر شیء قبلاً تنظیم شده بود، این شیء را از بین ببرید
Destroy(gameObject);
}
}
// توابع و منطق بازی اینجا اضافه شود
}
در این مثال، وقتی که "GameManager" بارگذاری میشود، ما از DontDestroyOnLoad استفاده میکنیم تا از از دست رفتن "GameManager" در هر تغییر صحنه جلوگیری کنیم. این کار باعث میشود که "GameManager" در تمامی صحنههای بازی حضور داشته باشد و اطلاعات مهم بازی در آن حفظ شود.
توضیحات تکمیلی و نکات مهم
● ✅ حفظ کل هیرارکی: وقتی
DontDestroyOnLoad(gameObject) را صدا میزنید، تمام فرزندان آن گیمابجکت هم حفظ میشوند — کل هیرارکی به صحنهی خاصی منتقل میشود که یونیتی برای اشیاء ماندگار در نظر میگیرد.● ⚠️ اجتناب از تکراری شدن: اگر هنگام بارگذاری چندباره صحنه یا بازگشت به منوی اصلی یک Prefab که شامل GameManager است دوباره ساخته شود، نسخههای تکراری ایجاد میشود. الگوی singleton (مانند نمونه بالا) برای حذف اشیاء تکراری ضروری است.
● 🧠 محدودیت در Editor / Domain Reload: در زمانهایی که Unity Domain Reload انجام میدهد (مثلاً هنگام ورود/خروج از Play با تنظیمات پیشفرض)، اشیاء با
DontDestroyOnLoad ممکن است رفتار متفاوتی نشان دهند؛ تست در Editor ضروری است.● 🔌 ارجاع به اشیاء صحنهای: اگر GameManager به اشیاء خاصی در یک صحنه ارجاع میدهد، آن ارجاعات ممکن است پس از لود صحنه جدید نامعتبر شوند. بهتر است ارجاعات وابسته به صحنه را هنگام
sceneLoaded یا پس از لود دوباره مقداردهی کنی.● 🧹 رویدادها و مموریلیک: اشیاء ماندگار ممکن است به ایونتها یا دلیگیتها subscribe کنند — حتماً در صورت نیاز unsubscribe کن یا در Destroy/OnDisable تمیزکاری را انجام بده تا مموریلیک رخ ندهد.
🔖 #GameDev, #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
🔥8❤1
پلتفرمر 2D در Unity — حرکت و پرش ساده 🎮
در این پست یک آموزش عملی و واقعی از مجموعههای رسمی Unity برای ساخت کنترلر سادهٔ بازیکن در بازیهای 2D خلاصه شده است. مرجع اصلی: Unity Learn - 2D Platformer و مستندات Rigidbody2D.
نکات کلیدی:
• ایجاد پروژه 2D و اضافه کردن Tilemap یا صحنهٔ ساده.
• اضافه کردن Rigidbody2D و Collider2D به بازیکن.
• نوشتن اسکریپت C# برای حرکت افقی و پرش با استفاده از ورودیهای پیشفرض.
• استفاده از انیماتور برای حالتهای Idle/Run/Jump (اختیاری).
نمونهٔ کد عملی (صحت با مستندات Unity):
چرا این مفید است: این الگو پایهٔ اکثر بازیهای پلتفرمر را میسازد — کنترل دقیق حرکت، پردازش فیزیک ساده و امکان توسعه برای انیمیشن و سرور/ورژن موبایل. مثالهای واقعی را در پروژهٔ آموزشی Unity Learn خواهید یافت.
یک خط پایانی: کد را در صحنه خود امتحان کنید و نتیجه را با دیگران به اشتراک بگذارید.
🔖 #GameDev #بازیسازی #unity #2d #platformer #csharp #game_dev
👤 Developix
💎 Channel: @DevelopixGame
در این پست یک آموزش عملی و واقعی از مجموعههای رسمی Unity برای ساخت کنترلر سادهٔ بازیکن در بازیهای 2D خلاصه شده است. مرجع اصلی: Unity Learn - 2D Platformer و مستندات Rigidbody2D.
نکات کلیدی:
• ایجاد پروژه 2D و اضافه کردن Tilemap یا صحنهٔ ساده.
• اضافه کردن Rigidbody2D و Collider2D به بازیکن.
• نوشتن اسکریپت C# برای حرکت افقی و پرش با استفاده از ورودیهای پیشفرض.
• استفاده از انیماتور برای حالتهای Idle/Run/Jump (اختیاری).
نمونهٔ کد عملی (صحت با مستندات Unity):
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed = 5f;
public float jumpForce = 7f;
Rigidbody2D rb;
bool grounded;
void Awake() { rb = GetComponent<Rigidbody2D>(); }
void Update()
{
float h = Input.GetAxis("Horizontal");
rb.velocity = new Vector2(h * speed, rb.velocity.y);
if (Input.GetButtonDown("Jump") && grounded) rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
void OnCollisionEnter2D(Collision2D c) { grounded = true; }
void OnCollisionExit2D(Collision2D c) { grounded = false; }
}
چرا این مفید است: این الگو پایهٔ اکثر بازیهای پلتفرمر را میسازد — کنترل دقیق حرکت، پردازش فیزیک ساده و امکان توسعه برای انیمیشن و سرور/ورژن موبایل. مثالهای واقعی را در پروژهٔ آموزشی Unity Learn خواهید یافت.
یک خط پایانی: کد را در صحنه خود امتحان کنید و نتیجه را با دیگران به اشتراک بگذارید.
🔖 #GameDev #بازیسازی #unity #2d #platformer #csharp #game_dev
👤 Developix
💎 Channel: @DevelopixGame
❤3👎1
🚀 کدام API گرافیکی؟ مقایسه OpenGL، DirectX و Vulkan
✨ اصلا API گرافیکی چیه؟
رابط نرمافزاری گرافیکی (API) مثل یک «پل ارتباطی» عمل میکند. این واسط، دستورات برنامه (مثل یک بازی) را به زبان قابل فهم برای کارت گرافیک (GPU) شما ترجمه و ارسال میکند.
برنامهنویس بدون درگیری با جزئیات سختافزاری، فقط با دستورات استاندارد API کار میکند.
🎮 مقایسه APIهای گرافیکی اصلی:
● 1️⃣ اوپنجیال (OpenGL): قدیمی اما کارآمد (مخفف Open Graphics Library به معنی کتابخانه گرافیکی باز)
★ وضعیت: API قدیمی و سطح بالا (High-Level).
★ مدیریت: کدنویسی برای توسعهدهنده آسانتر است.
★ عملکرد: بیشتر بار کاری روی CPU میافتد (سربار CPU بالا).
★ پلتفرم: ✅ کراسپلتفرم (قابل استفاده در اکثر سیستمعاملها).
★ خلاصه: ساده، اما در کارهای سنگین کُندتر.
● 2️⃣ دایرکتاکس (DirectX): سلطان ویندوز (مخفف Direct eXtension به معنی توسعه مستقیم)
★ وضعیت: مخصوص شرکت مایکروسافت (ویندوز و Xbox).
★ نسخه جدید (DX12): یک API سطح پایین و بسیار بهینه که مدیریت منابع را بهبود داده است.
★ عملکرد: مدیریت عالی CPU و GPU، تضمین فریمریت بالاتر در پلتفرمهای مایکروسافت.
★ محدودیت: ❌ فقط برای پلتفرمهای مایکروسافت.
★ خلاصه: سریع، اما انحصاری.
● 3️⃣ وولکان (Vulkan): آینده کراسپلتفرم (وولکان یک اسم خاص لاتین به معنی آتشفشان یا ایزد آتش است و نماد قدرت و انفجار پرفورمنس آن است.)
★ وضعیت: API سطح پایین (Low-Level) و بسیار قدرتمند.
★ مدیریت: به GPU دسترسی مستقیمتر میدهد و سربار CPU را شدیداً کاهش میدهد.
★ ویژگی کلیدی: بهرهگیری کامل از قابلیت چندنخی (Multithreading) و CPUهای چند هستهای.
★ پلتفرم: ✅ کراسپلتفرم (در اندروید، لینوکس، ویندوز و...).
★ نکته مهم: Vulkan توسط گروه Khronos (همان سازنده OpenGL) ساخته شد تا محدودیتهای OpenGL را برطرف کرده و با DX12 رقابت کند.
★ خلاصه: بهینهترین، چندپلتفرمه، اما نیاز به مدیریت دقیق دارد.
💡 نتیجهگیری:
★ اوپنجیال: سادگی و سازگاری بالا، اما پرفورمنس محدود.
★ دایرکتاکس: بهترین پرفورمنس در ویندوز، اما انحصاری.
★ وولکان: بیشترین پرفورمنس و کراسپلتفرم، جانشین مدرن OpenGL.
🔖 #GameDev #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
✨ اصلا API گرافیکی چیه؟
رابط نرمافزاری گرافیکی (API) مثل یک «پل ارتباطی» عمل میکند. این واسط، دستورات برنامه (مثل یک بازی) را به زبان قابل فهم برای کارت گرافیک (GPU) شما ترجمه و ارسال میکند.
برنامهنویس بدون درگیری با جزئیات سختافزاری، فقط با دستورات استاندارد API کار میکند.
🎮 مقایسه APIهای گرافیکی اصلی:
● 1️⃣ اوپنجیال (OpenGL): قدیمی اما کارآمد (مخفف Open Graphics Library به معنی کتابخانه گرافیکی باز)
★ وضعیت: API قدیمی و سطح بالا (High-Level).
★ مدیریت: کدنویسی برای توسعهدهنده آسانتر است.
★ عملکرد: بیشتر بار کاری روی CPU میافتد (سربار CPU بالا).
★ پلتفرم: ✅ کراسپلتفرم (قابل استفاده در اکثر سیستمعاملها).
★ خلاصه: ساده، اما در کارهای سنگین کُندتر.
● 2️⃣ دایرکتاکس (DirectX): سلطان ویندوز (مخفف Direct eXtension به معنی توسعه مستقیم)
★ وضعیت: مخصوص شرکت مایکروسافت (ویندوز و Xbox).
★ نسخه جدید (DX12): یک API سطح پایین و بسیار بهینه که مدیریت منابع را بهبود داده است.
★ عملکرد: مدیریت عالی CPU و GPU، تضمین فریمریت بالاتر در پلتفرمهای مایکروسافت.
★ محدودیت: ❌ فقط برای پلتفرمهای مایکروسافت.
★ خلاصه: سریع، اما انحصاری.
● 3️⃣ وولکان (Vulkan): آینده کراسپلتفرم (وولکان یک اسم خاص لاتین به معنی آتشفشان یا ایزد آتش است و نماد قدرت و انفجار پرفورمنس آن است.)
★ وضعیت: API سطح پایین (Low-Level) و بسیار قدرتمند.
★ مدیریت: به GPU دسترسی مستقیمتر میدهد و سربار CPU را شدیداً کاهش میدهد.
★ ویژگی کلیدی: بهرهگیری کامل از قابلیت چندنخی (Multithreading) و CPUهای چند هستهای.
★ پلتفرم: ✅ کراسپلتفرم (در اندروید، لینوکس، ویندوز و...).
★ نکته مهم: Vulkan توسط گروه Khronos (همان سازنده OpenGL) ساخته شد تا محدودیتهای OpenGL را برطرف کرده و با DX12 رقابت کند.
★ خلاصه: بهینهترین، چندپلتفرمه، اما نیاز به مدیریت دقیق دارد.
💡 نتیجهگیری:
★ اوپنجیال: سادگی و سازگاری بالا، اما پرفورمنس محدود.
★ دایرکتاکس: بهترین پرفورمنس در ویندوز، اما انحصاری.
★ وولکان: بیشترین پرفورمنس و کراسپلتفرم، جانشین مدرن OpenGL.
🔖 #GameDev #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
🔥8❤3
الگوی Observer در گیم دیولوپمنت: خداحافظ کدهای به هم چسبیده 👋
یکی از تمیزترین راهها برای مدیریت رویدادها در بازی، مخصوصاً توی Unity، استفاده از الگوی Observer است.
به جای این که هر سیستم مستقیماً به بقیه Reference بدهد و همهچیز به هم وابسته شود، رویداد تعریف میکنیم و بقیه فقط «گوش میدهند» 🎧
مثال کلاسیک: وقتی بازیکن سکه برمیدارد:
• سیستم امتیاز باید Score را زیاد کند
• UI باید امتیاز جدید را نمایش بدهد
• یک SoundManager باید افکت صدا پخش کند
اگر PlayerController همه اینها را مستقیم صدا بزند، وابستگیهای زیادی ساخته میشود و هر تغییر کوچک، چند فایل را تحت تأثیر قرار میدهد. این ضد Clean Code است.
با Observer، Player فقط میگوید: «رویداد CoinCollected اتفاق افتاد». بقیه سیستمها خودشـان Subscribe میشوند 👇
حالا Player فقط رویداد را فایر میکند و هیچ چیز دیگری را نمیشناسد:
سیستم امتیاز و UI فقط Subscribe میشوند:
چرا این معماری برای بازیها عالی است؟
• 🧩 Decoupling: Player هیچ اطلاعی از UI یا ScoreSystem ندارد؛ تست و تغییر سادهتر میشود.
• 🔌 افزودن سیستم جدید: فردا میتوان یک VFX جدید ساخت که فقط به همین رویداد Subscribe شود، بدون تغییر در Player.
• 🧹 Clean Code: تابعها یک مسئولیت مشخص دارند (نزدیک به اصل Single Responsibility).
استفاده از Observer توی پروژههای متوسط و بزرگ باعث میشود معماری بازی تمیزتر، قابلگسترشتر و قابلدیباگتر بماند.
قدمبهقدم بخشی از منطقهای به هم چسبیده را به رویدادها منتقل کنید و نتیجه را در سرعت توسعه و Refactor حس کنید 🚀
🔖 #GameDev #بازیسازی #Observer #EventSystem #Unity #CleanCode #GameArchitecture #C#
👤 Developix
💎 Channel: @DevelopixGame
یکی از تمیزترین راهها برای مدیریت رویدادها در بازی، مخصوصاً توی Unity، استفاده از الگوی Observer است.
به جای این که هر سیستم مستقیماً به بقیه Reference بدهد و همهچیز به هم وابسته شود، رویداد تعریف میکنیم و بقیه فقط «گوش میدهند» 🎧
مثال کلاسیک: وقتی بازیکن سکه برمیدارد:
• سیستم امتیاز باید Score را زیاد کند
• UI باید امتیاز جدید را نمایش بدهد
• یک SoundManager باید افکت صدا پخش کند
اگر PlayerController همه اینها را مستقیم صدا بزند، وابستگیهای زیادی ساخته میشود و هر تغییر کوچک، چند فایل را تحت تأثیر قرار میدهد. این ضد Clean Code است.
با Observer، Player فقط میگوید: «رویداد CoinCollected اتفاق افتاد». بقیه سیستمها خودشـان Subscribe میشوند 👇
using System;
using UnityEngine;
public class GameEvents : MonoBehaviour
{
public static GameEvents Instance;
public event Action<int> OnCoinCollected;
void Awake()
{
if (Instance == null)
Instance = this;
else
Destroy(gameObject);
}
public void CoinCollected(int amount)
{
OnCoinCollected?.Invoke(amount);
}
}
حالا Player فقط رویداد را فایر میکند و هیچ چیز دیگری را نمیشناسد:
public class PlayerCoins : MonoBehaviour
{
public void CollectCoin(int amount)
{
GameEvents.Instance.CoinCollected(amount);
}
}
سیستم امتیاز و UI فقط Subscribe میشوند:
public class ScoreSystem : MonoBehaviour
{
int score;
void OnEnable()
{
GameEvents.Instance.OnCoinCollected += HandleCoin;
}
void OnDisable()
{
GameEvents.Instance.OnCoinCollected -= HandleCoin;
}
void HandleCoin(int amount)
{
score += amount;
// Update save, analytics, etc.
}
}
چرا این معماری برای بازیها عالی است؟
• 🧩 Decoupling: Player هیچ اطلاعی از UI یا ScoreSystem ندارد؛ تست و تغییر سادهتر میشود.
• 🔌 افزودن سیستم جدید: فردا میتوان یک VFX جدید ساخت که فقط به همین رویداد Subscribe شود، بدون تغییر در Player.
• 🧹 Clean Code: تابعها یک مسئولیت مشخص دارند (نزدیک به اصل Single Responsibility).
استفاده از Observer توی پروژههای متوسط و بزرگ باعث میشود معماری بازی تمیزتر، قابلگسترشتر و قابلدیباگتر بماند.
قدمبهقدم بخشی از منطقهای به هم چسبیده را به رویدادها منتقل کنید و نتیجه را در سرعت توسعه و Refactor حس کنید 🚀
🔖 #GameDev #بازیسازی #Observer #EventSystem #Unity #CleanCode #GameArchitecture #C#
👤 Developix
💎 Channel: @DevelopixGame
🔥6👍1
🎮 کنترل حرکت نرم با deltaTime
یکی از اشتباههای رایج تو بازیهای ۲بعدی Unity اینه که سرعت حرکت یا انیمیشن رو مستقیم به frame rate گره میزنیم. روی سیستم قوی، همهچی اوکیه؛ ولی روی سیستم ضعیف، کاراکتر کند میشه یا حرکتها تیکتیک میخوره 😅
راهحل سادهست: همیشه حرکت، فیزیک ساده و انیمیشنهای محاسباتی رو به Time.deltaTime ضرب کن تا وابسته به فریم نباشن.
🔹 مثال بد (وابسته به فریم):
روی ۳۰fps کاراکتر کندتر از ۱۴۴fps حرکت میکنه، چون در هر فریم ۵ واحد میره جلو.
🔹 مثال درست (frame independent):
حالا speed بر حسب «واحد در ثانیه» تعریف شده و deltaTime تضمین میکنه در هر ثانیه تقریباً همون مقدار طی بشه، چه ۳۰fps باشه چه ۱۲۰fps ✅
📌 نکتهها:
- برای حرکتها، lerp دستی، fadeها و هر چیز «وابسته به زمان»، از Time.deltaTime استفاده کن.
- برای فیزیک Rigidbody بهتره منطق اصلی تو FixedUpdate باشه و از Time.fixedDeltaTime کمک بگیری.
- اگر بازی Pause میشه، میشه از Time.unscaledDeltaTime برای UI Animationهایی که نباید متوقف بشن استفاده کرد.
این ریزهکاری ساده کمک میکنه بازی روی دستگاههای مختلف تجربهای یکسان و حرفهای داشته باشه 🚀
منبع رسمی Unity:
Unity Time.deltaTime Docs
🔖 #GameDev #بازیسازی #Unity #deltaTime #performance #movement #2D #frame_rate
👤 Developix
💎 Channel: @DevelopixGame
یکی از اشتباههای رایج تو بازیهای ۲بعدی Unity اینه که سرعت حرکت یا انیمیشن رو مستقیم به frame rate گره میزنیم. روی سیستم قوی، همهچی اوکیه؛ ولی روی سیستم ضعیف، کاراکتر کند میشه یا حرکتها تیکتیک میخوره 😅
راهحل سادهست: همیشه حرکت، فیزیک ساده و انیمیشنهای محاسباتی رو به Time.deltaTime ضرب کن تا وابسته به فریم نباشن.
🔹 مثال بد (وابسته به فریم):
void Update()
{
transform.position += Vector3.right * 5f;
}
روی ۳۰fps کاراکتر کندتر از ۱۴۴fps حرکت میکنه، چون در هر فریم ۵ واحد میره جلو.
🔹 مثال درست (frame independent):
void Update()
{
float speed = 5f; // units per second
transform.position += Vector3.right * speed * Time.deltaTime;
}
حالا speed بر حسب «واحد در ثانیه» تعریف شده و deltaTime تضمین میکنه در هر ثانیه تقریباً همون مقدار طی بشه، چه ۳۰fps باشه چه ۱۲۰fps ✅
📌 نکتهها:
- برای حرکتها، lerp دستی، fadeها و هر چیز «وابسته به زمان»، از Time.deltaTime استفاده کن.
- برای فیزیک Rigidbody بهتره منطق اصلی تو FixedUpdate باشه و از Time.fixedDeltaTime کمک بگیری.
- اگر بازی Pause میشه، میشه از Time.unscaledDeltaTime برای UI Animationهایی که نباید متوقف بشن استفاده کرد.
این ریزهکاری ساده کمک میکنه بازی روی دستگاههای مختلف تجربهای یکسان و حرفهای داشته باشه 🚀
منبع رسمی Unity:
Unity Time.deltaTime Docs
🔖 #GameDev #بازیسازی #Unity #deltaTime #performance #movement #2D #frame_rate
👤 Developix
💎 Channel: @DevelopixGame
👍3
مدیریت State بازی بدون if-های بیانتها 🎮
یکی از جاهایی که کد خیلی سریع شلوغ میشود، مدیریت حالتهای مختلف بازی است:
🏁 منوی اصلی
🕹️ گیمپلی
⏸️ Pause
💀 Game Over
اگر این حالتها را با یک عالمه
اینجاست که State Pattern کمک میکند کد تمیزتر، قابلگسترشتر و مخصوصاً برای پروژههای بلندمدت قابلتحمل بماند 😄
ایده State Pattern در بازی
هر حالت بازی در یک کلاس جدا پیادهسازی میشود که یک اینترفیس مشترک دارد. یک کلاس GameStateMachine فقط مسئول این است که بداند الان در کدام State هستیم و چه زمانی State را عوض کند.
این کار چند مزیت مهم دارد:
• اضافهکردن حالت جدید بدون دستزدن به بقیه 4 کدها ✅
• حذف if/else عظیم ✅
• راحتتر شدن دیباگ و تست هر حالت جداگانه ✅
نمونه ساده در Unity (C#)
در یک
نکات عملی برای پروژههای بازی
• برای Stateهای زیاد (مثلاً لابی آنلاین، لودینگ، سینماتیکها)، این الگو جلوی God Class شدن
• انتقال بین Stateها را میتوان در یک کلاس مرکزی (یا ScriptableObject در Unity) تعریف کرد تا منطق گذارها هم مرتب بماند.
• در پروژههای تیمی، این معماری کمک میکند هر نفر روی یک State کار کند بدون اینکه توی کد بقیه خرابکاری شود.
منابع خوب برای مرور این ایده:
Game Programming Patterns - State
Unity Learn
کدهای مدیریت State اگر از همین ابتدا تمیز طراحی شوند، مقیاسپذیری پروژه خیلی راحتتر میشود و تغییر دیزاین بازی دیگر معادل بازنویسی نصف پروژه نخواهد بود 🚀
🔖 #GameDev #بازیسازی #State_Pattern #Game_Architecture #Unity #C# #Clean_Code #Game_States
👤 Developix
💎 Channel: @DevelopixGame
یکی از جاهایی که کد خیلی سریع شلوغ میشود، مدیریت حالتهای مختلف بازی است:
🏁 منوی اصلی
🕹️ گیمپلی
⏸️ Pause
💀 Game Over
اگر این حالتها را با یک عالمه
if/else یا switch در یک کلاس غولآسا کنترل کنیم، بهمرور هر تغییر کوچک تبدیل به کابوس میشود.اینجاست که State Pattern کمک میکند کد تمیزتر، قابلگسترشتر و مخصوصاً برای پروژههای بلندمدت قابلتحمل بماند 😄
ایده State Pattern در بازی
هر حالت بازی در یک کلاس جدا پیادهسازی میشود که یک اینترفیس مشترک دارد. یک کلاس GameStateMachine فقط مسئول این است که بداند الان در کدام State هستیم و چه زمانی State را عوض کند.
این کار چند مزیت مهم دارد:
• اضافهکردن حالت جدید بدون دستزدن به بقیه 4 کدها ✅
• حذف if/else عظیم ✅
• راحتتر شدن دیباگ و تست هر حالت جداگانه ✅
نمونه ساده در Unity (C#)
public interface IGameState
{
void Enter();
void Exit();
void Tick();
}
public class GameplayState : IGameState
{
public void Enter()
{
Debug.Log("Enter Gameplay");
Time.timeScale = 1f;
}
public void Exit()
{
Debug.Log("Exit Gameplay");
}
public void Tick()
{
// منطق گیمپلی
}
}
public class PauseState : IGameState
{
public void Enter()
{
Debug.Log("Enter Pause");
Time.timeScale = 0f;
}
public void Exit()
{
Debug.Log("Exit Pause");
Time.timeScale = 1f;
}
public void Tick()
{
// منطق منوی Pause
}
}
public class GameStateMachine
{
private IGameState _current;
public void ChangeState(IGameState next)
{
_current 3F.Exit();
_current = next;
_current.Enter();
}
public void Tick()
{
_current 3F.Tick();
}
}
در یک
MonoBehaviour میتوان یک نمونه از GameStateMachine ساخت، State اولیه را تنظیم کرد و در Update فقط Tick() را صدا زد. با این کار منطق مدیریت State از بقیه کد جدا میشود و ساختار پروژه تمیزتر میماند.نکات عملی برای پروژههای بازی
• برای Stateهای زیاد (مثلاً لابی آنلاین، لودینگ، سینماتیکها)، این الگو جلوی God Class شدن
GameManager را میگیرد.• انتقال بین Stateها را میتوان در یک کلاس مرکزی (یا ScriptableObject در Unity) تعریف کرد تا منطق گذارها هم مرتب بماند.
• در پروژههای تیمی، این معماری کمک میکند هر نفر روی یک State کار کند بدون اینکه توی کد بقیه خرابکاری شود.
منابع خوب برای مرور این ایده:
Game Programming Patterns - State
Unity Learn
کدهای مدیریت State اگر از همین ابتدا تمیز طراحی شوند، مقیاسپذیری پروژه خیلی راحتتر میشود و تغییر دیزاین بازی دیگر معادل بازنویسی نصف پروژه نخواهد بود 🚀
🔖 #GameDev #بازیسازی #State_Pattern #Game_Architecture #Unity #C# #Clean_Code #Game_States
👤 Developix
💎 Channel: @DevelopixGame
🔥5👍1
در این کد Python که شبیه یک event loop ساده برای بروزرسانی وضعیت چند entity در یک بازی است، خروجی نهایی چاپشده روی ترمینال چیست؟
به ترتیب و شکل دقیق متن خروجی (شامل فاصلهها و خطهای جدید) دقت کنید و کل خروجی را بنویسید.
🔖 #GameDev #بازیسازی
👤 Developix
💎 Channel: @DevelopixGame
به ترتیب و شکل دقیق متن خروجی (شامل فاصلهها و خطهای جدید) دقت کنید و کل خروجی را بنویسید.
# Game-like update loop with shared state
positions = {"player": [0, 0], "enemy": [5, 5]}
snapshots = []
for tick in range(3):
for name, pos in positions.items():
dx = 1 if name == "player" else -1
dy = 0 if name == "player" else -1
pos[0] += dx
pos[1] += dy
snapshots.append((tick, list(positions.values())))
for tick, state in snapshots:
print(f"tick {tick} => {state}")
🔖 #GameDev #بازیسازی
👤 Developix
💎 Channel: @DevelopixGame
👍3