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

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

گروه: @StartUnityGP

🫂 @AmirHDeveloper @HaminGames
Download Telegram
اهمیت 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
📣 معرفی 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


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

#یونیتی #برنامه_نویسی #پکیج_یونیتی #متن_باز
#Unity #UPM #OpenUPM #UnityPackages
🔥9👍2
Forwarded from | AmirHossein |
بعد از ۱۳ ماه تلاش، 🎉 LaraGram 3 منتشر شد!

در این نسخه به یک ورژن پایدار رسیدیم که دیگه قرار نیست تغییرات ساختاری یا سینتکسی داشته باشیم.

فیچرهای زیادی اضافه شده که توسعه ربات رو به ساده‌ترین شکل ممکن می‌رسونه 🚀
در ادامه، یه توضیح کوتاه از قابلیت‌های مهم نسخه جدید می‌بینید:

🔐 سیستم کنترل مجوز با قابلیت تعریف Gate و Policy (برای کنترل دسترسی به عملیات‌های پایگاه‌داده)

🧠 سیستم کشینگ با پشتیبانی از ۷ درایور مختلف برای ذخیره داده‌های موقتی
📋 همچنین، Step Manager بر پایه همین سیستم پیاده‌سازی شده

🔁 کالکشن‌ها برای کار حرفه‌ای و راحت با Iterable‌ها

⚙️ سیستم Concurrency برای پردازش همزمان چند درخواست در پس‌زمینه

⚙️ بهبود سیستم کانفیگ و اضافه شدن فایل .env برای مدیریت بهتر تنظیمات

💻 کرنل کنسول برای ایجاد و اجرای راحت کامندها، به‌علاوه زمان‌بندی اجرای تسک‌ها

📦 بازنویسی کامل Eloquent ORM به صورت اختصاصی با پشتیبانی از ۵ دیتابیس مختلف و انواع روابط
📐 همراه با قابلیت‌های Migrations، Seeders و Factory

🔒 سیستم‌های Crypt و Hash برای رمزنگاری

📢 Event Dispatcher برای تعریف و مدیریت رویدادها

📁 سیستم File برای کار با فایل‌ها و پوشه‌ها

🎛 بهبود چشم‌گیر در کیبورد بیلدر و سهولت استفاده

🧭 سیستم Listening الهام‌گرفته از Routing لاراول با امکاناتی مثل:
▪️ پردازش ورودی‌ها
▫️ ایجاد گروه و کنترلر
▪️ اعمال محدودیت و Middleware
▫️ ریدایرکت بین بخش‌ها
▪️ نام‌گذاری مسیرها
▫️ و...

📝 سیستم Log برای ثبت لاگ‌ها با درایورهای متنوع

📨 سیستم Queue و Job برای ایجاد صف و زمان‌بندی اجرای کارها

🧰 اینترفیس جامع Redis با پشتیبانی کامل

🧬 پردازش هر درخواست در یک Pipeline مستقل برای کنترل بهتر

🧩 موتور قالب‌سازی پیشرفته الهام‌گرفته از Blade برای ساخت پیام‌ها

🌍 سیستم Translation برای ساخت ربات‌های چندزبانه

سیستم اعتبارسنجی داده‌ها با قوانین متنوع و قابلیت تعریف Rule سفارشی

🤖 امکان تعریف چندین کانکشن و مدیریت هم‌زمان چند ربات

🧹 امکان کش کردن کانفیگ‌ها، لیسنرها، ایونت‌ها، تمپلیت‌ها، سرویس‌ها و پکیج‌ها برای بهبود عملکرد ربات

و اما معرفی دو پکیج قدرتمند و جذاب:


‌‏🗓 Tempora: مشابه Carbon برای کار با تاریخ و زمان، به صورت چندزبانه و بازنویسی‌شده اختصاصی برای LaraGram

⚡️ LaraGram Surge: مشابه Octane برای اجرای ربات بر پایه Swoole و OpenSwoole
(و به‌زودی با پشتیبانی از RoadRunner و FrankenPHP!)

در آینده‌ای نزدیک LaraGram Installer برای ایجاد حرفه‌ای تر پروژه و همچنین پشتیبانی از MongoDB را نیز خواهیم داشت.

اگر خوشتون اومد، لطفاً به پروژه ⭐️ بدید، به دوستاتون معرفی کنید و حمایتتون رو نشون بدید
خودتون استفاده کنید، ایرادی دیدید بگید تا برطرف کنیم
یا حتی بیاید در توسعه کمک کنید ❤️

📌 پروژه در گیت‌هاب:
♦️ LaraGram
🔹 Laraquest
♦️ LaraGram Surge
🔹 Tempora
♦️ Core

@AmirhDeveloper🔰
.
🔥8
Forwarded from Nightingale
درود و خسته نباشید به توسعه دهندگان عزیز

با کمک یکی از دوستان یه سرور VPN برای دور زدن تحریم ها راه اندازی کردیم. ویژه توسعه دهندگان بازی با IP تمیز و معتبر

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

برای همین تصمیم گرفتیم یه سرور مخصوص این کار راه اندازی کنیم تا کمکی کرده باشیم به بقیه توسعه دهندگان🤝

فعلا تنها چند پلن ماهانه با ظرفیت محدود و قیمت منصفانه داریم تا کیفیت حفظ بشه

اگه استقبال خوب باشه سرور های بیشتری اضافه میکنیم تا بتونیم به کاربران بیشتری کمک کنیم🌱

برای دریافت تست، خرید یا پشتیبانی پیام بدید: @I_am_happy_0

ممنون از همراهیتون❤️
8
🚀 چرا باید از Git استفاده کنیم؟

حتی اگر مبتدی هستی، حتی اگر تک‌نفره کار می‌کنی.

یکی از خطرناک‌ترین باورها بین برنامه‌نویس‌ها و بازی‌سازها (مخصوصا تازه‌کارها) اینه:

💬 "فعلا نیازی به Git ندارم، پروژه‌م کوچیکه و تنهایی کار می‌کنم..."

این جمله می‌تونه ماه‌ها جلوی رشد فنی شما رو بگیره.

گیت فقط برای پروژه‌های تیمی یا بزرگه؟

نه! گیت یک ابزار پایه‌ای برای توسعه نرم‌افزاره. مثل نفس کشیدن برای یک برنامه‌نویس.
درسته که توی تیم و پروژه‌های بزرگ، بدون گیت کاری پیش نمیره، ولی حتی اگه:

▫️ تنهایی کار می‌کنی
▫️ پروژه‌ت ساده‌ست
▫️ هنوز در حال یادگیری هستی

باز هم گیت یک نجات‌دهنده‌ست.

چرا گیت حتی در پروژه‌های انفرادی هم نیازه؟

تاریخچه‌ی کامل پروژه
می‌تونی به هر زمانی در گذشته برگردی و ببینی دقیقا چه زمان، چه چیزی رو تغییر دادی. دیگه خبری از فایل‌های Final_v4_last_REAL.zip 😂 نیست.

🧪 آزمون و خطای بدون استرس
بدون نگرانی از خراب شدن کد، ویژگی‌های جدید رو تست کن. چون می‌دونی با یک دستور ساده (revert) همه‌چیز به حالت قبل برمی‌گرده.

☁️ بک‌آپ هوشمند و واقعی
گیت یک سیستم بک‌آپ معمولی نیست؛ یک ورژن کنترل قدرتمنده. یعنی با هر تغییر، فقط همون تغییرات رو ذخیره می‌کنه نه کل پروژه رو. با GitHub یا GitLab هم یک بک‌آپ ابری امن داری.

📈 عادت‌سازی برای آینده‌ی حرفه‌ای
اگه الان تنبلی کنی و یادش نگیری، وقتی وارد یک تیم واقعی بشی یا پروژه‌ت بزرگ بشه، مجبوری کلی چیز جدید رو با استرس و عجله یاد بگیری. پس از الان پیش‌دستی کن!

🎯 اما بعضی‌ها میگن:

💬 "من با Unity Collaborate یا Plastic SCM راحت‌ترم."
💬 "یه فلش برای بک‌آپ دارم، کافیه دیگه."

دو نکته‌ی مهم:

1️⃣ ابزارهایی مثل Unity Collaborate عالی هستن، ولی گیت استاندارد جهانی توسعه‌ست. شما باید مهارتی رو یاد بگیری که همه‌جا کاربرد داشته باشه، نه ابزاری که فقط به یک پلتفرم خاص وابسته است.

2️⃣ نگه‌داری پروژه با فلش و کپی کردن فولدر، نشانه‌ی ضعف در سازمان‌دهی و نداشتن مهارت ورژن کنترله. گیت از نظر فضا و امنیت بسیار بهینه‌تره و هیچ سیستم دستی‌ای جای اون رو نمی‌گیره.

📌 و مهم‌تر از همه:

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

🔥 اگه هنوز از گیت استفاده نمی‌کنی، همین امروز اولین ریپازیتوری رو برای پروژه‌ت بساز.
مطمئن باش آینده‌ی خودت ازت تشکر می‌کنه.

#یونیتی #برنامه_نویسی #ورژن_کنترل
#Unity #Git #VersionControl
🔥11👍2👏1
💡 اجرای کد بعد از لود شدن هر Scene — حتی وقتی اسکریپتت از بین نمیره!

🔥 بعضی وقت‌ها تو پروژه یونیتی اسکریپت‌هایی داریم که با DontDestroyOnLoad زنده نگهشون می‌داریم.
این یعنی وقتی Scene جدید لود میشه، اسکریپت از بین نمیره... اما یک مشکل پیش میاد:

⛔️ متدهای Start() و Awake() دیگه فراخوانی نمیشن!
پس چطور بفهمیم Scene جدید لود شده تا یک کد خاص اجرا کنیم؟


🧩 راه‌حل: گوش دادن به ایونت SceneManager

یونیتی یک ایونت داره به اسم SceneManager.sceneLoaded که هر بار Scene جدید لود بشه، صداش می‌کنه.

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoadListener : MonoBehaviour
{
void OnEnable()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}

void OnDisable()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}

void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
Debug.Log("Scene Loaded: " + scene.name);
// اینجا کدهایی که میخوای بعد از لود شدن صحنه اجرا بشه رو بذار
}
}



🎯 چرا این روش عالیه؟

● از هر جایی در پروژه کار می‌کنه (حتی اگه اسکریپتت Destroy نشه)
● روی همه حالت‌های لود (Single یا Additive) جواب میده
● برای سیستم‌های مرکزی مثل مدیریت صدا، داده‌های بازیکن، یا UI جهانی ایده‌آله


⚙️ نکات پیشرفته

● اگه Scene رو با LoadSceneAsync لود می‌کنی، باز هم این ایونت بعد از کامل شدن لود صدا زده میشه.
● برای اجرای کد قبل از فعال شدن صحنه می‌تونی از AsyncOperation.completed هم استفاده کنی.
● حتماً در OnDisable ایونت رو حذف کن تا از Memory Leak جلوگیری بشه.


🚀 جمع‌بندی
برای اسکریپت‌های DontDestroyOnLoad که نیاز دارن بعد از لود شدن هر Scene یک کاری انجام بدن، بهترین روش استفاده از `SceneManager.sceneLoaded` هست.
این روش سبک، امن و استاندارد یونیتیه.

#یونیتی #برنامه_نویسی
#SceneManager #DontDestroyOnLoad
🔥14🙏1
💡کدام API گرافیکی؟ مقایسه OpenGL، DirectX و Vulkan

اصلا API گرافیکی چیه؟
رابط نرم‌افزاری (API – Application Programming Interface) گرافیکی، در واقع یه «پل ارتباطی» بین بازی/برنامه و کارت گرافیک (GPU) هست.

به زبان ساده: بازی‌ت مستقیما با سخت‌افزار حرف نمی‌زنه؛ بلکه از طریق این واسطه دستور می‌ده.

بازی → API گرافیکی → درایور کارت گرافیک → GPU
این باعث میشه توسعه‌دهنده نیازی به درگیری مستقیم با جزئیات سخت‌افزار نداشته باشه و فقط با دستورهای استاندارد کار کنه.


🎮مقایسه APIهای گرافیکی:

1️⃣ اوپن‌جی‌ال (OpenGL): قدیمی اما کارآمد
وضعیت: API قدیمی و سطح بالا (High-Level).
مدیریت: برای توسعه‌دهنده آسون‌تره، اما بهینگی کمتری داره.
کارکرد: بیشتر کار روی دوش CPU می‌افته و همین باعث میشه
پرفورمنس کمتری داشته باشه.

2️⃣ دایرکت‌اکس (DirectX): سلطان ویندوز
وضعیت: مخصوص مایکروسافت (ویندوز و Xbox).
نسخه جدید: DX12 یه API سطح پایین (Low-Level) و
شبیه Vulkan عمل می‌کنه.
کارکرد: مدیریت عالی CPU و GPU، فریم‌ریت بالاتر رو تضمین
می‌کنه. اما فقط روی پلتفرم‌های مایکروسافت کار می‌کنه.

3️⃣ وولکان (Vulkan): آینده در دستان توست!
وضعیت: API سطح پایین (Low-Level) و
کراس‌پلتفرم (Cross-Platform).
مدیریت: به GPU دسترسی مستقیم میده و
سربار (Overhead) CPU رو شدیدا کاهش میده.
کارکرد: از قابلیت چندنخی (Multithreading) واقعی بهره
می‌بره و از CPUهای چند هسته‌ای بهترین استفاده رو می‌کنه.
نکته: برای بازی‌ها و اپلیکیشن‌های سنگین گرافیکی بهترین
انتخابه!


🕹استفاده از Vulkan/OpenGL/DirectX توی یونیتی

چطور انتخابش کنیم؟
مرحله اول: توی Project Settings، بخش Graphics
یا Player، رندررهای مختلف رو می‌تونی انتخاب کنی.
● مثال
: روی ویندوز، می‌تونی DirectX 11, DirectX 12,
و OpenGLCore
یا Vulkan رو انتخاب کنی. روی اندروید
معمولا OpenGL ES یا Vulkan و روی iOS هم Metal
یا OpenGL ES انتخاب میشه.

مرحله دوم: هنگام گرفتن بیلد (Build)، پلتفرم رو انتخاب کن.
تنظیمات: تیک گزینه "Auto Graphics API" رو بردار تا بتونی
به صورت دستی API مورد نظرت رو انتخاب کنی.

یونیتی خودش مترجمه!
بی‌نیاز از کدنویسی مستقیم: توی کد C# یا Shaderها، لازم
نیست مستقیما Vulkan یا DirectX رو صدا بزنی.
● کار یونیتی
: APIهای یونیتی خودشون دستورها رو به رندرری که
انتخاب کردی ترجمه می‌کنن. کارت رو راحت کرده!

نکته حرفه‌ای:
● پس Vulkan یا OpenGL؟: استفاده از Vulkan به
جای OpenGL روی سخت‌افزارهای جدید، فریم‌ریت بالاتری
بهت میده چون بهینه‌تر از CPU استفاده می‌کنه.
هشدار: ولی حواست باشه! ممکنه روی سخت‌افزارهای خیلی
قدیمی یا کارت‌های گرافیک ضعیف، Vulkan مشکل‌ساز بشه و
باعث کرش یا افت فریم بشه.


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


#یونیتی #برنامه_نویسی #گرافیک
#Vulkan #OpenGL #DirectX #Unity
10❤‍🔥2👏1
💡 فضای رنگی در یونیتی: Gamma و Linear — چی هستن و چطور تغییرشون بدیم؟

🔹 گاما (Gamma)

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

🔹 خطی (Linear)

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


🧩 چطور Gamma و Linear رو در یونیتی تغییر بدیم؟

1️⃣ وارد منوی Edit > Project Settings > Player بشید.
2️⃣ بخش Other Settings رو پیدا کنید.
3️⃣ گزینه Color Space رو به Gamma یا Linear تغییر بدید.

💡 نکته:

● برای سبک‌های فانتزی و غیرواقع‌گرایانه: Gamma.
● برای سبک‌های واقع‌گرایانه و سینمایی: Linear.


⚡️ چرا این موضوع مهمه؟

● کیفیت نورپردازی و بازتاب‌ها رو تحت تاثیر قرار می‌ده.
● باعث می‌شه بازی شما طبیعی‌تر دیده بشه و سبک پروژه بهتر منتقل بشه.

#یونیتی
#Unity #ColorSpace
9👍32
Forwarded from Hamin Game's Ⓜ️
«🙌 حالتون چطوره رفقا؟ ❤️
یه سری گروه و کانال تلگرامی که فکر کنم به درد بازی‌سازها بخوره.
اینجا می‌ذارم شاید برای شما هم مفید باشه 👇
https://news.1rj.ru/str/addlist/MRPZbKIo6PU5OTA8
12