🚀 کدام API گرافیکی؟ مقایسه OpenGL، DirectX و Vulkan
✨ اصلا API گرافیکی چیه؟
رابط نرمافزاری گرافیکی (API) مثل یک «پل ارتباطی» عمل میکند. این واسط، دستورات برنامه (مثل یک بازی) را به زبان قابل فهم برای کارت گرافیک (GPU) شما ترجمه و ارسال میکند.
برنامهنویس بدون درگیری با جزئیات سختافزاری، فقط با دستورات استاندارد API کار میکند.
🎮 مقایسه APIهای گرافیکی اصلی:
● 1️⃣ اوپنجیال (OpenGL): قدیمی اما کارآمد (مخفف Open Graphics Library به معنی کتابخانه گرافیکی باز)
★ وضعیت: API قدیمی و سطح بالا (High-Level).
★ مدیریت: کدنویسی برای توسعهدهنده آسانتر است.
★ عملکرد: بیشتر بار کاری روی CPU میافتد (سربار CPU بالا).
★ پلتفرم: ✅ کراسپلتفرم (قابل استفاده در اکثر سیستمعاملها).
★ خلاصه: ساده، اما در کارهای سنگین کُندتر.
● 2️⃣ دایرکتاکس (DirectX): سلطان ویندوز (مخفف Direct eXtension به معنی توسعه مستقیم)
★ وضعیت: مخصوص شرکت مایکروسافت (ویندوز و Xbox).
★ نسخه جدید (DX12): یک API سطح پایین و بسیار بهینه که مدیریت منابع را بهبود داده است.
★ عملکرد: مدیریت عالی CPU و GPU، تضمین فریمریت بالاتر در پلتفرمهای مایکروسافت.
★ محدودیت: ❌ فقط برای پلتفرمهای مایکروسافت.
★ خلاصه: سریع، اما انحصاری.
● 3️⃣ وولکان (Vulkan): آینده کراسپلتفرم (وولکان یک اسم خاص لاتین به معنی آتشفشان یا ایزد آتش است و نماد قدرت و انفجار پرفورمنس آن است.)
★ وضعیت: API سطح پایین (Low-Level) و بسیار قدرتمند.
★ مدیریت: به GPU دسترسی مستقیمتر میدهد و سربار CPU را شدیداً کاهش میدهد.
★ ویژگی کلیدی: بهرهگیری کامل از قابلیت چندنخی (Multithreading) و CPUهای چند هستهای.
★ پلتفرم: ✅ کراسپلتفرم (در اندروید، لینوکس، ویندوز و...).
★ نکته مهم: Vulkan توسط گروه Khronos (همان سازنده OpenGL) ساخته شد تا محدودیتهای OpenGL را برطرف کرده و با DX12 رقابت کند.
★ خلاصه: بهینهترین، چندپلتفرمه، اما نیاز به مدیریت دقیق دارد.
💡 نتیجهگیری:
★ اوپنجیال: سادگی و سازگاری بالا، اما پرفورمنس محدود.
★ دایرکتاکس: بهترین پرفورمنس در ویندوز، اما انحصاری.
★ وولکان: بیشترین پرفورمنس و کراسپلتفرم، جانشین مدرن OpenGL.
🔖 #GameDev #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
✨ اصلا API گرافیکی چیه؟
رابط نرمافزاری گرافیکی (API) مثل یک «پل ارتباطی» عمل میکند. این واسط، دستورات برنامه (مثل یک بازی) را به زبان قابل فهم برای کارت گرافیک (GPU) شما ترجمه و ارسال میکند.
برنامهنویس بدون درگیری با جزئیات سختافزاری، فقط با دستورات استاندارد API کار میکند.
🎮 مقایسه APIهای گرافیکی اصلی:
● 1️⃣ اوپنجیال (OpenGL): قدیمی اما کارآمد (مخفف Open Graphics Library به معنی کتابخانه گرافیکی باز)
★ وضعیت: API قدیمی و سطح بالا (High-Level).
★ مدیریت: کدنویسی برای توسعهدهنده آسانتر است.
★ عملکرد: بیشتر بار کاری روی CPU میافتد (سربار CPU بالا).
★ پلتفرم: ✅ کراسپلتفرم (قابل استفاده در اکثر سیستمعاملها).
★ خلاصه: ساده، اما در کارهای سنگین کُندتر.
● 2️⃣ دایرکتاکس (DirectX): سلطان ویندوز (مخفف Direct eXtension به معنی توسعه مستقیم)
★ وضعیت: مخصوص شرکت مایکروسافت (ویندوز و Xbox).
★ نسخه جدید (DX12): یک API سطح پایین و بسیار بهینه که مدیریت منابع را بهبود داده است.
★ عملکرد: مدیریت عالی CPU و GPU، تضمین فریمریت بالاتر در پلتفرمهای مایکروسافت.
★ محدودیت: ❌ فقط برای پلتفرمهای مایکروسافت.
★ خلاصه: سریع، اما انحصاری.
● 3️⃣ وولکان (Vulkan): آینده کراسپلتفرم (وولکان یک اسم خاص لاتین به معنی آتشفشان یا ایزد آتش است و نماد قدرت و انفجار پرفورمنس آن است.)
★ وضعیت: API سطح پایین (Low-Level) و بسیار قدرتمند.
★ مدیریت: به GPU دسترسی مستقیمتر میدهد و سربار CPU را شدیداً کاهش میدهد.
★ ویژگی کلیدی: بهرهگیری کامل از قابلیت چندنخی (Multithreading) و CPUهای چند هستهای.
★ پلتفرم: ✅ کراسپلتفرم (در اندروید، لینوکس، ویندوز و...).
★ نکته مهم: Vulkan توسط گروه Khronos (همان سازنده OpenGL) ساخته شد تا محدودیتهای OpenGL را برطرف کرده و با DX12 رقابت کند.
★ خلاصه: بهینهترین، چندپلتفرمه، اما نیاز به مدیریت دقیق دارد.
💡 نتیجهگیری:
★ اوپنجیال: سادگی و سازگاری بالا، اما پرفورمنس محدود.
★ دایرکتاکس: بهترین پرفورمنس در ویندوز، اما انحصاری.
★ وولکان: بیشترین پرفورمنس و کراسپلتفرم، جانشین مدرن OpenGL.
🔖 #GameDev #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
🔥8❤3
الگوی Observer در گیم دیولوپمنت: خداحافظ کدهای به هم چسبیده 👋
یکی از تمیزترین راهها برای مدیریت رویدادها در بازی، مخصوصاً توی Unity، استفاده از الگوی Observer است.
به جای این که هر سیستم مستقیماً به بقیه Reference بدهد و همهچیز به هم وابسته شود، رویداد تعریف میکنیم و بقیه فقط «گوش میدهند» 🎧
مثال کلاسیک: وقتی بازیکن سکه برمیدارد:
• سیستم امتیاز باید Score را زیاد کند
• UI باید امتیاز جدید را نمایش بدهد
• یک SoundManager باید افکت صدا پخش کند
اگر PlayerController همه اینها را مستقیم صدا بزند، وابستگیهای زیادی ساخته میشود و هر تغییر کوچک، چند فایل را تحت تأثیر قرار میدهد. این ضد Clean Code است.
با Observer، Player فقط میگوید: «رویداد CoinCollected اتفاق افتاد». بقیه سیستمها خودشـان Subscribe میشوند 👇
حالا Player فقط رویداد را فایر میکند و هیچ چیز دیگری را نمیشناسد:
سیستم امتیاز و UI فقط Subscribe میشوند:
چرا این معماری برای بازیها عالی است؟
• 🧩 Decoupling: Player هیچ اطلاعی از UI یا ScoreSystem ندارد؛ تست و تغییر سادهتر میشود.
• 🔌 افزودن سیستم جدید: فردا میتوان یک VFX جدید ساخت که فقط به همین رویداد Subscribe شود، بدون تغییر در Player.
• 🧹 Clean Code: تابعها یک مسئولیت مشخص دارند (نزدیک به اصل Single Responsibility).
استفاده از Observer توی پروژههای متوسط و بزرگ باعث میشود معماری بازی تمیزتر، قابلگسترشتر و قابلدیباگتر بماند.
قدمبهقدم بخشی از منطقهای به هم چسبیده را به رویدادها منتقل کنید و نتیجه را در سرعت توسعه و Refactor حس کنید 🚀
🔖 #GameDev #بازیسازی #Observer #EventSystem #Unity #CleanCode #GameArchitecture #C#
👤 Developix
💎 Channel: @DevelopixGame
یکی از تمیزترین راهها برای مدیریت رویدادها در بازی، مخصوصاً توی Unity، استفاده از الگوی Observer است.
به جای این که هر سیستم مستقیماً به بقیه Reference بدهد و همهچیز به هم وابسته شود، رویداد تعریف میکنیم و بقیه فقط «گوش میدهند» 🎧
مثال کلاسیک: وقتی بازیکن سکه برمیدارد:
• سیستم امتیاز باید Score را زیاد کند
• UI باید امتیاز جدید را نمایش بدهد
• یک SoundManager باید افکت صدا پخش کند
اگر PlayerController همه اینها را مستقیم صدا بزند، وابستگیهای زیادی ساخته میشود و هر تغییر کوچک، چند فایل را تحت تأثیر قرار میدهد. این ضد Clean Code است.
با Observer، Player فقط میگوید: «رویداد CoinCollected اتفاق افتاد». بقیه سیستمها خودشـان Subscribe میشوند 👇
using System;
using UnityEngine;
public class GameEvents : MonoBehaviour
{
public static GameEvents Instance;
public event Action<int> OnCoinCollected;
void Awake()
{
if (Instance == null)
Instance = this;
else
Destroy(gameObject);
}
public void CoinCollected(int amount)
{
OnCoinCollected?.Invoke(amount);
}
}
حالا Player فقط رویداد را فایر میکند و هیچ چیز دیگری را نمیشناسد:
public class PlayerCoins : MonoBehaviour
{
public void CollectCoin(int amount)
{
GameEvents.Instance.CoinCollected(amount);
}
}
سیستم امتیاز و UI فقط Subscribe میشوند:
public class ScoreSystem : MonoBehaviour
{
int score;
void OnEnable()
{
GameEvents.Instance.OnCoinCollected += HandleCoin;
}
void OnDisable()
{
GameEvents.Instance.OnCoinCollected -= HandleCoin;
}
void HandleCoin(int amount)
{
score += amount;
// Update save, analytics, etc.
}
}
چرا این معماری برای بازیها عالی است؟
• 🧩 Decoupling: Player هیچ اطلاعی از UI یا ScoreSystem ندارد؛ تست و تغییر سادهتر میشود.
• 🔌 افزودن سیستم جدید: فردا میتوان یک VFX جدید ساخت که فقط به همین رویداد Subscribe شود، بدون تغییر در Player.
• 🧹 Clean Code: تابعها یک مسئولیت مشخص دارند (نزدیک به اصل Single Responsibility).
استفاده از Observer توی پروژههای متوسط و بزرگ باعث میشود معماری بازی تمیزتر، قابلگسترشتر و قابلدیباگتر بماند.
قدمبهقدم بخشی از منطقهای به هم چسبیده را به رویدادها منتقل کنید و نتیجه را در سرعت توسعه و Refactor حس کنید 🚀
🔖 #GameDev #بازیسازی #Observer #EventSystem #Unity #CleanCode #GameArchitecture #C#
👤 Developix
💎 Channel: @DevelopixGame
🔥7👍1
🎮 کنترل حرکت نرم با deltaTime
یکی از اشتباههای رایج تو بازیهای ۲بعدی Unity اینه که سرعت حرکت یا انیمیشن رو مستقیم به frame rate گره میزنیم. روی سیستم قوی، همهچی اوکیه؛ ولی روی سیستم ضعیف، کاراکتر کند میشه یا حرکتها تیکتیک میخوره 😅
راهحل سادهست: همیشه حرکت، فیزیک ساده و انیمیشنهای محاسباتی رو به Time.deltaTime ضرب کن تا وابسته به فریم نباشن.
🔹 مثال بد (وابسته به فریم):
روی ۳۰fps کاراکتر کندتر از ۱۴۴fps حرکت میکنه، چون در هر فریم ۵ واحد میره جلو.
🔹 مثال درست (frame independent):
حالا speed بر حسب «واحد در ثانیه» تعریف شده و deltaTime تضمین میکنه در هر ثانیه تقریباً همون مقدار طی بشه، چه ۳۰fps باشه چه ۱۲۰fps ✅
📌 نکتهها:
- برای حرکتها، lerp دستی، fadeها و هر چیز «وابسته به زمان»، از Time.deltaTime استفاده کن.
- برای فیزیک Rigidbody بهتره منطق اصلی تو FixedUpdate باشه و از Time.fixedDeltaTime کمک بگیری.
- اگر بازی Pause میشه، میشه از Time.unscaledDeltaTime برای UI Animationهایی که نباید متوقف بشن استفاده کرد.
این ریزهکاری ساده کمک میکنه بازی روی دستگاههای مختلف تجربهای یکسان و حرفهای داشته باشه 🚀
منبع رسمی Unity:
Unity Time.deltaTime Docs
🔖 #GameDev #بازیسازی #Unity #deltaTime #performance #movement #2D #frame_rate
👤 Developix
💎 Channel: @DevelopixGame
یکی از اشتباههای رایج تو بازیهای ۲بعدی Unity اینه که سرعت حرکت یا انیمیشن رو مستقیم به frame rate گره میزنیم. روی سیستم قوی، همهچی اوکیه؛ ولی روی سیستم ضعیف، کاراکتر کند میشه یا حرکتها تیکتیک میخوره 😅
راهحل سادهست: همیشه حرکت، فیزیک ساده و انیمیشنهای محاسباتی رو به Time.deltaTime ضرب کن تا وابسته به فریم نباشن.
🔹 مثال بد (وابسته به فریم):
void Update()
{
transform.position += Vector3.right * 5f;
}
روی ۳۰fps کاراکتر کندتر از ۱۴۴fps حرکت میکنه، چون در هر فریم ۵ واحد میره جلو.
🔹 مثال درست (frame independent):
void Update()
{
float speed = 5f; // units per second
transform.position += Vector3.right * speed * Time.deltaTime;
}
حالا speed بر حسب «واحد در ثانیه» تعریف شده و deltaTime تضمین میکنه در هر ثانیه تقریباً همون مقدار طی بشه، چه ۳۰fps باشه چه ۱۲۰fps ✅
📌 نکتهها:
- برای حرکتها، lerp دستی، fadeها و هر چیز «وابسته به زمان»، از Time.deltaTime استفاده کن.
- برای فیزیک Rigidbody بهتره منطق اصلی تو FixedUpdate باشه و از Time.fixedDeltaTime کمک بگیری.
- اگر بازی Pause میشه، میشه از Time.unscaledDeltaTime برای UI Animationهایی که نباید متوقف بشن استفاده کرد.
این ریزهکاری ساده کمک میکنه بازی روی دستگاههای مختلف تجربهای یکسان و حرفهای داشته باشه 🚀
منبع رسمی Unity:
Unity Time.deltaTime Docs
🔖 #GameDev #بازیسازی #Unity #deltaTime #performance #movement #2D #frame_rate
👤 Developix
💎 Channel: @DevelopixGame
👍3
مدیریت State بازی بدون if-های بیانتها 🎮
یکی از جاهایی که کد خیلی سریع شلوغ میشود، مدیریت حالتهای مختلف بازی است:
🏁 منوی اصلی
🕹️ گیمپلی
⏸️ Pause
💀 Game Over
اگر این حالتها را با یک عالمه
اینجاست که State Pattern کمک میکند کد تمیزتر، قابلگسترشتر و مخصوصاً برای پروژههای بلندمدت قابلتحمل بماند 😄
ایده State Pattern در بازی
هر حالت بازی در یک کلاس جدا پیادهسازی میشود که یک اینترفیس مشترک دارد. یک کلاس GameStateMachine فقط مسئول این است که بداند الان در کدام State هستیم و چه زمانی State را عوض کند.
این کار چند مزیت مهم دارد:
• اضافهکردن حالت جدید بدون دستزدن به بقیه 4 کدها ✅
• حذف if/else عظیم ✅
• راحتتر شدن دیباگ و تست هر حالت جداگانه ✅
نمونه ساده در Unity (C#)
در یک
نکات عملی برای پروژههای بازی
• برای Stateهای زیاد (مثلاً لابی آنلاین، لودینگ، سینماتیکها)، این الگو جلوی God Class شدن
• انتقال بین Stateها را میتوان در یک کلاس مرکزی (یا ScriptableObject در Unity) تعریف کرد تا منطق گذارها هم مرتب بماند.
• در پروژههای تیمی، این معماری کمک میکند هر نفر روی یک State کار کند بدون اینکه توی کد بقیه خرابکاری شود.
منابع خوب برای مرور این ایده:
Game Programming Patterns - State
Unity Learn
کدهای مدیریت State اگر از همین ابتدا تمیز طراحی شوند، مقیاسپذیری پروژه خیلی راحتتر میشود و تغییر دیزاین بازی دیگر معادل بازنویسی نصف پروژه نخواهد بود 🚀
🔖 #GameDev #بازیسازی #State_Pattern #Game_Architecture #Unity #C# #Clean_Code #Game_States
👤 Developix
💎 Channel: @DevelopixGame
یکی از جاهایی که کد خیلی سریع شلوغ میشود، مدیریت حالتهای مختلف بازی است:
🏁 منوی اصلی
🕹️ گیمپلی
⏸️ Pause
💀 Game Over
اگر این حالتها را با یک عالمه
if/else یا switch در یک کلاس غولآسا کنترل کنیم، بهمرور هر تغییر کوچک تبدیل به کابوس میشود.اینجاست که State Pattern کمک میکند کد تمیزتر، قابلگسترشتر و مخصوصاً برای پروژههای بلندمدت قابلتحمل بماند 😄
ایده State Pattern در بازی
هر حالت بازی در یک کلاس جدا پیادهسازی میشود که یک اینترفیس مشترک دارد. یک کلاس GameStateMachine فقط مسئول این است که بداند الان در کدام State هستیم و چه زمانی State را عوض کند.
این کار چند مزیت مهم دارد:
• اضافهکردن حالت جدید بدون دستزدن به بقیه 4 کدها ✅
• حذف if/else عظیم ✅
• راحتتر شدن دیباگ و تست هر حالت جداگانه ✅
نمونه ساده در Unity (C#)
public interface IGameState
{
void Enter();
void Exit();
void Tick();
}
public class GameplayState : IGameState
{
public void Enter()
{
Debug.Log("Enter Gameplay");
Time.timeScale = 1f;
}
public void Exit()
{
Debug.Log("Exit Gameplay");
}
public void Tick()
{
// منطق گیمپلی
}
}
public class PauseState : IGameState
{
public void Enter()
{
Debug.Log("Enter Pause");
Time.timeScale = 0f;
}
public void Exit()
{
Debug.Log("Exit Pause");
Time.timeScale = 1f;
}
public void Tick()
{
// منطق منوی Pause
}
}
public class GameStateMachine
{
private IGameState _current;
public void ChangeState(IGameState next)
{
_current 3F.Exit();
_current = next;
_current.Enter();
}
public void Tick()
{
_current 3F.Tick();
}
}
در یک
MonoBehaviour میتوان یک نمونه از GameStateMachine ساخت، State اولیه را تنظیم کرد و در Update فقط Tick() را صدا زد. با این کار منطق مدیریت State از بقیه کد جدا میشود و ساختار پروژه تمیزتر میماند.نکات عملی برای پروژههای بازی
• برای Stateهای زیاد (مثلاً لابی آنلاین، لودینگ، سینماتیکها)، این الگو جلوی God Class شدن
GameManager را میگیرد.• انتقال بین Stateها را میتوان در یک کلاس مرکزی (یا ScriptableObject در Unity) تعریف کرد تا منطق گذارها هم مرتب بماند.
• در پروژههای تیمی، این معماری کمک میکند هر نفر روی یک State کار کند بدون اینکه توی کد بقیه خرابکاری شود.
منابع خوب برای مرور این ایده:
Game Programming Patterns - State
Unity Learn
کدهای مدیریت State اگر از همین ابتدا تمیز طراحی شوند، مقیاسپذیری پروژه خیلی راحتتر میشود و تغییر دیزاین بازی دیگر معادل بازنویسی نصف پروژه نخواهد بود 🚀
🔖 #GameDev #بازیسازی #State_Pattern #Game_Architecture #Unity #C# #Clean_Code #Game_States
👤 Developix
💎 Channel: @DevelopixGame
🔥5👍1
در این کد Python که شبیه یک event loop ساده برای بروزرسانی وضعیت چند entity در یک بازی است، خروجی نهایی چاپشده روی ترمینال چیست؟
به ترتیب و شکل دقیق متن خروجی (شامل فاصلهها و خطهای جدید) دقت کنید و کل خروجی را بنویسید.
🔖 #GameDev #بازیسازی
👤 Developix
💎 Channel: @DevelopixGame
به ترتیب و شکل دقیق متن خروجی (شامل فاصلهها و خطهای جدید) دقت کنید و کل خروجی را بنویسید.
# Game-like update loop with shared state
positions = {"player": [0, 0], "enemy": [5, 5]}
snapshots = []
for tick in range(3):
for name, pos in positions.items():
dx = 1 if name == "player" else -1
dy = 0 if name == "player" else -1
pos[0] += dx
pos[1] += dy
snapshots.append((tick, list(positions.values())))
for tick, state in snapshots:
print(f"tick {tick} => {state}")
🔖 #GameDev #بازیسازی
👤 Developix
💎 Channel: @DevelopixGame
👍3❤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 #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
به زبان ساده، 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 #بازیسازی
👤 ali reza
💎 Channel: @DevelopixGame
❤5
Forwarded from ابر ویراک
زیرساختی مطمئن برای کسب و کارهای آنلاین
📞 همین حالا با ما تماس بگیرید و این فرصت فوقالعاده رو از دست ندید!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
در کد زیر که برای سادهسازی یک سیستم Object Pool در بازی نوشته شده، توسعهدهنده انتظار دارد هر بار که یک دشمن غیر فعال میشود، به شکل درست به استخر برگردد و دوباره استفاده شود؛ اما بعد از چند دقیقه بازی، تعداد دشمنهای فعال بیدلیل زیاد میشود و ظاهراً Object Pool عملاً کار نمیکند.
به دقت کد را بررسی کنید: چه چیزی در منطق مدیریت استخر (Pool) اشتباه است و دقیقاً چه تغییری باید بدهید تا سیستم Object Pool همانطور که باید، از ایجاد مکرر دشمنهای جدید جلوگیری کند؟
راهنما: به محل اضافه شدن Enemy ها به لیستها و نحوه استفاده از متغیر isActive دقت کنید.
🔖 #GameDev #بازیسازی
👤 Developix
💎 Channel: @DevelopixGame
به دقت کد را بررسی کنید: چه چیزی در منطق مدیریت استخر (Pool) اشتباه است و دقیقاً چه تغییری باید بدهید تا سیستم Object Pool همانطور که باید، از ایجاد مکرر دشمنهای جدید جلوگیری کند؟
راهنما: به محل اضافه شدن Enemy ها به لیستها و نحوه استفاده از متغیر isActive دقت کنید.
🔖 #GameDev #بازیسازی
👤 Developix
💎 Channel: @DevelopixGame
🔥2
DOTween برای انیمیشنهای تمیز تو Unity 🎮
برای هر چیزی تو بازی انیمیشن مینویسی؟ از حرکت ساده UI تا شیک کردن دوربین؟ 🤯
DOTween یه tweening engine خیلی سریع برای Unityـه که کار انیمیشن رو از کدنویسی خستهکننده به چند خط تمیز تبدیل میکنه.
مزیتها:
• انیمیشن position، rotation، scale، رنگ، عدد و… فقط با یه خط
• Sequence ساختن برای زنجیره کردن چند انیمیشن پشتسرهم
• پرفورمنس بالا، مناسب موبایل و کنسول
• ادغام راحت با Timeline و Animator
نصب (Unity):
1) از Package Manager روی Add package from git URL
2) آدرس زیر رو بزن:
نمونه کد ساده:
برای UI animations (مثل popup منو، دکمهها، health bar) DOTween واقعاً زمان دیباگ و iteration رو کم میکنه.
مستندات و دانلود:
Docs & Download
GitHub
امتحانش کن و کمکم هر انیمیشن سختی رو با چند تا tween جمع کن ✨
🔖 #GameDev #بازیسازی #Unity #DOTween #GameDev #C# #Animation #Tweening
👤 Developix
💎 Channel: @DevelopixGame
برای هر چیزی تو بازی انیمیشن مینویسی؟ از حرکت ساده UI تا شیک کردن دوربین؟ 🤯
DOTween یه tweening engine خیلی سریع برای Unityـه که کار انیمیشن رو از کدنویسی خستهکننده به چند خط تمیز تبدیل میکنه.
مزیتها:
• انیمیشن position، rotation، scale، رنگ، عدد و… فقط با یه خط
• Sequence ساختن برای زنجیره کردن چند انیمیشن پشتسرهم
• پرفورمنس بالا، مناسب موبایل و کنسول
• ادغام راحت با Timeline و Animator
نصب (Unity):
1) از Package Manager روی Add package from git URL
2) آدرس زیر رو بزن:
https://github.com/Demigiant/dotween
نمونه کد ساده:
using DG.Tweening;
using UnityEngine;
public class MoveCube : MonoBehaviour
{
void Start()
{
// حرکت نرم به مختصات جدید در 1.5 ثانیه
transform.DOMove(new Vector3(0, 3, 0), 1.5f)
.SetEase(Ease.OutBack)
.SetLoops(2, LoopType.Yoyo);
}
}
برای UI animations (مثل popup منو، دکمهها، health bar) DOTween واقعاً زمان دیباگ و iteration رو کم میکنه.
مستندات و دانلود:
Docs & Download
GitHub
امتحانش کن و کمکم هر انیمیشن سختی رو با چند تا tween جمع کن ✨
🔖 #GameDev #بازیسازی #Unity #DOTween #GameDev #C# #Animation #Tweening
👤 Developix
💎 Channel: @DevelopixGame
❤2🔥1
Photon Fusion؛ Multiplayer پایدار برای بازیهای Unity 🎮
اگر برای بازیهات تو Unity به دنبال netcode راحت، پایدار و scalable هستی، Photon Fusion از بهترین گزینههاست. کلی از بازیهای commercial الان روی Photon میچرخن، بدون اینکه خودت مستقیم درگیر low-level socket و replication بشی.
چرا Fusion؟
• مدلهای مختلف: Host, Server, Shared, Prediction
• Snapshot & State Sync آماده برای بازیهای سریع (Shooter, Racing و ...)
• Built-in Lag Compensation و Hit Detection دقیق
• Integration خوب با Unity و Inspector -محور
نمونه کد ساده برای Spawn بازیکن ⬇️
لینکها 🔗
Docs رسمی Photon Fusion
Sampleهای GitHub
امتحانش کن روی یک Prototype کوچک، latency و sync رو بسنج و کمکم netcode بازی اصلیات رو روی Fusion ببری جلو. 🚀
🔖 #GameDev #بازیسازی #Unity #Multiplayer #Networking #Photon #GameDev #C#
👤 Developix
💎 Channel: @DevelopixGame
اگر برای بازیهات تو Unity به دنبال netcode راحت، پایدار و scalable هستی، Photon Fusion از بهترین گزینههاست. کلی از بازیهای commercial الان روی Photon میچرخن، بدون اینکه خودت مستقیم درگیر low-level socket و replication بشی.
چرا Fusion؟
• مدلهای مختلف: Host, Server, Shared, Prediction
• Snapshot & State Sync آماده برای بازیهای سریع (Shooter, Racing و ...)
• Built-in Lag Compensation و Hit Detection دقیق
• Integration خوب با Unity و Inspector -محور
نمونه کد ساده برای Spawn بازیکن ⬇️
using Fusion;
using UnityEngine;
public class GameManager : NetworkBehaviour {
[SerializeField] NetworkPrefabRef playerPrefab;
public override void Spawned() {
if (Object.HasStateAuthority) {
Runner.Spawn(playerPrefab,
Vector3.zero,
Quaternion.identity,
Object.InputAuthority);
}
}
}
لینکها 🔗
Docs رسمی Photon Fusion
Sampleهای GitHub
امتحانش کن روی یک Prototype کوچک، latency و sync رو بسنج و کمکم netcode بازی اصلیات رو روی Fusion ببری جلو. 🚀
🔖 #GameDev #بازیسازی #Unity #Multiplayer #Networking #Photon #GameDev #C#
👤 Developix
💎 Channel: @DevelopixGame
👍2
در بازیسازی، مخصوصاً وقتی با فیزیک و حرکت سروکار داری، تکیه روی deltaTime ناپایدار (مثل Time.deltaTime در Unity) برای همهچیز، میتونه باعث بشه روی بعضی سیستمها حرکتها نرم باشن و روی بعضی دیگه لرزش و تفاوت رفتاری دیده بشه.
یک ترفند عملی اینه که فیزیک رو در یک Fixed Update Loop با گام زمانی ثابت نگه داری و فقط رندر و انیمیشن رو با فریمریت متغیر آپدیت کنی. اینطوری هم بازی نرمتر به نظر میرسه، هم فیزیک قابلتکرار و پایدار میمونه. 🚀
ایده سادهست:
• یک حلقهٔ Game Loop داری که هر فریم اجرا میشه.
• یک متغیر زمان انباشته نگه میداری.
• هر بار که این زمان از fixedDelta گذشت، چندین بار UpdatePhysics رو اجرا میکنی تا عقبافتادگی جبران بشه.
نمونهٔ سادهٔ پیادهسازی (الگوی کلی، مستقل از موتور):
در Unity همین مفهوم از قبل پیادهسازی شده: هر چیزی که به فیزیک وابستهست (نیرو، حرکت Rigidbody و …) بهتره داخل FixedUpdate انجام بشه و برای Input / انیمیشن / UI از Update استفاده بشه. این جداسازی روی دستگاههای ضعیفتر تفاوت خیلی محسوسی در ثبات حرکت ایجاد میکنه. 🎮
برای جزئیات بیشتر دربارهٔ FixedUpdate و Time سیستم در Unity:
https://docs.unity3d.com/Manual/FixedUpdateOrder.html
امتحان این الگو روی پروژههات، مخصوصاً در بازیهای سرعتی یا فیزیکمحور، معمولاً لرزشها و رفتارهای عجیب رو تا حد خوبی جمع میکنه و دیباگ فیزیک رو هم سادهتر میکنه.
🔖 #GameDev #بازیسازی #GameLoop #deltaTime #Physics #Unity #Performance
👤 Developix
💎 Channel: @DevelopixGame
یک ترفند عملی اینه که فیزیک رو در یک Fixed Update Loop با گام زمانی ثابت نگه داری و فقط رندر و انیمیشن رو با فریمریت متغیر آپدیت کنی. اینطوری هم بازی نرمتر به نظر میرسه، هم فیزیک قابلتکرار و پایدار میمونه. 🚀
ایده سادهست:
• یک حلقهٔ Game Loop داری که هر فریم اجرا میشه.
• یک متغیر زمان انباشته نگه میداری.
• هر بار که این زمان از fixedDelta گذشت، چندین بار UpdatePhysics رو اجرا میکنی تا عقبافتادگی جبران بشه.
نمونهٔ سادهٔ پیادهسازی (الگوی کلی، مستقل از موتور):
float accumulator = 0.0f;
const float fixedDelta = 0.02f; // 50Hz
void GameLoop()
{
while (gameRunning)
{
float dt = GetFrameTime(); // بر حسب ثانیه
accumulator += dt;
// بهروزرسانی فیزیک با گام ثابت
while (accumulator >= fixedDelta)
{
UpdatePhysics(fixedDelta);
accumulator -= fixedDelta;
}
// رندر با استفاده از وضعیت فعلی
Render();
}
}
در Unity همین مفهوم از قبل پیادهسازی شده: هر چیزی که به فیزیک وابستهست (نیرو، حرکت Rigidbody و …) بهتره داخل FixedUpdate انجام بشه و برای Input / انیمیشن / UI از Update استفاده بشه. این جداسازی روی دستگاههای ضعیفتر تفاوت خیلی محسوسی در ثبات حرکت ایجاد میکنه. 🎮
برای جزئیات بیشتر دربارهٔ FixedUpdate و Time سیستم در Unity:
https://docs.unity3d.com/Manual/FixedUpdateOrder.html
امتحان این الگو روی پروژههات، مخصوصاً در بازیهای سرعتی یا فیزیکمحور، معمولاً لرزشها و رفتارهای عجیب رو تا حد خوبی جمع میکنه و دیباگ فیزیک رو هم سادهتر میکنه.
🔖 #GameDev #بازیسازی #GameLoop #deltaTime #Physics #Unity #Performance
👤 Developix
💎 Channel: @DevelopixGame
❤6🔥1
Forwarded from کانال رسمی تک نت | Taknet
سرور اختصاصی تکنت؛ تحویل فوری، بدون قطعی ✅
🔹 پورت اختصاصی واقعی
🔹 آپلود رایگان
🔹 آپتایم 99.99% تضمینی
🔹 ارائه IP مازاد
🔹 پشتیبانی 24/7 (تیکت + آنلاین)
🔹 نصب سریع
🔹 پرداخت ماهیانه
⏳ ظرفیت محدود — همین الان تماس بگیر و سرویس رو رزرو کن:
📞 02191555530
🔗 https://taknet.ir/services/dedicated-server
🔹 پورت اختصاصی واقعی
🔹 آپلود رایگان
🔹 آپتایم 99.99% تضمینی
🔹 ارائه IP مازاد
🔹 پشتیبانی 24/7 (تیکت + آنلاین)
🔹 نصب سریع
🔹 پرداخت ماهیانه
⏳ ظرفیت محدود — همین الان تماس بگیر و سرویس رو رزرو کن:
📞 02191555530
🔗 https://taknet.ir/services/dedicated-server
Godot برای بازیسازها یه کتابخونه/انجین اوپنسورسه که مخصوصاً برای 2D فوقالعادهست و یادگیریش سریع پیش میره. یکی از چیزهای دوستداشتنیش سیستم InputMap ـه که مدیریت کنترلها رو خیلی تمیز میکنه 🎮
بهجای اینکه هرجا مستقیم روی key code کار کنی، یه «اکشن» تعریف میکنی (مثلاً move_right) و بعد هر کلیدی رو میتونی بهش مپ کنی. این یعنی:
• تنظیم راحت کنترل روی PC و موبایل
• قابلخواندنتر شدن کد
• تغییر دادن کنترلها بدون دستزدن به منطق گیمپلی
نمونه کد GDScript برای حرکت ساده پلیر:
اکشنها رو توی Project > Project Settings > Input Map تعریف کن، بعد توی هر اسکریپتی مثل بالا مصرفشون کن ✅
مستندات رسمی Godot:
docs.godotengine.org
سورس و Issuesها:
github.com/godotengine/godot
چند دقیقه با InputMap بازی کن؛ معمولاً بعدش دیگه برنمیگردی به چککردن مستقیم key code ها 😉
🔖 #GameDev #بازیسازی #Godot #GDScript #Input #GameDev #2D
👤 Developix
💎 Channel: @DevelopixGame
بهجای اینکه هرجا مستقیم روی key code کار کنی، یه «اکشن» تعریف میکنی (مثلاً move_right) و بعد هر کلیدی رو میتونی بهش مپ کنی. این یعنی:
• تنظیم راحت کنترل روی PC و موبایل
• قابلخواندنتر شدن کد
• تغییر دادن کنترلها بدون دستزدن به منطق گیمپلی
نمونه کد GDScript برای حرکت ساده پلیر:
extends CharacterBody2D
const SPEED = 200.0
func _physics_process(delta):
var dir = Vector2.ZERO
if Input.is_action_pressed("move_right"):
dir.x += 1
if Input.is_action_pressed("move_left"):
dir.x -= 1
velocity = dir.normalized() * SPEED
move_and_slide()
اکشنها رو توی Project > Project Settings > Input Map تعریف کن، بعد توی هر اسکریپتی مثل بالا مصرفشون کن ✅
مستندات رسمی Godot:
docs.godotengine.org
سورس و Issuesها:
github.com/godotengine/godot
چند دقیقه با InputMap بازی کن؛ معمولاً بعدش دیگه برنمیگردی به چککردن مستقیم key code ها 😉
🔖 #GameDev #بازیسازی #Godot #GDScript #Input #GameDev #2D
👤 Developix
💎 Channel: @DevelopixGame
👍4
در بازیهای سریع، تکیهکردن به
ایده اینه که نذاریم یک فریم خیلی بزرگ، ناگهان آبجکت رو تلپورت کنه 🚀
در Unity نمونه ساده:
👾 نتیجه:
- انیمیشن و حرکتها پایدارتر میشن.
- روی دستگاههای ضعیف، افت FPS باعث پرش شدید (stutter/teleport) نمیشه.
بهتره این کار فقط برای سیستمهایی انجام بشه که به دقت بالا نیاز دارن (مثل حرکت یا physics دستساز)، نه برای همهچیز.
مرجع رسمی Unity در مورد
docs.unity3d.com/ScriptReference/Time-deltaTime.html
امتحان این الگو روی حرکت کاراکتر یا دوربین، معمولاً خیلی سریع تفاوت روان بودن بازی رو نشون میده ✨
🔖 #GameDev #بازیسازی #Unity #deltaTime #Performance #Game_Loop #Movement
👤 Developix
💎 Channel: @DevelopixGame
deltaTime خام میتونه اختلاف سرعت روی دستگاههای مختلف ایجاد کنه؛ مخصوصاً وقتی FPS خیلی میافتد یا روی بعضی دستگاهها خیلی بالاست. برای حرکتهای حساس (مثل گلوله، ضربهٔ شمشیر، یا حرکت دوربین) بهتره deltaTime رو clamp کنیم.ایده اینه که نذاریم یک فریم خیلی بزرگ، ناگهان آبجکت رو تلپورت کنه 🚀
در Unity نمونه ساده:
void Update()
{
float dt = Time.deltaTime;
dt = Mathf.Clamp(dt, 0f, 0.03f); // حداکثر ~۳۳ FPS
// مثال حرکت ساده
transform.position += Vector3.forward * speed * dt;
}
👾 نتیجه:
- انیمیشن و حرکتها پایدارتر میشن.
- روی دستگاههای ضعیف، افت FPS باعث پرش شدید (stutter/teleport) نمیشه.
بهتره این کار فقط برای سیستمهایی انجام بشه که به دقت بالا نیاز دارن (مثل حرکت یا physics دستساز)، نه برای همهچیز.
مرجع رسمی Unity در مورد
Time.deltaTime:docs.unity3d.com/ScriptReference/Time-deltaTime.html
امتحان این الگو روی حرکت کاراکتر یا دوربین، معمولاً خیلی سریع تفاوت روان بودن بازی رو نشون میده ✨
🔖 #GameDev #بازیسازی #Unity #deltaTime #Performance #Game_Loop #Movement
👤 Developix
💎 Channel: @DevelopixGame
👍1
در بازیهای موبایل و حتی PC، یکی از قاتلهای فریمریت، تعداد زیاد Draw Call هست. خوشبختانه در Unity برای آبجکتهای ثابت صحنه، راهحل سادهای وجود داره: Static Batching 🧱
وقتی یک سری Mesh که حرکت نمیکنن رو Static میکنی، Unity میتونه اونها رو توی چند Mesh بزرگتر ترکیب کنه و بهجای دهها Draw Call، فقط چند تا بفرسته سمت GPU. نتیجه: CPU سبکتر، فریمریت پایدارتر ✅
نمونه استفاده (C#):
نکتهها 📝
• برای دیوار، ساختمان، سنگ، درختهای ثابت و… عالیه.
• برای آبجکتی که قرارِ حرکت کنه، از Static Batching استفاده نکن؛ باعث هزینه اضافی و باگهای عجیب میشه.
موقع پروفایل گرفتن، قبل و بعد از فعالکردن Static Batching، تعداد Draw Call رو توی Stats یا Profiler چک کن و تفاوتش رو ببین.
مرجع رسمی: Unity Manual – Draw Call Batching
امتحانش روی یک صحنه شلوغ باعث میشه تاثیرش رو خیلی سریع حس بشه 🚀
🔖 #GameDev #بازیسازی #Unity #Performance #DrawCall #StaticBatching #GameDev #Optimization
👤 Developix
💎 Channel: @DevelopixGame
وقتی یک سری Mesh که حرکت نمیکنن رو Static میکنی، Unity میتونه اونها رو توی چند Mesh بزرگتر ترکیب کنه و بهجای دهها Draw Call، فقط چند تا بفرسته سمت GPU. نتیجه: CPU سبکتر، فریمریت پایدارتر ✅
نمونه استفاده (C#):
using UnityEngine;
public class MarkStatic : MonoBehaviour
{
public GameObject[] staticObjects;
void Start()
{
foreach (var go in staticObjects)
{
// فقط برای آبجکتهایی که حرکت، مقیاس یا چرخش ندارن
go.isStatic = true;
}
}
}
نکتهها 📝
• برای دیوار، ساختمان، سنگ، درختهای ثابت و… عالیه.
• برای آبجکتی که قرارِ حرکت کنه، از Static Batching استفاده نکن؛ باعث هزینه اضافی و باگهای عجیب میشه.
موقع پروفایل گرفتن، قبل و بعد از فعالکردن Static Batching، تعداد Draw Call رو توی Stats یا Profiler چک کن و تفاوتش رو ببین.
مرجع رسمی: Unity Manual – Draw Call Batching
امتحانش روی یک صحنه شلوغ باعث میشه تاثیرش رو خیلی سریع حس بشه 🚀
🔖 #GameDev #بازیسازی #Unity #Performance #DrawCall #StaticBatching #GameDev #Optimization
👤 Developix
💎 Channel: @DevelopixGame
👍2❤1
در کد زیر برای پیادهسازی زمانبندی شلیک در یک بازی دوبعدی، از delta time بهصورت نادرست استفاده شده است و ممکن است نرخ شلیک روی سیستمهای مختلف (fpsهای متفاوت) ناسازگار شود:
در این کد چه چیزی باید اصلاح شود تا زمانبندی شلیک روی fpsهای مختلف یکسان و قابلاعتماد باشد؟
🔖 #GameDev #بازیسازی
👤 Developix
💎 Channel: @DevelopixGame
import pygame
class Player:
def __init__(self):
self.fire_rate = 0.5 # ثانیه بین هر شلیک
self.time_since_last_shot = 0
def update(self, dt):
self.time_since_last_shot += 1 # استفاده اشتباه از dt
def can_shoot(self):
return self.time_since_last_shot >= self.fire_rate
def shoot(self):
if self.can_shoot():
print("Shoot!")
self.time_since_last_shot = 0
clock = pygame.time.Clock()
player = Player()
running = True
while running:
dt = clock.tick(120) / 1000.0 # dt بر حسب ثانیه
player.update(dt)
player.shoot()
در این کد چه چیزی باید اصلاح شود تا زمانبندی شلیک روی fpsهای مختلف یکسان و قابلاعتماد باشد؟
🔖 #GameDev #بازیسازی
👤 Developix
💎 Channel: @DevelopixGame
🎯 کنترل دقیق برخوردها در Unity با LayerMask
خیلی وقتها افت فریم بازی از تعداد بالای collision check میآد، نه از گرافیک. مخصوصاً وقتی برای هر چیز کوچیکی از
یک ترفند ساده ولی خیلی تاثیرگذار اینه که برخوردها رو با Layerها و LayerMask محدود کنی تا فیزیک فقط روی چیزهای مهم حساب کنه 🚀
مثلاً برای تیر اسلحه فقط دشمنها رو چک کن، نه کل صحنه:
📌 نکتهها:
- برای هر system (مثل تیر، AI، interactableها) یک یا چند Layer مشخص کن.
- در منوی Project Settings → Physics، ماتریس برخورد (Layer Collision Matrix) رو تنظیم کن تا بعضی Layerها کلاً با هم برخورد نداشته باشن.
این کار هم CPU رو سبکتر میکنه، هم دیباگ برخوردها رو خیلی تمیزتر و قابلفهمتر نگه میداره 😌
ℹ️ مرجع رسمی:
Unity LayerMask Documentation
🔖 #GameDev #بازیسازی #Unity #Physics #Collision #LayerMask #Performance #GameDev
👤 Developix
💎 Channel: @DevelopixGame
خیلی وقتها افت فریم بازی از تعداد بالای collision check میآد، نه از گرافیک. مخصوصاً وقتی برای هر چیز کوچیکی از
Physics.Raycast یا Overlapها استفاده میشه.یک ترفند ساده ولی خیلی تاثیرگذار اینه که برخوردها رو با Layerها و LayerMask محدود کنی تا فیزیک فقط روی چیزهای مهم حساب کنه 🚀
مثلاً برای تیر اسلحه فقط دشمنها رو چک کن، نه کل صحنه:
public LayerMask enemyLayer;
void Shoot()
{
Ray ray = new Ray(transform.position, transform.forward);
if (Physics.Raycast(ray, out var hit, 100f, enemyLayer))
{
// فقط اگر به enemy خورد
// Damage logic...
}
}
📌 نکتهها:
- برای هر system (مثل تیر، AI، interactableها) یک یا چند Layer مشخص کن.
- در منوی Project Settings → Physics، ماتریس برخورد (Layer Collision Matrix) رو تنظیم کن تا بعضی Layerها کلاً با هم برخورد نداشته باشن.
این کار هم CPU رو سبکتر میکنه، هم دیباگ برخوردها رو خیلی تمیزتر و قابلفهمتر نگه میداره 😌
ℹ️ مرجع رسمی:
Unity LayerMask Documentation
🔖 #GameDev #بازیسازی #Unity #Physics #Collision #LayerMask #Performance #GameDev
👤 Developix
💎 Channel: @DevelopixGame
👍1🔥1
Forwarded from Developix Support
This media is not supported in your browser
VIEW IN TELEGRAM
🏆آفرهای جام جهانی ۲۰۲۶ هاستایران فعال شد!
با کمپین «ترکیب برنده سایتت»، زیرساخت سایتت رو برای روزهای پرترافیک آماده کن:
🔥 ۲۵٪ تخفیف روی پلنهای ۳ ماهه هاست اشتراکی ایران
⚡ ۵۰٪ تخفیف روی پلنهای یکماهه سرویس ابری در دیتاسنترهای تهران، مشهد و اهواز
🧠 مشاوره رایگان زیرساخت توسط کارشناسان هاستایران
فرصت استفاده از تخفیفها و ثبت فرم مشاوره محدود است.
📌 برای کپی کدهای تخفیف و ثبتنام در فرم مشاوره، روی لینک زیر کلیک کنید:
📌صفحه فرم مشاوره
📌تلگرام هاستایران
📌بله هاستایران
#هاست_ایران #سرور_ابری_هاست_ایران #هاست_اشتراکی #دیتاسنتر #مشاوره_زیرساخت #جام_جهانی2026
با کمپین «ترکیب برنده سایتت»، زیرساخت سایتت رو برای روزهای پرترافیک آماده کن:
🔥 ۲۵٪ تخفیف روی پلنهای ۳ ماهه هاست اشتراکی ایران
⚡ ۵۰٪ تخفیف روی پلنهای یکماهه سرویس ابری در دیتاسنترهای تهران، مشهد و اهواز
🧠 مشاوره رایگان زیرساخت توسط کارشناسان هاستایران
فرصت استفاده از تخفیفها و ثبت فرم مشاوره محدود است.
📌 برای کپی کدهای تخفیف و ثبتنام در فرم مشاوره، روی لینک زیر کلیک کنید:
📌صفحه فرم مشاوره
📌تلگرام هاستایران
📌بله هاستایران
#هاست_ایران #سرور_ابری_هاست_ایران #هاست_اشتراکی #دیتاسنتر #مشاوره_زیرساخت #جام_جهانی2026
💠 نسخه جدید انجین یونیتی (Unity) منتشر شده است
🔸 ارتقا از نسخه 6000.3.18f1 به 6000.0.78f1
🔹 لیست تغییرات این نسخه:
🔖 #unity, #game, #release
💎 @DevelopixGame
🔸 ارتقا از نسخه 6000.3.18f1 به 6000.0.78f1
🔹 لیست تغییرات این نسخه:
🔖 #unity, #game, #release
💎 @DevelopixGame
👍2
💠 نسخه جدید انجین یونیتی (Unity) منتشر شده است
🔸 ارتقا از نسخه 6000.0.78f1 به 6000.3.19f1
🔹 لیست تغییرات این نسخه:
🔖 #unity, #game, #release
💎 @DevelopixGame
🔸 ارتقا از نسخه 6000.0.78f1 به 6000.3.19f1
🔹 لیست تغییرات این نسخه:
🔖 #unity, #game, #release
💎 @DevelopixGame
👍2
در Godot اگر برای AI دنبال کردن پلیر و حرکت روی زمینهای پیچیده میخواهی، کلاس NavigationAgent3D توی Godot 4 خیلی کمک میکند 🚀
این سیستم روی NavigationServer3D سوار است و مشکل pathfinding روی meshهای پیچیده، رمپ، پله و… را حل میکند، بدون اینکه خودت الگوریتم A* پیادهسازی کنی.
چند نکته جذاب:
• استفاده از navmesh اتوماتیک یا دستی
• جلوگیری از گیر کردن AI به دیوارها و لبهها
• پشتیبانی از avoidance ساده برای برخورد نکردن Agentها به هم
• کارکرد مستقیم در Inspector، بدون boilerplate زیاد
نمونهکد ساده برای دنبالکردن پلیر:
مستندات رسمی Godot 4 در مورد Navigation و NavigationAgent3D:
Navigation Docs
امتحانش کن روی یک صحنه ساده دشمن/پلیر؛ خیلی سریع یک AI قابل قبول برای پروتوتایپ میگیری 😎
🔖 #GameDev #بازیسازی #Godot #Navigation #AI #GameDev #Pathfinding #Godot4 #NavigationAgent3D
👤 Developix
💎 Channel: @DevelopixGame
این سیستم روی NavigationServer3D سوار است و مشکل pathfinding روی meshهای پیچیده، رمپ، پله و… را حل میکند، بدون اینکه خودت الگوریتم A* پیادهسازی کنی.
چند نکته جذاب:
• استفاده از navmesh اتوماتیک یا دستی
• جلوگیری از گیر کردن AI به دیوارها و لبهها
• پشتیبانی از avoidance ساده برای برخورد نکردن Agentها به هم
• کارکرد مستقیم در Inspector، بدون boilerplate زیاد
نمونهکد ساده برای دنبالکردن پلیر:
extends CharacterBody3D
@onready var agent = $NavigationAgent3D
@onready var player = $"../Player"
func _physics_process(delta: float) -> void:
agent.target_position = player.global_transform.origin
var next_point = agent.get_next_path_position()
var dir = (next_point - global_transform.origin).normalized()
velocity = dir * 4.0
move_and_slide()
مستندات رسمی Godot 4 در مورد Navigation و NavigationAgent3D:
Navigation Docs
امتحانش کن روی یک صحنه ساده دشمن/پلیر؛ خیلی سریع یک AI قابل قبول برای پروتوتایپ میگیری 😎
🔖 #GameDev #بازیسازی #Godot #Navigation #AI #GameDev #Pathfinding #Godot4 #NavigationAgent3D
👤 Developix
💎 Channel: @DevelopixGame
❤3👍2