Start Bevy
326 subscribers
7 photos
2 videos
10 links
هیچ پروسه ای سخت نیست به شرطی که شروعش کنی..

گروه: @BevyGP

🫂 @AmirHDeveloper @HaminGames
Download Telegram
💡 کد سی‌شارپ تو یونیتی چطوری اجرا میشه؟

🔥 خیلیا فکر می‌کنن چون داریم با 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
⚡10❤4🤔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🙏2❤1
📣 معرفی 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
🚀 چرا باید از 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
⚡10👍3❤2
Forwarded from Hamin Game's Ⓜ️
«🙌 حالتون چطوره رفقا؟ ❤️
یه سری گروه و کانال تلگرامی که فکر کنم به درد بازی‌سازها بخوره.
اینجا می‌ذارم شاید برای شما هم مفید باشه 👇
https://t.me/addlist/MRPZbKIo6PU5OTA8
❤13
🎨 رندر پایپ‌لاین در یونیتی چیه و چه کاربردی داره؟

وقتی توی یونیتی یه صحنه سه‌بعدی می‌سازیم، چیزی که در نهایت روی صفحه نمایش می‌بینیم حاصل یه فرآیند چندمرحله‌ایه به اسم Render Pipeline.
به زبان ساده: رندر پایپ‌لاین همون "خط لوله پردازش تصویر" یونیتی هست که مشخص می‌کنه مدل‌ها، نورها، افکت‌ها و متریال‌ها چطور پردازش و روی صفحه کشیده بشن.

یونیتی برای نیازهای مختلف ۳ رندر پایپ‌لاین اصلی داره:



پیش‌فرض: 🔹 Built-in Render Pipeline (کلاسیک)


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


سبک: 🔹 Universal Render Pipeline (URP)


● قبلاً به اسم LWRP (Lightweight RP) شناخته می‌شد.
● هدفش اینه که روی پلتفرم‌های مختلف (موبایل، کنسول، PC) یه تعادل بین کیفیت و کارایی بده.
● امکاناتش شامل: شیدرهای مدرن، نورپردازی بهتر، Post Processing داخلی، و مدیریت بهتر منابع.
● مناسب برای بیشتر بازی‌های امروزی، مخصوصاً اگه بخوای هم روی موبایل و هم روی کنسول/PC منتشر کنی.


پیشرفته: 🔹 High Definition Render Pipeline (HDRP)


● برای پروژه‌های با کیفیت بالا (AAA) ساخته شده.
● تمرکز روی واقع‌گرایی گرافیکی: نورپردازی فیزیک‌محور (PBR)، انعکاس‌های دقیق، Volumetric Lighting، سایه‌های پیشرفته، Ray Tracing.
● نیاز به سخت‌افزار قوی‌تر داره و بیشتر برای PC و کنسول‌های نسل جدید استفاده میشه.
● اگه هدفت گرافیک خفن و نزدیک به واقعیت باشه، HDRP بهترین گزینه‌ست.


✨ رندر پایپ‌لاین سفارشی (Custom SRP)


یونیتی یه قابلیت فوق‌العاده به اسم Scriptable Render Pipeline (SRP) داره.
یعنی بدون اینکه سورس انجین یونیتی رو دستکاری کنی، می‌تونی پایپ‌لاین رندر اختصاصی خودت رو بسازی.
با C# و Shader Graph میشه کنترل کرد که:

● صحنه چطور رندر بشه،
● ترتیب پردازش نور و سایه چطور باشه،
● چه افکت‌ها یا تکنیک‌های خاصی استفاده بشن.

این ویژگی بیشتر به درد تیم‌های حرفه‌ای یا استودیوهایی می‌خوره که می‌خوان استایل بصری خاص خودشون رو داشته باشن (مثلاً بازی‌های سبک سل‌شید، یا موتورهای بهینه‌شده برای سبک هنری خاص).

#یونیتی #رندرپایپ‌لاین #گرافیک_بازی
#Unity #RenderPipeline #URP #HDRP #SRP
⚡7❤3
درود بر هنرمندان و جویندگان خرد..
شب یلدا خجسته باد.. باشد که نور دانایی و امید دلهایتان را همیشه روشن نگه دارد ❤️
❤14🥰6😁1
دراو کال (Draw Call) در بازی‌سازی چیست؟
به زبان ساده، Draw Call یک "دستور" است که CPU به GPU می‌دهد و می‌گوید: "این آبجکت رو با این تنظیمات روی صفحه بکش."

فرض کنید یک نقاش (GPU) و یک مدیر (CPU) دارید:
● مدیر به نقاش می‌گوید: "این صندلی رو بکش." (یک Draw Call)
● بعد می‌گوید: "حالا قلم‌مو رو عوض کن و اون میز رو بکش." (یک Draw Call دیگه)

⚠️ چرا مهمه و مشکل کجاست؟
مشکل اینجاست که GPU خیلی سریعه، اما CPU برای آماده‌سازی هر دستور وقت می‌ذاره.
اگر شما ۱۰۰۰ تا سنگ توی بازی داشته باشید و برای هر کدوم یک دستور جداگانه بفرستید، CPU وقتش صرف "کاغذبازی" و ارسال دستورات میشه و GPU بیکار منتظر می‌مونه.

💡 قانون طلایی: هرچقدر تعداد Draw Callها کمتر باشه، فشار روی CPU کمتره و فریم‌ریت بالاتری می‌گیرید.

🛠 چطور Draw Callها رو کم کنیم؟ (Optimization)

برای نجات بازی‌تون باید آبجکت‌ها رو "بسته‌بندی" کنید تا با یک دستور رسم بشن:

1. استفاده از Texture Atlas:
به جای ۱۰ تا تکسچر جدا برای ۱۰ تا آبجکت، همه رو توی یک عکس بزرگ جا بدید تا متریال عوض نشه.

2. بچینگ (Batching):
موتورهایی مثل یونیتی و آنریل قابلیت Static Batching دارند. این کار آبجکت‌های ساکن (مثل دیوارها و صخره‌ها) رو در پشت صحنه به یک آبجکت بزرگ تبدیل می‌کنه تا با یک Draw Call رسم بشن.

3. تکنیک GPU Instancing:
وقتی می‌خواید هزاران کپی از یک آبجکت (مثل چمن، درخت یا سربازها) داشته باشید، از این تکنیک استفاده کنید تا CPU فقط یک بار دستور بده: "این مدل رو ۱۰۰۰ بار در این مختصات‌ها بکش."

#بازی_سازی #دراو_کال #بهینه‌سازی
#GameDev #Optimization #DrawCall
❤11😍1
«آتش سرد» (Cold Flame) در دنیای شیمی، نماد بقا در شرایطی است که اکسیژن یا سوخت کافی برای یک انفجار بزرگ وجود ندارد، اما شعله همچنان زنده می‌ماند؛ آرام، آبی‌رنگ و نامرئی. شرایط این روزها دقیقاً شبیه به همین پدیده شده است.

آتش یک «ماده» نیست، بلکه یک «فرآیند» است. وقتی یک ماده‌ی سوختنی با اکسیژن واکنش می‌دهد، انرژی پیوندهای شیمیایی آزاد شده و به شکل گرما و نور در می‌آید. چیزی که ما به عنوان شعله می‌بینیم، در واقع گازهای بسیار داغی هستند که در حال برانگیختگی‌اند. نور زردی که در آتش‌های معمولی می‌بینید، ناشی از ذرات ریز کربن (دوده) است که آن‌قدر داغ شده‌اند که مثل آهن گداخته، از خود نور ساطع می‌کنند.

آتش سرد زمانی پدیدار می‌شود که سیستم از فاز «احتراق کامل» به فاز «اکسیداسیون آرام» تغییر وضعیت می‌دهد. برخلاف آتش معمولی که دمای آن به ۱۵۰۰ درجه می‌رسد، آتش سرد در محدوده‌ی ۲۰۰ تا ۴۰۰ درجه سانتی‌گراد باقی می‌ماند. در اینجا اکسیژن آن‌قدر زیاد نیست که کربن را به دی‌اکسید کربن تبدیل کند؛ بنابراین واکنش در مراحل میانی متوقف می‌شود. نور این آتش نیز آن‌قدر ضعیف است که چشم انسان در حالت عادی آن را نمی‌بیند.

در چنین وضعیتی، تبدیل شدن به «آتش سرد» یک مکانیسم دفاعی است. این پدیده شاید یخِ اطراف را ذوب نکند، اما از انجمادِ هسته‌ی مرکزی جلوگیری می‌کند. در این روزها، حفظ هویت و زندگیمان، شباهت زیادی به این فرآیند دارد..

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

به امید روزهای بهتر..
❤7⚡4
درود دوستان گل
خواستم کانال خوب
GOD Mode Game Dev
رو بهتون معرفی کنم که محتوا آموزشی خیلی باکیفیتی تولید میکنه و آموزش هاش اصلا سطحی نیست مستقیم رفته زیر کاپوت یونیتی و مباحث رو خیلی عمیق و اصولی توضیح میده
از بهینه سازی و پشت پرده انجین گرفته تا ترفندهای خفنی که کار رو راحت میکنه.. خلاصه که حیفه از دستش بدید
@GODModeGameDev
🔥13
📦 آشنایی با فرمت glTF

اگر در دنیای سه‌بعدی یا بازی‌سازی فعالیت کرده باشید، حتماً نام فرمت‌های قدیمی مثل FBX یا OBJ را شنیده‌اید. اما در چند سال اخیر، یک فرمت مدرن به نام glTF (مخفف GL Transmission Format - فرمت انتقال جی‌ال) بی سروصدا آمده و دارد به استاندارد مطلق صنعت تبدیل می‌شود.

این فرمت توسط Khronos Group (خالقین OpenGL و Vulkan) ساخته شده و یک هدف بزرگ دارد: انتقال و لودِ فوق‌سریعِ مدل‌های سه‌بعدی.

❓ مشکل فرمت‌های قدیمی مثل FBX چیست؟

فرمت FBX انحصاری شرکت اتودسک است. این فرمت مثل یک جعبه‌ی درپوشیده و سنگین است که داده‌ها را به روش خودش ذخیره می‌کند. وقتی یک فایل FBX را وارد انجین بازی می‌کنید، پردازنده (CPU) باید زمان زیادی را صرف کالبدشکافی, رمزگشایی و تبدیل آن داده‌ها به فرمتی کند که کارت گرافیک (GPU) بفهمد. این یعنی زمان لودینگ طولانی و مصرف شدید رم.

⚡️ چرا glTF یک شاهکار مهندسی است؟

قانون طلایی glTF این است: «داده‌ها را دقیقاً همان‌طوری ذخیره کن که GPU می‌خواهد.»

وقتی انجین یک فایل glTF را لود می‌کند، فایل باینریِ آن نیازی به رمزگشایی یا تغییر ساختار پیچیده توسط CPU ندارد؛ این دیتای خام با کمترین پردازش، مستقیماً آماده فرستاده شدن به حافظه کارت گرافیک (VRAM) است. به همین دلیل سرعت بارگذاری آن بسیار سریع‌تر از FBX است.

📉 کاهش حجم فایل: فرمت glTF (به‌ویژه نسخه یکپارچه آن یعنی GLB) از تکنولوژی‌های فشرده‌سازی پیشرفته‌ای مثل Draco compression برای مش‌ها و Basis Universal برای تکسچرها پشتیبانی می‌کند. این یعنی حجم دانلود بازی و حجم اشغال‌شده روی دیسک به شدت کاهش می‌یابد.

🗂 انواع خروجی‌های glTF (چند فایلی یا تک فایلی؟)

این فرمت هوشمند به دو شکل مختلف می‌تواند ذخیره و استفاده شود:

1️⃣ حالت چند فایلی (glTF + .bin.): در این حالت یک فایل متنی با پسوند gltf. (بر پایه JSON) داریم که ساختار درختی صحنه، متریال‌ها و تنظیمات نور را توضیح می‌دهد، و یک یا چند فایل با پسوند bin. که حاوی دیتای خام نقاط (Vertices) و انیمیشن‌هاست. تصاویر تکسچر هم کنار آن‌ها قرار می‌گیرند. این حالت برای زمانی که می‌خواهید کدها یا متریال‌ها را دستی ویرایش کنید عالی است.
2️⃣ حالت تک فایلی (GLB): نسخه فشرده، باینری و یکپارچه است. در این حالت تمام دیتای JSON، فایل‌های باینری و حتی تصاویر تکسچر درون یک فایل واحد با پسوند glb. بسته‌بندی می‌شوند. این فرمت به خاطر راحتی در جابه‌جایی، استاندارد اصلی وب و محیط‌های پرفورمنس‌محور است.

🌍 کجاها کاربرد دارد؟

● وب (Web3D / WebXR): به دلیل حجم کم و سرعت لود بالا، فرمت اصلی تمام سایت‌های سه‌بعدی است.
● انجین‌های نسل جدید: موتورهای بازی‌سازی مدرن (مثل Godot، یا Bevy در Rust) معماری سیستم ایمپورت خود را کاملاً بر پایه glTF بنا کرده‌اند.
● سازگاری عمومی: امروزه تمام نرم‌افزارهای بزرگ مثل Blender خروجی فوق‌العاده تمیزی از آن می‌دهند و انجین‌های رایج مثل یونیتی هم با پکیج‌های مختلف کاملاً از آن پشتیبانی می‌کنند.

⏱️ لود آنی در زمان اجرا (Runtime Load): اگر بازی شما به گونه‌ای است که باید یک مدل سه‌بعدی را از اینترنت دانلود کند و وسط بازی به بازیکن نشان دهد (مثل بازی‌های آنلاین، متاورس، یا بازی‌های دیتامحور)، FBX اصلاً گزینه مناسبی نیست. لود کردن یک فایل FBX در زمان اجرای بازی به شدت سنگین است، در حالی که ابزارهایی مثل glTFast مدل‌های glTF را با سرعت فوق‌العاده بالایی در حافظه گرافیکی (VRAM) بارگذاری می‌کنند.

نتیجه‌گیری:

شاید هنوز در مرحله تولید و جابه‌جایی فایل‌ها بین نرم‌افزارهای مدل‌سازی به FBX نیاز داشته باشیم (چون FBX یک فرمت ویرایشی است)، اما glTF به عنوان یک فرمت انتشار و خروجی نهایی، برای بهینه‌سازی پروژه‌ها و کاهش زمان لودینگ، بهترین و منطقی‌ترین انتخاب است. 🚀🔥

#گرافیک_بازی #بهینه‌سازی #مدلسازی #سه_بعدی
#glTF #GLB #GameDev #Graphics #3D
❤11⚡3
درود دوستان عزیز،
امروز می‌خوام درباره موضوعی صحبت کنم که شاید مستقیماً به کدنویسی یا گرافیک ربط نداشته باشه، اما به شدت روی بازدهی ذهنی، خلاقیت و آرامش ما به عنوان توسعه‌دهنده (و کلاً به عنوان انسان) تاثیر می‌ذاره: گره زدن شخصیت به افکار و اطلاعات بیرونی.

در روان‌شناسی، مفهومی داریم به نام «تمایزیافتگی خویشتن» (Differentiation of Self) و «تفکیک ایگو» (Ego Uncoupling). به زبان ساده، یعنی فرد چقدر می‌تونه هویت و ارزش درونی خودش رو از نظرات، ایدئولوژی‌ها یا حتی افرادی که دنبال می‌کنه، جدا نگه داره.

تله‌ی ایگو و رسانه‌های زرد:
خیلی وقت‌ها ما متوجه نیستیم، اما هویتمون رو به یک ایده، یک شخص یا یک جریان رسانه‌ای گره می‌زنیم. وقتی این اتفاق میفته، چه واکنشی نشون می‌دیم؟ اگر کسی به اون ایده یا شخص نقد وارد کنه، ما به جای تحلیل منطقی، احساس می‌کنیم به شخصِ ما حمله شده! در نتیجه گارد می‌گیریم، عصبی می‌شیم و سعی می‌کنیم طرف مقابل رو با برچسب‌هایی مثل «ناپخته» یا «ناآگاه» تحقیر کنیم. این دقیقاً همون نقطه‌ای است که رسانه‌های زرد (چه سیاسی، چه زردِ تکنولوژی) ازش سوءاستفاده می‌کنن. اونا با تولید محتوای هیجانی، ترس و خشم کاذب ایجاد می‌کنن تا ما رو همیشه در حالت دفاعی نگه دارن.

راهکارِ مهندسیِ ذهن:
به عنوان برنامه‌نویس، ما یاد گرفتیم که سیستم‌ها باید ماژولار (Modular) باشن. ذهن ما هم باید همین‌طور باشه. اگر یک داده‌ی جدید وارد میشه که با باورهای قبلی ما در تضاده، نباید سیستم کِرَش کنه! باید بتونیم بدون تعصب، داده رو بررسی کنیم.

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

همیشه فیلتر ذهنی خودتون رو روشن نگه دارید. به هر داده‌ای شک کنید و مهم‌تر از همه: ارزش و شخصیت خودتون رو به هیچ ایده یا شخص بیرونی گره نزنید.

با ذهنی آزاد و دلی روشن، جاویدان و پیروز باشید.. ❤️
❤5👍3👎2⚡1
درود دوستان گل
از این به بعد تمرکز و فعالیت این کانال روی گیم انجین Bevy خواهد بود..
این مسیر جدیدی هست که انتخاب کردم و قصد دارم چیزهایی که در این مسیر یاد میگیرم رو با شما به اشتراک بذارم
سپاسگزارم که تا اینجا همراهم بودید❤️
❤4👍1
🦀 آشنایی با موتور بازی‌سازی Bevy

در سال‌های اخیر، زبان Rust به دلیل امنیت حافظه و کارایی بالا در سطح سخت‌افزار، جایگاه ویژه‌ای در توسعه سیستم‌ها پیدا کرده است. در حوزه بازی‌سازی نیز موتور Bevy به‌عنوان پروژه‌ای کاملاً مدرن، رایگان و متکی بر معماری داده‌محور (Data-Oriented) متولد شده است. Bevy یک موتور بازی‌سازی کدپایه (Code-driven) و متن‌باز (Open Source) است که تلاش می‌کند بدون پیچیدگی‌های ساختاری کدهای قدیمی، حداکثر بازدهی سخت‌افزاری را ارائه دهد.

❓ معماری ECS؛ الگوی مدرن مدیریت داده
بخش اعظم قدرت Bevy مدیون معماری Entity Component System (ECS) اختصاصی آن است:

موجودیت (Entity): شناسه عددی ساده برای تعیین موجودیت‌ها (مانند یک بازیکن یا دشمن).

مولفه (Component): ساختارهای داده‌ای خالص بدون منطق (مانند موقعیت، سرعت یا میزان سلامت).

سیستم (System): توابعی که روی داده‌های Componentها پردازش انجام داده و منطق بازی را پیش می‌برند.

این جداسازی منطق از داده، باعث افزایش چشمگیر Cache Locality در CPU و امکان پردازش موازی بسیار بالا می‌شود.

⚡️ قابلیت‌های برجسته و نقاط قوت
● پردازش موازی خودکار: Bevy وابستگی بین سیستم‌ها را آنالیز کرده و آن‌ها را به‌طور هوشمند روی هسته‌های مختلف CPU پخش می‌کند، بدون اینکه توسعه‌دهنده نیاز به مدیریت پیچیده نخ‌ها (Multi-threading) داشته باشد.

● اجرای بدون گرافیک (Headless Mode) برای سرورها: یکی از کاربردهای کلیدی Bevy، امکان اجرای آن در حالت Headless است. در این حالت، ماژول‌های گرافیکی و صوتی غیرفعال شده و موتور صرفاً منطق و فیزیک بازی را اجرا می‌کند. این ویژگی برای ساخت سرورهای بازی چندنفره (مانند سبک‌های RPG یا MMO) بسیار عالی است؛ چرا که سروری فوق‌العاده سبک، پرسرعت و کم‌مصرف برای منطق فیزیک فراهم می‌سازد.

● کراس‌پلاتفرم (Cross-Platform): Bevy توانایی خروجی گرفتن روی پلتفرم‌های مختلف را دارد

● ساختار کاملاً ماژولار: در Bevy همه بخش‌ها (مانند سیستم ورودی، صدا، رندرینگ) به‌صورت Plugin طراحی شده‌اند. اگر برای یک خروجی خاص یا سرور به ویژگی مشخصی نیاز ندارید، می‌توانید آن پلاگین را حذف کنید تا حجم فایل اجرایی نهایی به حداقل ممکن برسد.

🛡 امنیت حافظه و مقاومت در برابر مهندسی معکوس
استفاده از اکوسیستم Rust باعث شده بازی‌های ساخته‌شده با Bevy از دو جهت امنیت بالاتری نسبت به زبان‌های مدیریت‌شده (Managed) داشته باشند:

دشواری دی‌کامپایل نسبت به بایت‌کدها: برخلاف زبان‌هایی که کدهای آن‌ها به بایت‌کد یا کدهای میانی تبدیل می‌شوند (و به‌راحتی ساختار آن‌ها قابل بازیابی است)، کد Rust مستقیماً به باینری نیتیو ماشین کامپایل می‌شود. این ویژگی مهندسی معکوس و خواندن الگوریتم‌ها را بسیار پیچیده‌تر می‌سازد.

امنیت حافظه در ران‌تایم (Memory Safety): سیستم Ownership و مدیریت حافظه در Rust مانع از بروز آسیب‌پذیری‌های رایج حافظه مانند Buffer Overflow می‌شود. این موضوع امکان اکسپلویت، تزریق کد و سوءاستفاده از حافظه بازی را به شدت کاهش می‌دهد.

🌐 وب‌سایت رسمی
برای مطالعه مستندات و مشاهده نمونه‌کدها می‌توانید به وب‌سایت رسمی Bevy مراجعه کنید:
🔗 https://bevy.org

#بازی_سازی #برنامه_نویسی
#Bevy #Rust #GameDev #ECS
👾5👍2🥴2