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

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

گروه: @StartUnityGP

🫂 @AmirHDeveloper @HaminGames
Download Telegram
🎮 چرا مقایسه سی‌شارپ یونیتی با C++ اشتباه است؟

خیلی از توسعه‌دهنده‌ها فکر می‌کنن سی‌شارپ در یونیتی ضعیف‌تر از C++ هست، ولی این طرز فکر کاملاً اشتباهه! 🤔 در واقع، یونیتی از سی‌شارپ به‌عنوان زبان اصلی برای منطق بازی استفاده می‌کنه، اما زیرساخت‌های اصلی این موتور مثل رندرینگ و فیزیک با C++ نوشته شدن تا سرعت و کارایی بالاتری داشته باشه. 🚀

🔍 سی‌شارپ یونیتی یا C++؟

🧑‍💻 سی‌شارپ در یونیتی بهینه‌سازی شده تا شما بتونید سریع‌تر و راحت‌تر بازی بسازید. اما تمام عملیات سنگین مثل رندر کردن یا برخورد فیزیکی اشیاء، توسط C++ انجام می‌شه.

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

⚙️ آیا در یونیتی هم نیازه مدیریت حافظه دستی انجام بشه؟
در بیشتر مواقع، یونیتی خودش حافظه رو مدیریت می‌کنه، ولی در بعضی جاها مثل موارد زیر باید دستی عمل کنید:

1.سیستم کار موازی (Job System): 🧩 وقتی از سیستم Job استفاده می‌کنید، باید حافظه‌ای که jobها نیاز دارن رو مدیریت کنید.
2.درخواست وب یونیتی (UnityWebRequest): 🌐 هر وقت درخواست شبکه‌ای (مثل دانلود یا ارسال داده) می‌فرستید، بعدش باید حافظه آزاد بشه تا دچار مشکل نشت حافظه (Memory Leak) نشید.
3.پلاگین های بومی (Native Plugins): 🛠 وقتی از پلاگین‌های Native مثل C++ استفاده می‌کنید، باید حواستون به مدیریت حافظه باشه.

⚡️ آیا سی‌شارپ باعث لگ می‌شه؟
خیر! سی‌شارپ در یونیتی بهینه‌سازی شده و موتور بازی، کارهای سنگین مثل فیزیک و رندرینگ رو با C++ انجام می‌ده. پس نیازی نیست نگران لگ باشید. علاوه بر این، یونیتی با استفاده از Garbage Collection به بهینه‌سازی حافظه کمک می‌کنه و اگه از ابزارهایی مثل Job System به درستی استفاده کنید، حتی بازی‌های پیچیده هم روان اجرا می‌شن.

🔥 نکته جالب:
سرعت سی‌شارپ یونیتی بین 5 تا 10 برابر بیشتر از سی‌شارپ عادیه چرا؟ چون یونیتی از زیرساخت C++ برای پردازش‌های سنگین استفاده می‌کنه و شما از مزایای هر دو زبان بهره می‌برید!

🎯 نتیجه‌گیری:
مقایسه سی‌شارپ یونیتی با C++ اشتباهه، چون یونیتی بهینه‌سازی‌های زیادی داره و از C++ برای کارهای سنگین استفاده می‌کنه. شما با سی‌شارپ راحت‌تر کدنویسی می‌کنید، در حالی که سرعت و عملکرد بازی شما تضمین شده است. 😎

#یونیتی #برنامه_نویسی #نکات_مهم #CSharp #مدیریت_حافظه #NativePlugins #JobSystem #UnityWebRequest
18
🚀 آشنایی با سیستم‌های Data-Oriented در یونیتی

سیستم‌های Data-Oriented به ما کمک می‌کنند تا داده‌ها را به گونه‌ای سازماندهی کنیم که بهینه‌تر و سریع‌تر به پردازش برسند. این رویکرد بر روی داده‌ها تمرکز دارد تا عملکرد بهتری در بازی‌ها و برنامه‌ها ارائه دهد. با استفاده از این سیستم‌ها، می‌توانیم به شیوه‌ای مؤثرتر از منابع سخت‌افزاری استفاده کنیم و کارایی بازی‌ها را افزایش دهیم.

چرا Data-Oriented؟
- عملکرد بهتر: در این روش، به جای تمرکز بر روی اشیاء و رفتارهای آنها، داده‌ها را به گونه‌ای ساختاردهی می‌کنیم که پردازش آنها سریع‌تر و بهینه‌تر باشد. با پردازش مؤثرتر داده‌ها، می‌توانیم به افزایش فریم‌ریت و بهبود تجربه کاربری کمک کنیم. به‌طور کلی، این رویکرد به ما کمک می‌کند تا از محدودیت‌های عملکردی که در روش‌های شیءگرا با آنها مواجه می‌شویم، عبور کنیم.

- مدیریت بهتر حافظه: سیستم‌های Data-Oriented به ما اجازه می‌دهند تا حافظه را به گونه‌ای بهینه‌تر مدیریت کنیم. با سازماندهی داده‌ها در آرایه‌ها به جای اشیاء، می‌توانیم از کش (Cache) به طور مؤثرتری استفاده کنیم و به این ترتیب، زمان دسترسی به داده‌ها کاهش می‌یابد. این به ویژه در بازی‌های بزرگ که شامل تعداد زیادی اشیاء و داده‌ها هستند، اهمیت بیشتری دارد.

- پشتیبانی از Multi-threading: با تقسیم داده‌ها به قطعات کوچک‌تر، می‌توانیم به راحتی از پردازش‌های موازی استفاده کنیم. این کار باعث می‌شود که CPU بتواند بهینه‌تر کار کند و بار پردازش بر روی سیستم کاهش یابد. در واقع، این رویکرد می‌تواند به ما کمک کند تا از قدرت پردازش چند هسته‌ای استفاده کنیم و کارایی را افزایش دهیم.

ساختار Data-Oriented
در یک سیستم Data-Oriented، معمولاً از ساختارهای Entity-Component-System (ECS) استفاده می‌شود. در این ساختار:

- موجودیت (Entity): یک شناسه منحصر به فرد برای هر شیء در بازی است. این اشیاء می‌توانند شخصیت‌ها، دشمنان، یا هر نوع شیء دیگری باشند. هر موجودیت به عنوان یک "ID" شناخته می‌شود که به آن اجازه می‌دهد ویژگی‌های خاص خود را داشته باشد.

- جزء (Component): داده‌های خام مربوط به یک موجودیت. اینها شامل ویژگی‌ها یا مقادیر خاصی هستند که رفتارهای اشیاء را تعیین می‌کنند. برای مثال، یک جزء ممکن است موقعیت، سرعت، یا وضعیت سلامتی یک شخصیت باشد. اجزاء به صورت مستقل از یکدیگر عمل می‌کنند و می‌توانند به موجودیت‌های مختلف نسبت داده شوند.

- سیستم (System): منطق و رفتارها را برای پردازش داده‌های مربوط به یک یا چند جزء انجام می‌دهد. اینها شامل وظایفی هستند که بر روی داده‌های موجود در اجزاء انجام می‌شوند، مانند حرکت دادن شخصیت‌ها یا اعمال آسیب به آنها. سیستم‌ها می‌توانند به صورت موازی اجرا شوند و داده‌ها را بر اساس نیاز پردازش کنند.

مزایای استفاده از Data-Oriented
1. بهینه‌سازی عملکرد: با کاهش زمان دسترسی به داده‌ها و استفاده بهینه از حافظه، می‌توانیم از نظر عملکردی بهبود قابل توجهی را تجربه کنیم.

2. قابلیت مقیاس‌پذیری: این سیستم‌ها به راحتی می‌توانند با افزایش تعداد اشیاء در بازی مقیاس‌پذیر باشند، بدون اینکه نیاز به تغییرات بزرگ در کد داشته باشیم.

3. کاهش خطاها: با جداسازی داده‌ها از منطق، احتمال بروز خطا در کد کاهش می‌یابد و امکان تست و نگهداری کد آسان‌تر می‌شود.

نتیجه‌گیری
استفاده از سیستم‌های Data-Oriented می‌تواند به شما کمک کند تا بازی‌های خود را به گونه‌ای طراحی کنید که عملکرد بالاتری داشته باشند و بهینه‌تر عمل کنند. این رویکرد نه تنها به افزایش سرعت پردازش کمک می‌کند، بلکه امکان مدیریت بهتر حافظه و اجرای پردازش‌های موازی را نیز فراهم می‌آورد.

#یونیتی #برنامه_نویسی #نکات_مهم #Data_Oriented
6🔥3👏1
🌀 متدهای کلاس Rigidbody در یونیتی: مدیریت فیزیک و حرکت اشیاء

کلاس Rigidbody در یونیتی به شما این امکان را می‌دهد که فیزیک و حرکت اشیاء را به راحتی کنترل کنید. در این پست، برخی از مهم‌ترین متدهای این کلاس را با توضیحات مختصر و مثال‌های کاربردی بررسی می‌کنیم.

افزودن نیرو (AddForce)
افزودن یک نیرو به Rigidbody برای ایجاد حرکت. این متد به شما این امکان را می‌دهد که جسم را با نیرویی مشخص در یک جهت حرکت دهید.

void Update()
{
Rigidbody rb = GetComponent<Rigidbody>();
if (Input.GetKey(KeyCode.W))
{
rb.AddForce(Vector3.forward * 10); // حرکت به جلو
}
}


افزودن گشتاور (AddTorque)
افزودن گشتاور به Rigidbody برای چرخش آن. این متد به شما این امکان را می‌دهد که جسم را حول محور خاصی بچرخانید.

void Update()
{
Rigidbody rb = GetComponent<Rigidbody>();
if (Input.GetKey(KeyCode.A))
{
rb.AddTorque(Vector3.up * 10); // چرخش به سمت بالا
}
}


حرکت به موقعیت (MovePosition)
حرکت Rigidbody به یک موقعیت جدید به صورت مستقیم. این متد به شما اجازه می‌دهد جسم را به یک موقعیت خاص بدون نیاز به اعمال نیرو جابجا کنید.

void FixedUpdate()
{
Rigidbody rb = GetComponent<Rigidbody>();
Vector3 targetPosition = transform.position + Vector3.forward * Time.deltaTime;
rb.MovePosition(targetPosition); // حرکت به موقعیت جدید
}


چرخش به زاویه (MoveRotation)
چرخش Rigidbody به یک زاویه جدید. این متد به شما اجازه می‌دهد جسم را به صورت مستقیم به زاویه‌ای مشخص بچرخانید.

void FixedUpdate()
{
Rigidbody rb = GetComponent<Rigidbody>();
Quaternion targetRotation = Quaternion.Euler(0, 90, 0);
rb.MoveRotation(targetRotation); // چرخش به زاویه مشخص
}


به خواب رفتن (Sleep)
متد Sleep جسم را به حالت خواب می‌برد. در این حالت، جسم دیگر تحت تأثیر نیروهای فیزیکی قرار نمی‌گیرد و محاسبات فیزیکی برای آن متوقف می‌شود.

void Update()
{
Rigidbody rb = GetComponent<Rigidbody>();
if (Input.GetKey(KeyCode.S))
{
rb.Sleep(); // به خواب رفتن
}
}


بیدار شدن (WakeUp)
متد WakeUp جسم را بیدار می‌کند و شبیه‌سازی فیزیکی برای آن دوباره فعال می‌شود. این متد باعث می‌شود که جسم مجدداً تحت تأثیر نیروهای فیزیکی قرار بگیرد.

void Update()
{
Rigidbody rb = GetComponent<Rigidbody>();
if (Input.GetKey(KeyCode.W))
{
rb.WakeUp(); // بیدار شدن
}
}


حالت کینماتیک (isKinematic)
با تنظیم isKinematic به true، شما می‌توانید از تأثیرات فیزیکی بر روی جسم جلوگیری کنید. این حالت برای اشیائی که باید به صورت دستی کنترل شوند مفید است.

void Start()
{
Rigidbody rb = GetComponent<Rigidbody>();
rb.isKinematic = true; // جلوگیری از تأثیرات فیزیکی
}


بررسی برخورد (CheckCollision)
با این متد می‌توانید بررسی کنید که آیا دو جسم با هم برخورد دارند یا خیر. این متد می‌تواند در مدیریت برخوردها بسیار مفید باشد.

void Update()
{
Rigidbody rb = GetComponent<Rigidbody>();
if (Physics.CheckSphere(transform.position, 1.0f))
{
Debug.Log("Collision detected!"); // برخورد شناسایی شد
}
}


این متدها به شما در مدیریت فیزیک و حرکت اشیاء کمک می‌کنند و می‌توانند تجربه بازی شما را بهبود ببخشند.

#یونیتی #برنامه_نویسی #فیزیک #Rigidbody
🔥55❤‍🔥4👍2
🎶 مدیریت صدا با 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); // پخش صدا با دو ثانیه تأخیر


---

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

#یونیتی #صدا #AudioSource #بازی_سازی #بازی_ماشینی #برنامه_نویسی
8👍2
💡 نورپردازی در یونیتی و انواع آن

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

---

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 می‌تواند بر عملکرد بازی تأثیر بگذارد، پس فقط در جاهای ضروری استفاده کنید.

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

#یونیتی #نورپردازی #بازی‌سازی #Lighting #Unity
👍64🗿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
استفاده می‌شود.

#یونیتی #بازی‌سازی #متدهای_برخورد #برنامه_نویسی
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