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

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

گروه: @StartUnityGP

🫂 @AmirHDeveloper @HaminGames
Download Telegram
📢 بهینه‌سازی پردازش‌ها در یونیتی با 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
خب من هنوز دارم ادامه میدم..
تو این وضعیت مسخره، اینترنت افتضاح، با هزار تا محدودیت
نه چون حالم خوبه، نه چون شرایط خوبه..

فقط چون نمیتونم بشینم و کاری نکنم..
نمیتونم فقط نق بزنم و از زمین و آسمون شکایت کنم

متاسفم که شرایط اینجوریه..
فقط خواستم به شما هم یه ذره انرژی بدم
هرچند شاید خیلی هم کمک نکنه

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

برای همین نمیخوام خاموش بمونم..
برای همین میگم:
حتی یه کامنت ساده زیر همین پست
یه ایموجی.. یه درود..
ممکنه به من و بقیه انگیزه بده..

ما نباید خاموش بشیم..
20👍3👏1
درود دلاوران 🌟
یکی از دوستان برام یه کد تخفیف ۱۰۰٪ فرستاد برای سایت فرادرس
فرادرس الان تخفیف ۱۰۰ درصد گذاشته، فقط برای یه دوره!

من خودم یه دوره فن بیان گرفتم، گفتم قبل اینکه تموم شه،
براتون بذارم شاید به دردتون بخوره ❤️

🔹 کد تخفیف: IRAN (با حروف بزرگ)

یادتون نره فقط می‌تونید یه دوره رو با این کد بگیرید
پس اون دوره‌ای که واقعاً لازم دارید رو انتخاب کنید 😉
موفق باشید رفقا 🌱
5👾2
خروجی این کد در یونیتی چیست؟ (در صورتی که هر سه کلاس به یک گیم‌آبجکت اضافه شده‌اند)

public class A : MonoBehaviour
{
public virtual void SayHello() => Debug.Log("Hello from A");
}

public class B : A
{
public override void SayHello() => Debug.Log("Hello from B");
}

public class Test : MonoBehaviour
{
void Start()
{
A a = GetComponent<B>();
B b = GetComponent<A>() as B;

a.SayHello();
b.SayHello();
}
}


#یونیتی #برنامه_نویسی #آزمون
👾6👎1
Start Unity
خروجی این کد در یونیتی چیست؟ (در صورتی که هر سه کلاس به یک گیم‌آبجکت اضافه شده‌اند) public class A : MonoBehaviour { public virtual void SayHello() => Debug.Log("Hello from A"); } public class B : A { public override void SayHello() => Debug.Log("Hello…
توضیح کامل

در کد داده شده، دو کلاس A و B داریم که B از A ارث‌بری کرده و متد SayHello() در A به صورت virtual تعریف شده و در B آن را با override بازنویسی کرده‌ایم. این یعنی وقتی شیئی از کلاس B داریم، فراخوانی SayHello() به صورت پویا (polymorphism) متد بازنویسی‌شده در B را اجرا می‌کند، حتی اگر متغیر مرجع نوع پایه (A) داشته باشد.

حالا، بیایم خط به خط بررسی کنیم:

A a = GetComponent<B>();


این خط کامپوننتی از نوع B روی همان گیم‌آبجکت را برمی‌گرداند، ولی متغیر a که از نوع A تعریف شده، به آن اشاره می‌کند.
نوع واقعی شی هم‌چنان B است ولی نوع مرجع A.
چون SayHello() به صورت virtual و override تعریف شده، وقتی صدا زده شود، نوع واقعی شی (یعنی B) تعیین کننده کدام متد اجرا شود.
پس وقتی a.SayHello() فراخوانی می‌شود، متد SayHello در کلاس B اجرا می‌شود، نه A.

B b = GetComponent<A>() as B;


این خط کمی پیچیده‌تر است: ابتدا GetComponent<A>() اجرا می‌شود. از آنجایی که B از A ارث‌بری کرده و فرض می‌کنیم کامپوننت B روی گیم‌آبجکت وجود دارد، این تابع B را برمی‌گرداند اما به عنوان A.
سپس با as B تلاش می‌کنیم مرجع برگشتی را به B تبدیل کنیم.
چون شی واقعی B است، کست موفقیت‌آمیز بوده و متغیر b به شی B اشاره می‌کند.
در نتیجه، وقتی b.SayHello() فراخوانی می‌شود، مستقیماً متد SayHello کلاس B اجرا می‌شود.

---

نکات کلیدی که باید یاد بگیریم:

1. نوع مرجع (Reference Type) و نوع واقعی (Actual Type):
در C# وقتی متغیری از نوع پایه (مثل A) داریم ولی شی واقعی از نوع مشتق شده (مثل B) است، نوع واقعی تعیین کننده رفتار متدهای virtual و override است.

2. متدهای virtual و override:
این متدها به C# اجازه می‌دهند که در زمان اجرا، بر اساس نوع واقعی شی، نسخه مناسب متد اجرا شود، نه نوع متغیر مرجع.

3. کست‌کردن (Casting) و عملگر `as`:
عملگر as تلاش می‌کند نوع متغیر را به نوع دلخواه تبدیل کند و اگر موفق نباشد، مقدار null می‌دهد. اما در این مثال، چون شی واقعی از نوع B است، کست موفقیت‌آمیز است.

4. گت‌کامپوننت GetComponent در یونیتی:
این تابع بر اساس نوع T، کامپوننت مناسب را روی گیم‌آبجکت برمی‌گرداند. در صورتی که T پایه یک کلاس باشد و شی واقعی مشتق، GetComponent شی مشتق را برمی‌گرداند ولی به صورت مرجع T.

---

خلاصه

در این مثال، مهم‌ترین نکته این است که متدهای virtual همیشه بر اساس نوع واقعی شی اجرا می‌شوند، نه نوع متغیری که به آن ارجاع داده شده. همچنین GetComponent<T>() بسته به نوع داده شده، کامپوننت مورد نظر را برمی‌گرداند ولی شی واقعی روی گیم‌آبجکت تعیین کننده رفتار است.

این باعث می‌شود که هر دو a.SayHello() و b.SayHello() خروجی "Hello from B" داشته باشند، حتی اگر a نوعش A باشد.
👾7👍21
💡 کد سی‌شارپ تو یونیتی چطوری اجرا میشه؟

🔥 خیلیا فکر می‌کنن چون داریم با 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 استفاده کن


#یونیتی #برنامه_نویسی
#Performance #Optimization
104🤔1
📌 قانون خوشگل‌نویسی تو C#

🧠 یه چیزی هست که کدت رو از "فقط کار کردن" به "تمیز و قابل فهم" تبدیل می‌کنه: اسم‌گذاری درست!

بیا با هم یاد بگیریم چه موقع از حروف بزرگ یا کوچیک اول اسم استفاده کنیم.


🎯 تعریف PascalCase چیه؟

🔹 یعنی هر کلمه با حرف بزرگ شروع میشه
🔹 مثل اینا:

PlayerHealth  
StartGame
CurrentLevel


استفاده‌ش برای ایناست:

● اسم کلاس‌ها 👉 GameManager
● متدها 👉 LoadLevel()
● پراپرتی‌ها 👉 public int LifeCount { get; private set; }


🎯 تعریف camelCase چیه؟

🔹 یعنی اولین کلمه با حرف کوچیک شروع میشه، بقیش بزرگ
🔹 مثل اینا:

playerHealth  
startGame
currentLevel


اینو کجا استفاده می‌کنیم؟

● برای متغیرها و فیلدهای معمولی
● پارامترها
● فیلدهای private:

private int lifeCount;
private GameObject savedPoint;



🔥 مثال درست ترکیبی:

public class GameManager : MonoBehaviour
{
public static GameManager Instance { get; private set; }

public int LifeCount { get; private set; } // پراپرتی = PascalCase
private int lifeCount; // فیلد = camelCase

public void LoadLevel() { } // متد = PascalCase
}



اشتباه رایج چیه؟

🔻 اشتباه اینه که پراپرتی رو با حرف کوچیک بنویسی:

public int lifeCount { get; private set; } // 😬 اشتباهه


درستش اینه:

public int LifeCount { get; private set; } // 😎 عالیه



💡 چرا اینا مهمه؟

🔸 چون کدت خوش‌خوان‌تر میشه
🔸 همه IDEها (ویژوال استودیو، رایدر و...) طبق همین استاندارده جلو میرن
🔸 اگه تو تیم باشی یا کدت رو بدی دست یکی دیگه، سریع می‌فهمه چی به چیه


🧵 تهش اینو بگم:
کدی که فقط کار می‌کنه نه!
کدی که خوندنش کیف بده، اون حرفه‌ایه 😎

📎 سیو کن یادت نره ✌️


#یونیتی #برنامه_نویسی
#CSharp #CodeStyle #Unity
8👍4🙏21