Start Unity – Telegram
Start Unity
329 subscribers
7 photos
1 video
11 links
هیچ پروسه ای سخت نیست به شرطی که شروعش کنی..

🎮 #یونیتی
👨‍💻 #برنامه_نویسی
📚 #آموزش
🧩 #آزمون

گروه: @StartUnityGP

🫂 @AmirHDeveloper @HaminGames
Download Telegram
🕹 متدهای برخورد در یونیتی 🕹

متدهای برخورد یا 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
استفاده می‌شود.

#یونیتی #بازی‌سازی #متدهای_برخورد #برنامه_نویسی
12👍2
🌙 بزرگداشت شب یلدا مبارک باد! 🌙

در این شب بلند و پرستاره، که خورشید از دل تاریکی‌ها برمی‌خیزد، همچون همیشه، ما نیز باید در دل خود امید را روشن سازیم. شب یلدا، نماد پیروزی روشنی بر تاریکی است و به ما یادآوری می‌کند که در برابر سختی‌ها و تاریکی‌ها باید همواره پایدار و مقاوم باشیم.

این شب بلند، همچون چراغی در دل شب، راه‌گشای فردای روشن‌تر است. همان‌طور که خورشید به سوی روزی نو می‌رود، ما نیز باید همت خود را به سوی دانایی و آگاهی برافرازیم، تا فردایی بهتر بسازیم.

🌿 در کنار هم و با اندوخته‌ای از دانش و امید، هم‌چنان به سوی پیشرفت گام برداریم. 🌿

یلدای شما پر از نور، امید و موفقیت باشد!
❤‍🔥16
📝 پراپرتی‌ها (Properties) در سی‌شارپ؛ ابزار ساده اما قدرتمند!

پراپرتی‌ها یه روش برای کنترل دسترسی و مدیریت مقادیر متغیرها هستن که هم خوانایی کد رو بالا می‌برن و هم امنیت داده‌ها رو تضمین می‌کنن. این ویژگی تو سی‌شارپ خیلی مهمه، مخصوصاً وقتی نمی‌خوایم مقادیر مستقیماً قابل دسترسی باشن.

---

🌟 پراپرتی چیه؟

پراپرتی‌ها به ما اجازه میدن مقدار متغیر رو بخونیم (با get) یا تغییر بدیم (با set) و روی این دسترسی‌ها کنترل داشته باشیم.

📌 یه مثال ساده:

public class Player
{
private int _health; // متغیر خصوصی (فیلد)

public int Health // پراپرتی پابلیک
{
get { return _health; } // مقدار رو برمی‌گردونه
set { _health = value; } // مقدار جدید رو تنظیم می‌کنه
}
}


---

🔄 چطور استفاده کنیم؟

void Start()
{
Player player = new Player();
player.Health = 100; // مقداردهی با پراپرتی
Debug.Log(player.Health); // دریافت مقدار: 100
}


---

🔒 چرا از پراپرتی استفاده کنیم؟

1. کنترل مقادیر ورودی:
با پراپرتی‌ها می‌تونیم شرط بذاریم که فقط مقادیر مجاز وارد بشن.

2. امنیت کد:
فیلدها (متغیرها) رو پرایوت می‌کنیم تا فقط از طریق پراپرتی قابل دسترسی باشن.

3. مدیریت ساده‌تر:
پراپرتی‌ها به کد نظم و خوانایی بیشتری میدن.

📌 مثال محدود کردن مقدار ورودی:

public class Player
{
private int _health;

public int Health
{
get { return _health; }
set
{
if (value >= 0) // مقدار منفی مجاز نیست
_health = value;
}
}
}


---

🛠 پراپرتی‌های فقط خواندنی و فقط نوشتنی

گاهی وقت‌ها نیازه که فقط بشه مقدار رو خوند و تغییر مقدار فقط از داخل کلاس ممکن باشه. برای این کار از پراپرتی‌های فقط خواندنی یا فقط نوشتنی استفاده می‌کنیم.

📌 مثال پراپرتی فقط خواندنی:

public class Game
{
public int Score { get; private set; } // فقط قابل خواندن از بیرون

public void AddScore(int amount)
{
Score += amount; // تغییر فقط از داخل کلاس
}
}


🎯 چطور استفاده کنیم؟

void Start()
{
Game game = new Game();
game.AddScore(10); // امتیاز اضافه می‌کنیم
Debug.Log(game.Score); // مقدار رو می‌گیریم: 10

// game.Score = 20; // خطا: مقداردهی از بیرون ممکن نیست
}


---

🎯 مزایای پراپرتی‌ها

1. کنترل کامل روی مقداردهی:
می‌تونیم قوانین خاصی رو تعریف کنیم (مثلاً مقادیر منفی رو رد کنیم).

2. بهبود امنیت داده‌ها:
با استفاده از فیلدهای خصوصی و پراپرتی‌های پابلیک، دسترسی به داده‌ها رو محدود می‌کنیم.

3. افزایش خوانایی کد:
پراپرتی‌ها به وضوح نشون میدن که چطور میشه با یه متغیر کار کرد.

---

#یونیتی #برنامه_نویسی #پراپرتی‌ها #امنیت_کد
9🗿1
برخی از اتربیوت‌های کاربردی در یونیتی که باید بشناسید!

اتربیوت‌ها در یونیتی ابزارهای فوق‌العاده‌ای هستن که هم کار با اینسپکتور رو راحت‌تر می‌کنن و هم به شما امکان می‌دن کدها و پروژه‌تون رو مرتب‌تر مدیریت کنین. 🚀
در ادامه با چندتا از پرکاربردترین اتربیوت‌ها و کاربردشون آشنا می‌شیم:

---

1️⃣ اتربیوت‌ [AddComponentMenu]
کاربرد:
با استفاده از این اتربیوت می‌تونید اسکریپت‌ها رو در مسیر دلخواهتون داخل منوی "Add Component" دسته‌بندی کنید.

مثال:
[AddComponentMenu("Custom Scripts/Player Movement")]
public class PlayerMovement : MonoBehaviour { }


نتیجه:
در منوی "Add Component" در Inspector، این اسکریپت در مسیر Custom Scripts > Player Movement قرار می‌گیره و پیدا کردنش خیلی راحت‌تر می‌شه.

---

2️⃣ اتربیوت‌ [RequireComponent]
کاربرد:
برای اطمینان از اینکه یک کامپوننت خاص (مثل Rigidbody) همراه با اسکریپت شما اضافه بشه.

مثال:
[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour { }


نتیجه:
وقتی این اسکریپت رو به GameObject اضافه کنین، یونیتی به‌صورت خودکار کامپوننت Rigidbody رو هم اضافه می‌کنه.

---

3️⃣ اتربیوت‌ [HideInInspector]
کاربرد:
برای مخفی کردن یک متغیر عمومی در Inspector، بدون اینکه دسترسی به اون در کد از بین بره.

مثال:
[HideInInspector]
public float hiddenValue = 10f;


نتیجه:
متغیر hiddenValue توی اینسپکتور دیده نمی‌شه، ولی همچنان می‌تونید از اون توی کد استفاده کنید.

---

4️⃣ اتربیوت‌ [Header]
کاربرد:
برای اضافه کردن یک عنوان بالای متغیرها در Inspector.

مثال:
[Header("Player Settings")]
public float speed;
public float jumpHeight;


نتیجه:
در اینسپکتور، عبارت Player Settings بالای این متغیرها نمایش داده می‌شه و ظاهر مرتب‌تری به تنظیمات شما می‌ده.

---

5️⃣ اتربیوت‌ [Tooltip]
کاربرد:
برای نمایش توضیحاتی درباره متغیرها زمانی که نشانگر ماوس روی اون‌ها قرار می‌گیره.

مثال:
[Tooltip("Speed of the player in units per second")]
public float speed;


نتیجه:
وقتی نشانگر ماوس روی متغیر speed قرار بگیره، توضیحات نمایش داده می‌شن.

---

6️⃣ اتربیوت‌ [ExecuteInEditMode]
کاربرد:
اجازه می‌ده متدهای Start و Update در حالت ویرایشگر هم اجرا بشن.

مثال:
[ExecuteInEditMode]
public class EditorExample : MonoBehaviour
{
void Update()
{
Debug.Log("Running in Edit Mode!");
}
}


نتیجه:
این اسکریپت حتی زمانی که بازی اجرا نمی‌شه، توی حالت ویرایشگر کار می‌کنه.

---

7️⃣ اتربیوت‌ [Range]
کاربرد:
برای محدود کردن مقدار متغیرها به یک بازه مشخص در Inspector.

مثال:
[Range(1, 10)]
public int health;


نتیجه:
در اینسپکتور، متغیر health به‌صورت یک اسلایدر نمایش داده می‌شه که مقدار اون فقط بین ۱ تا ۱۰ قابل تنظیمه.

---

8️⃣ اتربیوت‌ [ContextMenu]
کاربرد:
برای اضافه کردن گزینه‌هایی به منوی زمینه (Context Menu) کامپوننت‌ها.

مثال:
[ContextMenu("Reset Position")]
void ResetPosition()
{
transform.position = Vector3.zero;
}


نتیجه:
وقتی روی کامپوننت این اسکریپت راست‌کلیک کنید (در پنجره Inspector)، گزینه Reset Position ظاهر می‌شه و با انتخاب اون، متد اجرا می‌شه.

---

#یونیتی #برنامه_نویسی #اتربیوت
🔥7👍3❤‍🔥2
📌 آموزش نوشتن توضیحات XML برای متدها و پارامترها در یونیتی

وقتی دارید روی پروژه‌های بزرگ یا تیمی کار می‌کنید، یکی از بهترین روش‌ها برای مستندسازی کدها اینه که توضیحات مناسب برای متدها و پارامترها بنویسید. این کار باعث میشه وقتی دیگران (یا حتی خودتون بعداً!) به کد مراجعه می‌کنید، راحت‌تر بفهمید که هر بخش از کد چه کاری انجام میده. 😎

🎯 نوشتن توضیحات برای متدها با XML Documentation
در زبان سی‌شارپ، می‌تونید با استفاده از کامنت‌های XML توضیحات کامل بنویسید که در ابزارهایی مثل ویژوال استودیو یا Rider، به صورت Tooltip نمایش داده بشن.

🔥 مثال کامل: مقداردهی اولیه بازیکن
فرض کنید می‌خواهید متدی بنویسید که بازیکن رو مقداردهی اولیه کنه. با این روش می‌تونید توضیحات کاملی برای متد و پارامترها بنویسید:

/// <summary>
/// This method is used to initialize the player.
/// Initialization includes setting up the basic information of the player and their online status.
/// </summary>
/// <param name="playerData">A PlayerData object containing the player's name, score, and level</param>
/// <param name="isOnline">Specifies whether the player is online or not</param>
/// <remarks>
/// This method should be called only once for each player.
/// If the player changes from online to offline, the values must be updated manually.
/// </remarks>
protected void Initialize(PlayerData playerData, bool isOnline)
{
if (playerData == null)
{
throw new ArgumentNullException(nameof(playerData), "Player data cannot be null.");
}

Debug.Log($"Initializing player {playerData.Name}");

if (isOnline)
{
Debug.Log("Player is online");
// Code related to online status
}
else
{
Debug.Log("Player is offline");
// Code related to offline status
}
}


---

🚀 توضیحات بخش‌های مختلف کد
1. توضیحات `<summary>`
توضیح مختصر اما کامل درباره کاری که متد انجام می‌دهد.

2. توضیحات `<param>`
برای توضیح هر پارامتر متد.
- پارامتر `playerData`: این پارامتر شامل اطلاعات بازیکن است (مثلاً نام، امتیاز، سطح).
- پارامتر `isOnline`: تعیین می‌کنه که بازیکن آنلاین یا آفلاین است.

3. توضیحات `<remarks>`
برای نوشتن توضیحات اضافی و نکاتی که باید در نظر گرفته شوند.
مثلاً اینکه این متد فقط یک بار باید اجرا شود.

4. بررسی پارامترها:
قبل از استفاده از پارامترها، همیشه مطمئن شوید که null نیستند. این باعث جلوگیری از بروز خطاهای ناخواسته می‌شود.

---

🌟 نتیجه در IDE:
وقتی از متد استفاده کنید:
Initialize(new PlayerData { Name = "ali reza", Score = 100, Level = 5 }, true);

🔍 توضیحات کامل برای متد و پارامترها در ابزار IntelliSense به شما نمایش داده می‌شود.

---

🎓 نکته:
این روش نه‌تنها به خوانایی کد کمک می‌کند، بلکه مستندات کد شما را هم برای دیگران ساده‌تر می‌کند. اگر روی پروژه‌ای کار می‌کنید که چند نفر درگیر آن هستند، نوشتن توضیحات خوب باعث صرفه‌جویی در زمان و کاهش سردرگمی می‌شود. 🧑‍💻

---

#یونیتی #برنامه_نویسی #مستندسازی
🔥6👍2❤‍🔥1
📌 وقتی Clean Code تبدیل به ابزار ادعا می‌شه!

تو جامعه برنامه‌نویسی زیاد دیدم یه عده با اسم کتابایی مثل Clean Code و مشابهش ادعا می‌کنن:

~> «تو این کتاب رو نخوندی؟ پس هیچی از برنامه‌نویسی نمی‌فهمی!»

بعضی وقتا حتی آدمایی که تجربه عملی زیادی دارن هم به‌خاطر نخوندن این کتابا مورد نقد قرار می‌گیرن. 😑

خب، بیاید تو این پست یه نگاهی منطقی به این دسته کتابا بندازیم و ببینیم آیا واقعاً اینقدر بی‌چون‌وچرا و مطلق هستن که بشه همه چیو باهاشون سنجید؟

---

🔍 کتاب خوبه اما...
کسی منکر ارزش Clean Code و امثال اون نیست. این کتابا برای زمان خودشون مفید بودن و هنوزم می‌تونن الهام‌بخش باشن.

اما مشکل وقتی شروع می‌شه که بعضیا این کتابا رو قوانین مقدس بدونن و فکر کنن هر پروژه یا شرایطی باید دقیقاً بر اساس اونا جلو بره.

---

💡 چرا تعصب روی این کتابا اشتباهه؟
1️⃣ هر پروژه، شرایط خاص خودشو داره:
اصولی که توی یه نرم‌افزار مدیریت داده جواب می‌ده، ممکنه تو یه بازی آنلاین بزرگ اصلاً کاربردی نباشه.

2️⃣ تکنولوژی همیشه تغییر می‌کنه:
کتاب‌ها وقتی نوشته می‌شن بر اساس دانش همون زمان هستن. اما ابزارها، زبان‌ها و رویکردها همیشه در حال آپدیت شدنن.

3️⃣ تجربه عملی از هر کتابی ارزشمندتره:
کسی که روی پروژه‌های واقعی کار کرده و با چالش‌ها دست‌وپنجه نرم کرده، خیلی وقتا دید بازتری داره تا کسی که صرفاً چند فصل از یه کتاب خونده.

---

🧠 پس چه کاری باید کرد؟
- به‌جای تعصب روی کتابا، با ذهن باز به یادگیری ادامه بدیم.
- از تجربه‌های عملی و چالش‌های واقعی بیشتر یاد بگیریم.
- مستندات رسمی و منابع به‌روز رو دنبال کنیم.

---

💬 دیدگاه شما چیه؟ فکر می‌کنید خوندن این کتابا چقدر باید تعیین‌کننده باشه؟

#برنامه_نویسی #CleanCode #یادگیری #بدون_تعصب
👍5👌1
📢 بهینه‌سازی پردازش‌ها در یونیتی با 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 رو جدی بگیرید! 🚀

#یونیتی #برنامه_نویسی
#HPCSharp #Performance #Optimization
👍9🔥2
Start Unity
📢 بهینه‌سازی پردازش‌ها در یونیتی با HPC# 🔹 در یونیتی، HPC# (High-Performance C#) یک نسخه بهینه‌شده از سی‌شارپ است که برای پردازش‌های سنگین و عملکرد بالا طراحی شده. این تکنولوژی با Burst Compiler و Job System ترکیب می‌شود تا بیشترین بهره را از CPU بگیرد.…
تست واقعی من از HPC# در یونیتی

محاسبه مجموع توان دوم 10,000 عدد اول
پردازنده Intel Core i5-4200U (دو هسته‌ای)

حالت عادی: 14 میلی ثانیه
بعد از بهینه سازی با Job System + Burst Compiler به 0.7 میلی ثانیه رسید

تقریبا ۲۰ برابر سریعتر اونم روی یه پردازنده معمولی دو هسته‌ای
البته من تازه این روش رو یاد گرفتم.. پس اگه بهتر پیاده سازی بشه ممکنه نتایج حتی قوی تری بگیریم :]
👍3🔥2
قبلاً توی پست‌های مختلف به ( Job System + HPC# + ECS ) اشاره کرده بودم، ولی خواستم یه توضیح جامع در مورد DOTS بدم که گیج نشید. خودم اولش یه کم سردرگم بودم، بعد که متوجه شدم همه اینا یه بخش از DOTS هستن، تازه قضیه برام روشن شد. 😅 پس بیاید یه نگاه عمیق‌تر به DOTS بندازیم! 🚀

---

مفهوم DOTS

DOTS (Data-Oriented Technology Stack)
مجموعه فناوری‌های داده‌محور
یه معماری جدید توی یونیتی هست که برای بهینه‌سازی عملکرد و استفاده از پردازش‌های چندنخی (Multi-threading) طراحی شده. 🤖 برخلاف OOP که تمرکزش روی شی‌گراییه، DOTS داده‌ها رو cache-friendly مدیریت می‌کنه و باعث افزایش سرعت اجرای بازی‌ها میشه.

---

اجزای اصلی DOTS

🔹 معماری: ECS (سیستم موجودیت-کامپوننت) → این معماری داده‌ها (Component) و رفتارها (System) رو از هم جدا می‌کنه و پردازش‌ها رو به صورت بهینه روی تعداد زیادی Entity انجام میده.

🔹 سیستم: Job System (سیستم شغل‌ها) → یه سیستم چندنخی که کمک می‌کنه CPU چندین کار رو همزمان انجام بده، اونم بدون دردسر!

🔹 کامپایلر: Burst Compiler (کامپایلر برست) → کدهای C# رو به کد ماشین بهینه‌شده تبدیل می‌کنه تا سرعت اجرا چند برابر بشه. 🚀

🔹 زبان: HPC# (C# با عملکرد بالا) → نسخه‌ای از C# که برای عملکرد بالا طراحی شده و بدون Garbage Collection (GC) کار می‌کنه، یعنی کمتر لگ می‌زنی! ⚡️

---

مزایای DOTS

سرعت: عملکرد خیلی بهتر نسبت به روش‌های قدیمی مثل OOP.
چندنخی: استفاده از چندنخی ایمن و بهینه که باعث میشه پردازش‌های سنگین سریع‌تر انجام بشن. 🏎
حافظه: مدیریت بهتر حافظه و کاهش مشکلاتی مثل GC که باعث لگ میشن.
کاربرد: مناسب برای بازی‌های بزرگ، هوش مصنوعی، شبیه‌سازی فیزیکی و پردازش‌های سنگین.

---

نتیجه‌گیری

اگه دنبال ساخت یه بازی یا سیستم مقیاس‌پذیر و سریع هستی، DOTS یکی از بهترین انتخاب‌هاست. البته یادگیریش یه مقدار پیچیده‌تر از روش‌های سنتی مثل OOP هست، ولی وقتی درکش کنی، متوجه می‌شی که چقدر قدرتمند و کاربردیه! 😏🔥

#یونیتی #برنامه_نویسی
#DOTS #ECS #BurstCompiler #JobSystem #HPCSharp #Performance #Multithreading #Optimization
👍62
💥🔥 چهارشنبه‌سوری خجسته باد، استارتی‌ها! 🔥💥

امشب، شب آتش و هیجان، شب پرش از روی شعله‌های امید و خداحافظی با تاریکی‌های گذشته‌ست! 🌟
در دنیای بازی‌سازی، مثل چهارشنبه‌سوری، باید با شجاعت از موانع بپریم، تاریکی‌های کدنویسی رو پشت سر بذاریم و با نور خلاقیت، آینده‌ای پر از موفقیت بسازیم! 🎮

امیدوارم امشب برای همه پر از شادی و انرژی مثبت باشه! مراقب خودتون باشید و بی‌گدار به آتش نزنید! 🔥😆
❤‍🔥11
نوروزتان پیروز باد!

این روزا شاید خیلی چیزا سخت شده باشه، اما نوروز یعنی دوباره از نو شروع کردن، یعنی امید به روزهای بهتر.
با تمام چالش‌هایی که داریم، هنوز هم می‌تونیم با تلاش، خلاقیت و همبستگی، آینده‌ای بسازیم که بهش افتخار کنیم. 🎮🚀

امیدوارم این سال، سالی باشه که با هم مسیرهای تازه‌ای باز کنیم، از سختی‌ها عبور کنیم و رویاهایی که به نظر دور میان رو، واقعی کنیم.

سال نو، سرشار از امید، پیشرفت و روزهای روشن برای هممون باشه. ❤️🌱
❤‍🔥821
🎯 آشنایی با 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 استفاده کنی.

---

#یونیتی #برنامه_نویسی
#PlatformSpecificCode #PreprocessorDirectives #CrossPlatform
👍8👾21
اهمیت 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 می‌تواند زمان کامپایل رو کاهش بده و کدهای شما رو منظم‌تر و قابل نگهداری‌تر کند. این موضوع در پروژه‌های طولانی‌مدت می‌تواند تفاوت بزرگی در کارایی و سرعت تیم توسعه ایجاد کند.

---

#یونیتی #برنامه_نویسی
#AssemblyDefinition #AdvancedProgramming
👍43👾3
درود دلاوران

چون خیلی‌هاتون با VPN مشکل داشتید، تصمیم گرفتم روشی که خودم برای اتصال به یونیتی استفاده می‌کنم رو با شما به اشتراک بذارم

🔐 ابزار: Hiddify Next
یه اپ اوپن‌سورس، سبک و قدرتمند برای اتصال امنه.
من خودم از کانفیگ‌های پولی استفاده می‌کنم که خب کیفیت تضمین‌شده‌ای دارن، ولی کانفیگ‌های رایگان هم در بیشتر مواقع کار راه‌اندازن.

فقط یادتون باشه بعد از نصب، حتما با دسترسی ادمین اجراش کنید و روی حالت VPN بذاریدش تا یونیتی بدون مشکل باز بشه 🎯

📥 نسخه مناسب سیستم‌عامل‌تون رو نصب کنید:

🔗 دانلود Hiddify Next - همه سیستم‌عامل‌ها

⚡️ نکته: چون پروکسی‌ها زیادن، بهتره خودتون از بخش پروکسی‌ها در اپ هیدیفای یکی رو دستی انتخاب کنید تا با کم و زیاد شدن پینگ، اتصال‌ها سریع عوض نشه و مشکلی پیش نیاد.

📡 کانال‌ برای دریافت کانفیگ:
@NightingaleVPN

📝 اگه شما هم روشی می‌شناسید که ممکنه به بقیه کمک کنه، حتما تو کامنت‌ها بنویسید ✌️
👾7👍3
🟢 درود دوستان!

این پست مخصوص دوستانیه که هنوز از نسخه‌های قدیمی‌تر یونیتی (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 جدید رو از لیست انتخاب کنید


اگه این آموزش برات مفید بود، حتما برای بقیه هم بفرست 🔁
اگه سؤالی داشتی، همین‌جا بپرس ✌️

---

#یونیتی #برنامه_نویسی
#AndroidSDK #SDKManager
👾63❤‍🔥3👍21
🎯 پکیج Magic WebAds منتشر شد! (نسخه آزمایشی)

یکی از مشکلات همیشگی ما توی ایران، نبود دسترسی به تبلیغات درون‌برنامه‌ای معروف مثل AdMob یا Unity Ads بوده. تحریم‌ها، پیچیدگی‌ها و نیاز به حساب بانکی خارجی باعث شده خیلی از بازی‌سازهای مستقل نتونن به راحتی ازشون استفاده کنن.

واسه همین تصمیم گرفتم یه پکیج سبک و ساده بسازم برای نمایش تبلیغات از طریق WebView، بدون نیاز به SDK و دردسر! یعنی هر لینکی که تبلیغات شما رو نشون میده، می‌تونید مستقیم توی بازی لود کنید. مخصوصاً برای پروژه‌های Web3 و تبلیغات کریپتویی خیلی کاربردیه.

🧪 این نسخه هنوز اولیه‌ست و ممکنه باگ داشته باشه یا هنوز به‌درد پروژه‌های خیلی جدی نخوره، ولی پایه‌اش رو گذاشتم تا کم‌کم روش بسازم.

📱 حتماً نسخه دمو اندروید رو تست کنید، تبلیغ لود میشه و می‌تونید عملکرد کلی رو ببینید.
یه سمپل هم همراه پکیجه که خیلی راحت نشون میده چطوری ازش استفاده کنید.
به‌زودی داکیومنت کامل و ویدیوهای آموزشی هم براش می‌سازم.

اگه به‌دردت می‌خوره یا دوست داری همچین ابزاری قوی‌تر بشه، لطفاً یه ⭐️ بهش بده توی گیت‌هاب.
همین حمایت کوچیک کلی بهم انگیزه میده که قوی‌تر و سریع‌تر توسعه‌اش بدم.

🔗 لینک پکیج: Magic WebAds on GitHub

🔗 دمو اندروید: دانلود فایل APK

مرسی که همیشه حمایتم می‌کنید ❤️
👍15212🤩10🔥3
Start Unity
🎯 پکیج Magic WebAds منتشر شد! (نسخه آزمایشی) یکی از مشکلات همیشگی ما توی ایران، نبود دسترسی به تبلیغات درون‌برنامه‌ای معروف مثل AdMob یا Unity Ads بوده. تحریم‌ها، پیچیدگی‌ها و نیاز به حساب بانکی خارجی باعث شده خیلی از بازی‌سازهای مستقل نتونن به راحتی ازشون…
درود دلاوران

مستندات پکیج Magic WebAds هم‌اکنون در دسترس شماست..
برای اینکه راحت‌تر و سریع‌تر با امکانات پکیج آشنا بشید و ازش استفاده کنید.. می‌تونید مستندات رو اینجا ببینید:

https://github.com/Woldsdm/docs-magic-webads/blob/main/README.md

اگر دوست دارید همچنان پکیج قوی‌تر بشه، حمایتتون با دادن ⭐️ تو گیت‌هاب خیلی بهم انرژی میده..

پیروز باشید و محکم به مسیرتون ادامه بدید.. ❤️
8🥰1🙏1
درود دوستان
در چه حالید؟
👎6👍5