| کانال توسعه‌دهندگان بازی | – Telegram
| کانال توسعه‌دهندگان بازی |
408 subscribers
3 photos
6 links
⭕️ کانال توسعه‌دهندگان بازی دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
🎶 مدیریت صدا با AudioSource در یونیتی: افزودن صدا به بازی + شبیه‌سازی صدای موتور ماشین

یکی از اجزای مهم برای مدیریت صداها در یونیتی، AudioSource است. این کامپوننت به شما اجازه می‌دهد تا صداها را به شکل پویا و متنوع به بازی اضافه کنید. در اینجا روش‌های استفاده از AudioSource را توضیح می‌دهیم و سپس مثالی کاربردی برای شبیه‌سازی صدای موتور ماشین ارائه می‌کنیم.

۱. اضافه کردن AudioSource به شیء
ابتدا به شیء مورد نظر در صحنه AudioSource اضافه کنید:
- شیء مورد نظر را انتخاب کنید.
- به منوی Add Component بروید و AudioSource را اضافه کنید.

۲. انتخاب فایل صوتی
برای پخش صدا، به یک Audio Clip نیاز دارید. فایل صوتی خود را به قسمت AudioClip در AudioSource اختصاص دهید. فایل‌های صوتی باید در فرمت‌های پشتیبانی‌شده یونیتی مانند WAV یا MP3 باشند.

۳. پخش و توقف صدا (Play و Stop)
با استفاده از متدهای Play و Stop می‌توانید صدا را کنترل کنید.

AudioSource audioSource;

void Start()
{
audioSource = GetComponent<AudioSource>();
}

void Update()
{
if (Input.GetKeyDown(KeyCode.P))
{
audioSource.Play(); // شروع پخش صدا
}
if (Input.GetKeyDown(KeyCode.S))
{
audioSource.Stop(); // توقف صدا
}
}


۴. تنظیم بلندی صدا
برای کنترل بلندی صدا، مقدار Volume را تغییر دهید:

audioSource.volume = 0.5f; // تنظیم صدا به ۵۰٪


۵. پخش تکراری (Loop)
با فعال کردن گزینه Loop می‌توانید صدا را به صورت تکراری پخش کنید.

audioSource.loop = true; // تنظیم برای پخش تکراری


۶. شبیه‌سازی صدای موتور ماشین 🚗
برای بازی‌های ماشینی، می‌توانید صدای موتور ماشین را با استفاده از تغییر Pitch (گام) صدا بر اساس سرعت شبیه‌سازی کنید. فرض کنیم که متغیر speed سرعت ماشین را نشان می‌دهد. با تغییر `pitch`، صدای موتور واقعی‌تر خواهد شد.

public class CarSound : MonoBehaviour
{
public AudioSource engineSound;
public float speed;

void Update()
{
// فرض می‌کنیم سرعت ماشین بین 0 و 100 واحد است
// تنظیم pitch بر اساس سرعت ماشین
engineSound.pitch = 1.0f + (speed / 100); // افزایش pitch با افزایش سرعت
}
}


۷. پخش با تأخیر (PlayDelayed)
برای پخش صدا با تأخیر، از PlayDelayed استفاده کنید:

audioSource.PlayDelayed(2.0f); // پخش صدا با دو ثانیه تأخیر


---

این روش‌ها و مثال‌ها به شما کمک می‌کنند تا صداهای بازی خود را به شکل واقع‌گرایانه و با کنترل‌های پیشرفته مدیریت کنید.

🔖 #GameDev, #بازیسازی

👤 ali reza

💎 Channel: @DevelopixGame
5
💡 نورپردازی در یونیتی و انواع آن

نورپردازی یکی از اجزای اصلی در بازی‌سازی است و می‌تواند حس و حال صحنه‌ها را کاملاً متحول کند. در یونیتی، چندین نوع نور وجود دارد که هرکدام کاربرد خاص خود را دارند. با ترکیب این نورها، می‌توانید صحنه‌هایی زیبا و واقعی‌تر بسازید.

---

1. نور Directional Light ☀️
این نور شبیه‌ساز نور خورشید است که در کل صحنه به طور یکسان تابیده می‌شود. نور Directional جهت دارد و برای نورپردازی محیط‌های باز مثل نور خورشید یا ماه استفاده می‌شود.
کاربرد: مناسب برای محیط‌های خارجی و صحنه‌های با نورپردازی کلی و یکنواخت.

2. نور Point Light 💡
این نور از یک نقطه به اطراف پخش می‌شود، مانند لامپ که نور را به همه جهات می‌تاباند. در فاصله‌های دورتر ضعیف‌تر می‌شود و بیشتر در محیط‌های بسته کاربرد دارد.
کاربرد: شبیه‌سازی چراغ‌ها، مشعل‌ها یا هر منبع نوری نقطه‌ای در فضای بسته.

3. نور Spot Light 🔦
این نور از یک نقطه با زاویه خاص تابیده می‌شود، مثل نورافکن یا چراغ‌قوه که جهت مشخصی دارد.
کاربرد: برای ایجاد جلوه‌هایی مثل نورافکن صحنه یا چراغ‌های داخلی خانه.

4. نور Area Light 🌆 (فقط در HDRP)
نور Area از یک سطح وسیع تابیده و برای روشن کردن فضاهای بسته استفاده می‌شود. این نور تنها در رندر HDRP موجود است.
کاربرد: ایجاد نور طبیعی‌تر در فضاهایی مثل نور پنجره در اتاق.

5. نور Ambient Light 🌌
این نور روشنایی پایه صحنه را تأمین می‌کند و تنظیمات کلی روشنایی را برای محیط مشخص می‌کند. در یونیتی، از بخش Global Illumination تنظیم می‌شود.
کاربرد: مناسب برای تنظیم روشنایی عمومی صحنه.

---

نمونه کد برای شبیه‌سازی چرخه روز و شب با Directional Light
با استفاده از نور Directional و تغییر زاویه، می‌توان چرخه روز و شب 🌞🌜را شبیه‌سازی کرد:

public class DayNightCycle : MonoBehaviour
{
public Light directionalLight;

void Update()
{
// چرخش نور برای شبیه‌سازی روز و شب
directionalLight.transform.Rotate(Vector3.right * Time.deltaTime * 10);
}
}


---

🛠 نکات مهم:
- سایه‌ها (Shadows): فعال‌سازی سایه‌ها 🌑 برای طبیعی‌تر شدن نورپردازی کمک‌کننده است.
- شدت نور: برای جلوه طبیعی‌تر، شدت نورها را بر اساس محیط تنظیم کنید.
- بهینه‌سازی: استفاده از تعداد زیاد Point و Spot Light می‌تواند بر عملکرد بازی تأثیر بگذارد، پس فقط در جاهای ضروری استفاده کنید.

این تنظیمات، فضایی واقعی‌تر و جذاب‌تر برای بازی شما فراهم می‌کنند. 🌟

🔖 #GameDev, #بازیسازی

👤 ali reza

💎 Channel: @DevelopixGame
🔥31👍1
🕹 متدهای برخورد در یونیتی 🕹

متدهای برخورد یا Collision و Trigger ابزارهای بسیار مهمی برای مدیریت تعاملات فیزیکی بین اشیاء در بازی هستند. این متدها به شما امکان می‌دهند که واکنش‌های خاصی را هنگام وقوع برخوردها یا ورود به محدوده‌ی راه‌انداز تعریف کنید. 🌟

---

1️⃣ ورود به محدوده راه‌انداز - OnTriggerEnter

- توضیح: این متد وقتی فراخوانی می‌شود که یک شیء وارد محدوده‌ی راه‌انداز شود.
- نمونه کد:

  void OnTriggerEnter(Collider other)
{
Debug.Log("شیء وارد محدوده‌ی راه‌انداز شد: " + other.name);
}


📌 کاربرد: مناسب برای ایجاد رویدادهایی مانند باز کردن درها، فعال کردن تله‌ها و موارد مشابه.

---

2️⃣ باقی ماندن در محدوده راه‌انداز - OnTriggerStay
- توضیح: این متد به صورت پیوسته در هر فریم، تا زمانی که شیء در محدوده‌ی راه‌انداز باقی بماند، فراخوانی می‌شود.
- نمونه کد:

  void OnTriggerStay(Collider other)
{
Debug.Log("شیء هنوز در محدوده‌ی راه‌انداز است: " + other.name);
}


📌 کاربرد: مناسب برای اعمال اثرات پیوسته مثل کاهش سلامتی یا اعمال نیرو.

---

3️⃣ خروج از محدوده راه‌انداز - OnTriggerExit
- توضیح: وقتی شیء از محدوده‌ی راه‌انداز خارج می‌شود، این متد فراخوانی می‌شود.
- نمونه کد:

  void OnTriggerExit(Collider other)
{
Debug.Log("شیء از محدوده‌ی راه‌انداز خارج شد: " + other.name);
}


📌 کاربرد: متوقف کردن اثرات خاص یا اعلام خروج اشیاء.

---

4️⃣ آغاز برخورد فیزیکی - OnCollisionEnter
- توضیح: وقتی یک برخورد فیزیکی بین دو شیء رخ دهد، این متد فراخوانی می‌شود.
- نمونه کد:

  void OnCollisionEnter(Collision collision)
{
Debug.Log("برخورد فیزیکی با: " + collision.gameObject.name);
}


📌 کاربرد: شبیه‌سازی تخریب، ایجاد اثرات فیزیکی و غیره.

---

5️⃣ ادامه برخورد فیزیکی - OnCollisionStay
- توضیح: وقتی برخورد ادامه‌دار باشد، این متد به صورت پیوسته فراخوانی می‌شود.
- نمونه کد:

  void OnCollisionStay(Collision collision)
{
Debug.Log("هنوز در حال برخورد با: " + collision.gameObject.name);
}


📌 کاربرد: تأثیرات مداوم در طول برخورد.

---

6️⃣ پایان برخورد فیزیکی - OnCollisionExit
- توضیح: وقتی اشیاء از حالت برخورد خارج می‌شوند، این متد فراخوانی می‌شود.
- نمونه کد:

  void OnCollisionExit(Collision collision)
{
Debug.Log("پایان برخورد با: " + collision.gameObject.name);
}


📌 کاربرد: توقف اثرات برخورد.

---

🎮 تفاوت بین Collision و Trigger
- برای بررسی ورود، ماندن و خروج از محدوده، بدون شبیه‌سازی برخورد فیزیکی از Trigger استفاده می‌شود.
- برای شبیه‌سازی برخورد فیزیکی واقعی از Collision
استفاده می‌شود.

🔖 #GameDev, #بازیسازی

👤 ali reza

💎 Channel: @DevelopixGame
👍4
🔸 این‌روز‌ها با این قطعی برق‌های ناگهانی، احتمالا براتون پیش‌اومده که پیش‌رفتِ کارتون رو سیو نکرده باشید و زحماتتون با قطع شدن برق به‌هدر بره. اگر از یونیتی استفاده می‌کنید این پکیج می‌تونه توی این موقعیت‌ها نجات‌دهنده باشه:

🔗 Asset Store

🔖 #GameDev, #بازیسازی, #Unity, #یونیتی

👤 Mahdiyar

💎 Channel: @DevelopixGame
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Forwarded from Developix Support
🦾 زور بازوت رو نشون بده و جایزه ببر!
💰 یه مسابقه ۱۰۰ میلیون تومنی برای ساخت بازو (بات) و مینی‌اپ در اپلیکیشن بله

🎯 از استعدادت پول در بیار!
چطوری؟
بله با مسابقهٔ «زور بازوت رو نشون بده!» یک فرصت عالی برای مهندسین نرم‌افزار، وب دولوپر‌ها، صاحبان سایت‌ها و اپلیکیشن‌ها و تیم‌های محصول فراهم کرده که پاسخگوی این دغدغه‌هاست.

🎁 یه مسابقه با ۱۰۰ میلیون تومن جایزهٔ نقدی و ۱ میلیارد تومن اعتبار تبلیغات منتظرته! ♨️

📎همین الان در مسابقه
ثبت‌نام کن! ➡️

💬
کانال اخبار بازو دراپلیکیشن بله
کانال اطلاع‌رسانی بله | @BaleMessenger
📢 بهینه‌سازی پردازش‌ها در یونیتی با HPC#

🔹 در یونیتی، HPC# (High-Performance C#) یک نسخه بهینه‌شده از سی‌شارپ است که برای پردازش‌های سنگین و عملکرد بالا طراحی شده. این تکنولوژی با Burst Compiler و Job System ترکیب می‌شود تا بیشترین بهره را از CPU بگیرد. 🚀

💡 چرا باید از HPC# استفاده کنیم؟
سرعت: افزایش عملکرد در حد C++
موازی‌سازی: پردازش چندوظیفه‌ای با Job System
حافظه: کاهش مصرف رم و جلوگیری از Garbage Collection
بهینه‌سازی: مدیریت دستی حافظه با Native Containers

🔍 نیتیو کانتینرها (Native Containers) چیست و چرا اهمیت دارند؟
🛠 تعریف: Native Containers مجموعه‌ای از ساختارهای داده‌ای مانند NativeArray, NativeList, NativeQueue هستند که به جای مدیریت حافظه توسط Garbage Collector (GC)، حافظه را به‌طور دستی و مستقیم مدیریت می‌کنند.

⚡️ مزایا:

🔹 کاهش GC Alloc و Garbage Collection → حذف توقف‌های ناگهانی (Lag Spikes)
🔹 دسترسی مستقیم به حافظه → سرعت پردازش بالاتر بدون تأخیر
🔹 حافظه کش‌پسند (Cache-Friendly Layout) → افزایش کارایی CPU

🚀 چرا نیتیو کانتینرها سریع‌ترند؟
💡 پردازش: حافظه رم دارای Cache Line است که داده‌ها را برای پردازش سریع نگه می‌دارد. ساختارهای سنتی مثل List<T> داده‌ها را پراکنده در حافظه (Heap Allocation) ذخیره می‌کنند، اما Native Containers داده‌ها را پیوسته نگه می‌دارند (Stack/Native Heap Allocation).

نتیجه:
- پردازنده می‌تواند داده‌های مورد نیاز را در یک مرحله (Memory Fetch) بارگذاری کند.
- دیگر نیازی به چندین بار خواندن حافظه اصلی نیست که باعث کاهش سرعت اجرا می‌شود.

🎯 چگونه HPC# به بهینه‌سازی بازی‌ها کمک می‌کند؟
🎮 بازی‌های سنگین: مناسب برای شبیه‌سازی‌های پیچیده مانند فیزیک و هوش مصنوعی
📈 افزایش FPS: کاهش لگ و افزایش نرخ فریم در پروژه‌های سنگین
🧠 مدیریت هوشمندانه حافظه: اجرای پردازش‌های چندنخی (Multithreading) و کنترل بهتر CPU

🔥 اگر می‌خواهید بازی‌تون سریع‌تر، بهینه‌تر و بدون لگ اجرا بشه، HPC# و Native Containers رو جدی بگیرید! 🚀

🔖 #GameDev, #بازیسازی

👤 ali reza

💎 Channel: @DevelopixGame
🔥4
🎯 آشنایی با Platform-Specific Code توی یونیتی

خیلی وقتا توی توسعه‌ی بازی‌هات ممکنه بخوای برای هر پلتفرم یه رفتار خاص بنویسی. مثلا یه کدی فقط روی سرور اجرا شه، یا یه بخش فقط برای WebGL فعال باشه. اینجاست که Platform-Specific Code به دادمون می‌رسه!

یونیتی یه سری پیش‌پردازنده (Preprocessor Directive) داره که باهاشون می‌تونی دقیقا مشخص کنی کد برای چه پلتفرمی اجرا بشه.

🔧 مثال کاربردی:

void Start()
{
#if UNITY_SERVER
Debug.Log("این کد فقط در سرور اجرا می‌شود.");
StartServer();

#elif UNITY_WEBGL
Debug.Log("این کد فقط در WebGL اجرا می‌شود.");
ConnectToServer();

#elif UNITY_ANDROID
Debug.Log("این کد فقط در اندروید اجرا می‌شود.");

#else
Debug.Log("این کد در سایر پلتفرم‌ها اجرا می‌شود.");
#endif
}


🔨 حالت خاص - کدهای مخصوص ادیتور:

گاهی وقتا یه سری کد نوشتی که فقط توی محیط ادیتور لازمه، مثلا تول ساختی یا با آبجکت‌ها توی Scene ور می‌ری. این کدها اگه توی خروجی برن، نه‌تنها به درد نمی‌خورن، بلکه باعث خطای کامپایل یا خروجی نگرفتن هم می‌شن. برای جلوگیری از این مورد از #if UNITY_EDITOR استفاده کن:

#if UNITY_EDITOR
using UnityEngine;

public class EditorOnlyExample : MonoBehaviour
{
void OnGUI()
{
// فقط در محیط ادیتور اجرا میشه، توی خروجی نمی‌ره
if (GUILayout.Button("Test"))
{
Debug.Log("این فقط مخصوص ادیتوره");
}
}
}
#endif


اینجوری هم پروژه‌ت تمیز می‌مونه، هم مطمئن می‌شی هیچ کد ادیتوری وارد خروجی نهایی نمی‌شه.

---

💡 کاربردهای مهم:
- جدا کردن کدهای مربوط به سرور و کلاینت
- مدیریت ورودی‌ها برای موبایل یا پی‌سی
- استفاده از API خاص هر پلتفرم
- جلوگیری از ورود کدهای ادیتور به خروجی بازی
- بهینه‌سازی عملکرد برای هر پلتفرم


📌 لیست پرکاربردترین دستورهای Platform-Specific در یونیتی:

- UNITY_EDITOR
فقط موقعی که پروژه توی محیط ادیتور یونیتی اجرا می‌شه فعاله (نه تو خروجی نهایی).

- UNITY_ANDROID
مخصوص زمانی که بازی روی دستگاه‌های اندروید اجرا می‌شه.

- UNITY_IOS
مربوط به اجرای بازی روی آیفون یا آیپد (iOS).

- UNITY_WEBGL
وقتی بازی روی مرورگر (WebGL) اجرا می‌شه، این شرط فعاله.

- UNITY_STANDALONE_WIN
مخصوص خروجی‌های ویندوز (PC) هست؛ چه بازی رو مستقیم از فایل EXE اجرا کنی چه از ادیتور.

- UNITY_SERVER
زمانی فعاله که خروجی با گزینه‌ی Server Build گرفته شده باشه (مثلاً برای اجرای بازی سمت سرور).

- DEVELOPMENT_BUILD
فقط تو بیلدهای توسعه‌ای فعال می‌شه؛ موقعی که تیک Development Build رو توی تنظیمات خروجی بزنی (برای دیباگ و لاگ‌گیری بیشتر).

🧠 نکته مهم: این شرط‌ها فقط موقع کامپایل بررسی می‌شن. پس توی Update یا منطق‌های زمان اجرا ازشون استفاده نمی‌شه. برای اون موارد باید از Application.platform استفاده کنی.

🔖 #GameDev, #بازیسازی

👤 ali reza

💎 Channel: @DevelopixGame
🔥6👍2
اهمیت Assemblies در پروژه‌های یونیتی

در توسعه بازی‌ها و اپلیکیشن‌های یونیتی، Assemblies یکی از مهمترین مفاهیم است که باعث می‌شود کدنویسی و ساختار پروژه‌ها سازمان‌دهی شده‌تر و بهینه‌تر بشه. شاید توی پروژه‌های ساده‌تر نیازی به توجه ویژه به این موضوع نباشه، ولی در پروژه‌های پیچیده‌تر، فهم و استفاده از Assemblies به طور قابل توجهی کارایی و قابلیت نگهداری پروژه رو بالا می‌بره. 🛠

حالا Assemblies در یونیتی چیست؟
در یونیتی، Assembly به مجموعه‌ای از کلاس‌ها و کدها گفته میشه که به یک بخش خاص از پروژه مربوط هستن. به عبارت ساده‌تر، Assembly به ما این امکان رو می‌ده که کدهای مختلف رو در بخش‌های جداگانه و مستقل از هم قرار بدیم، که باعث بهبود عملکرد و سازمان‌دهی پروژه میشه. این قابلیت بسیار برای پروژه‌های بزرگ‌تر مفید است.

چرا باید از Assemblies استفاده کنیم؟
1. بهینه‌سازی زمان کامپایل: وقتی پروژه شما بزرگ می‌شود، یونیتی باید تمامی کدها رو دوباره کامپایل کنه. با تقسیم کدها به Assemblyهای مختلف، زمان کامپایل به طور قابل توجهی کاهش می‌یابد.
2. بهبود قابلیت نگهداری کد: با تقسیم‌بندی کد به اسمبلی‌های مختلف، راحت‌تر می‌تونید کدهای خودتون رو مدیریت کنید، تغییرات رو به راحتی اعمال کنید و از اشتباهات جلوگیری کنید.
3. پشتیبانی از Dependency‌ها: با استفاده از Assembly‌ها، می‌تونید وابستگی‌ها (dependencies) رو به‌طور دقیق‌تری مدیریت کنید، به این معنی که تنها کدهایی که نیاز به تغییر دارن کامپایل می‌شوند.
4. مدیریت بهتر اسکریپت‌ها: با استفاده از Assemblies می‌تونید اسکریپت‌های خودتون رو در مجموعه‌های مختلف قرار بدید و هر کد رو به راحتی برای پلتفرم‌های مختلف یا بخش‌های مختلف پروژه‌تون استفاده کنید.

چه زمانی باید از Assemblies استفاده کنیم؟
- پروژه‌های بزرگ: وقتی پروژه شما به اندازه‌ای پیچیده بشه که نیاز به سازمان‌دهی و ساختاردهی بیشتری داشته باشه.
- گسترش پروژه: وقتی نیاز دارید که بخش‌های مختلف پروژه به‌طور مستقل از هم توسعه پیدا کنند.
- افزایش سرعت کامپایل: اگر سرعت کامپایل برای شما مهم هست و نمی‌خواهید هر بار تغییر کوچکی در کد، زمان زیادی ببره.

نکات مهم در استفاده از Assemblies:
- زمانی که از Assembly‌ها استفاده می‌کنید، باید حتماً Assembly Definition File بسازید تا یونیتی بتونه اون رو شناسایی کنه.
- هر Assembly باید دسته‌بندی صحیح و وابستگی‌های درست داشته باشه تا عملکرد بهینه رو از پروژه دریافت کنید.
- از Assembly Definition استفاده کنید تا مطمئن بشید که فقط بخش‌های مرتبط با هم در هنگام کامپایل تغییر می‌کنند.

🔧 چرا این موضوع برای شما مهمه؟
اگر در حال توسعه پروژه‌های یونیتی بزرگ‌تر یا پیچیده‌تر هستید، استفاده از Assemblies می‌تواند زمان کامپایل رو کاهش بده و کدهای شما رو منظم‌تر و قابل نگهداری‌تر کند. این موضوع در پروژه‌های طولانی‌مدت می‌تواند تفاوت بزرگی در کارایی و سرعت تیم توسعه ایجاد کند.

🔖 #GameDev, #بازیسازی

👤 ali reza

💎 Channel: @DevelopixGame
👍31
🟢 درود دوستان!

این پست مخصوص دوستانیه که هنوز از نسخه‌های قدیمی‌تر یونیتی (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های خود یونیتی مثل 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👍21
📣 معرفی 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 رو نصب کنید:

npm install -g openupm-cli


بعد از نصب، برای افزودن یک پکیج به پروژه یونیتی خودتون، کافیه در پوشه پروژه دستور زیر رو اجرا کنید.
به عنوان مثال، برای پکیج خودم `wold.magic.webads`، دستور به این صورته:

openupm add wold.magic.webads


با این کار، پکیج به پروژه شما اضافه میشه و می‌تونید ازش استفاده کنید.

🔖 #GameDev, #بازیسازی

👤 ali reza

💎 Channel: @DevelopixGame
🔥8
🎨 فرمت‌دهی متن در Debug.Log یونیتی با HTML

در 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
🛡 حفظ اشیاء در زمان بارگذاری صحنه

متد 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
🔥81
پلتفرمر 2D در Unity — حرکت و پرش ساده 🎮

در این پست یک آموزش عملی و واقعی از مجموعه‌های رسمی 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
🔥83
الگوی Observer در گیم دیولوپمنت: خداحافظ کدهای به هم چسبیده 👋

یکی از تمیزترین راه‌ها برای مدیریت رویدادها در بازی، مخصوصاً توی 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 ضرب کن تا وابسته به فریم نباشن.

🔹 مثال بد (وابسته به فریم):
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

اگر این حالت‌ها را با یک عالمه 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 در یک بازی است، خروجی نهایی چاپ‌شده روی ترمینال چیست؟

به ترتیب و شکل دقیق متن خروجی (شامل فاصله‌ها و خط‌های جدید) دقت کنید و کل خروجی را بنویسید.

# 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