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

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

گروه: @StartUnityGP

🫂 @AmirHDeveloper @HaminGames
Download Telegram
متدهای کلاس Physics در Unity برای انجام عملیات فیزیکی مختلف استفاده می‌شوند. این متدها به شما اجازه می‌دهند که اشیاء را در جهان سه‌بعدی بازی جستجو کرده، برخوردها را مدیریت کرده و شبیه‌سازی‌های فیزیکی را انجام دهید. در اینجا برخی از مهمترین متدهای کلاس Physics به همراه توضیحات و مثال‌های کاربردی آورده شده‌اند:

### 1. Raycast

پرتاب یک پرتو از یک نقطه مشخص در یک جهت خاص و بررسی برخورد آن با اشیاء.

void Update()
{
Ray ray = new Ray(transform.position, transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))
{
Debug.Log("Hit: " + hit.collider.name);
}
}


### 2. RaycastAll

پرتاب یک پرتو و بازگرداندن تمام برخوردهایی که با اشیاء داشته است.

void Update()
{
Ray ray = new Ray(transform.position, transform.forward);
RaycastHit[] hits = Physics.RaycastAll(ray, 100);
foreach (RaycastHit hit in hits)
{
Debug.Log("Hit: " + hit.collider.name);
}
}


### 3. SphereCast

پرتاب یک کره از یک نقطه مشخص در یک جهت خاص و بررسی برخورد آن با اشیاء.

void Update()
{
Ray ray = new Ray(transform.position, transform.forward);
RaycastHit hit;
if (Physics.SphereCast(ray, 1.0f, out hit, 100))
{
Debug.Log("Hit: " + hit.collider.name);
}
}


### 4. OverlapSphere

بازگرداندن تمام اشیایی که در داخل یک کره با شعاع مشخص قرار دارند.

void Update()
{
Collider[] hitColliders = Physics.OverlapSphere(transform.position, 5.0f);
foreach (Collider hitCollider in hitColliders)
{
Debug.Log("Overlap: " + hitCollider.name);
}
}


### 5. Linecast

بررسی اینکه آیا یک خط مستقیم بین دو نقطه با اشیاء برخورد دارد یا نه.

void Update()
{
if (Physics.Linecast(transform.position, target.position))
{
Debug.Log("Linecast hit something!");
}
}


### 6. CapsuleCast

پرتاب یک کپسول از یک نقطه مشخص در یک جهت خاص و بررسی برخورد آن با اشیاء.

void Update()
{
Ray ray = new Ray(transform.position, transform.forward);
RaycastHit hit;
if (Physics.CapsuleCast(transform.position, transform.position + Vector3.up, 1.0f, transform.forward, out hit, 100))
{
Debug.Log("Hit: " + hit.collider.name);
}
}


### 7. CheckSphere

بررسی اینکه آیا یک کره با شعاع مشخص با اشیاء برخورد دارد یا نه.

void Update()
{
if (Physics.CheckSphere(transform.position, 5.0f))
{
Debug.Log("CheckSphere hit something!");
}
}


### 8. CheckCapsule

بررسی اینکه آیا یک کپسول با ابعاد مشخص با اشیاء برخورد دارد یا نه.

void Update()
{
if (Physics.CheckCapsule(transform.position, transform.position + Vector3.up, 1.0f))
{
Debug.Log("CheckCapsule hit something!");
}
}


### 9. CheckBox

بررسی اینکه آیا یک جعبه با ابعاد مشخص با اشیاء برخورد دارد یا نه.

void Update()
{
if (Physics.CheckBox(transform.position, new Vector3(1, 1, 1)))
{
Debug.Log("CheckBox hit something!");
}
}


### 10. OverlapBox

بازگرداندن تمام اشیایی که در داخل یک جعبه با ابعاد مشخص قرار دارند.

void Update()
{
Collider[] hitColliders = Physics.OverlapBox(transform.position, new Vector3(1, 1, 1));
foreach (Collider hitCollider in hitColliders)
{
Debug.Log("OverlapBox: " + hitCollider.name);
}
}


### 11. OverlapCapsule

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

void Update()
{
Collider[] hitColliders = Physics.OverlapCapsule(transform.position, transform.position + Vector3.up, 1.0f);
foreach (Collider hitCollider in hitColliders)
{
Debug.Log("OverlapCapsule: " + hitCollider.name);
}
}


### 12. IgnoreCollision

نادیده گرفتن برخورد بین دو کلایدر.

void Start()
{
Collider collider1 = GetComponent<Collider>();
Collider collider2 = target.GetComponent<Collider>();
Physics.IgnoreCollision(collider1, collider2);
}


### 13. IgnoreLayerCollision

نادیده گرفتن برخورد بین دو لایه.

void Start()
{
Physics.IgnoreLayerCollision(8, 9); // نادیده گرفتن برخورد بین لایه‌های 8 و 9
}


#یونیتی #برنامه_نویسی
5👍3🔥3
یونیتی ایونت‌ها (UnityEvents) در یونیتی

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

### ایجاد و استفاده از یونیتی ایونت

#### ۱. ایجاد یونیتی ایونت
برای استفاده از یونیتی ایونت، ابتدا باید آن را در یک اسکریپت تعریف کنید.

using UnityEngine;
using UnityEngine.Events;

public class MyEventClass : MonoBehaviour
{
// تعریف یک یونیتی ایونت
public UnityEvent myEvent;

private void Start()
{
if (myEvent == null)
myEvent = new UnityEvent();

// اضافه کردن یک لیسنر به یونیتی ایونت
myEvent.AddListener(Ping);
}

private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// فراخوانی یونیتی ایونت
myEvent.Invoke();
}
}

void Ping()
{
Debug.Log("Ping was called!");
}
}


در این مثال، یک یونیتی ایونت به نام myEvent تعریف شده است. سپس در متد Start`، یک لیسنر به این رویداد اضافه می‌شود که در هنگام فراخوانی رویداد، متد `Ping را اجرا می‌کند. در متد Update`، اگر کلید Space فشرده شود، رویداد `myEvent فراخوانی می‌شود و در نتیجه Ping اجرا می‌شود.

#### ۲. استفاده از یونیتی ایونت با پارامتر

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

using UnityEngine;
using UnityEngine.Events;

[System.Serializable]
public class MyFloatEvent : UnityEvent<float> { }

public class MyEventClass : MonoBehaviour
{
public MyFloatEvent myFloatEvent;

private void Start()
{
if (myFloatEvent == null)
myFloatEvent = new MyFloatEvent();

myFloatEvent.AddListener(Ping);
}

private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
myFloatEvent.Invoke(3.14f);
}
}

void Ping(float value)
{
Debug.Log("Ping was called with value: " + value);
}
}


در این مثال، یک یونیتی ایونت با پارامتر float به نام myFloatEvent تعریف شده است. سپس یک لیسنر به این رویداد اضافه می‌شود که هنگام فراخوانی رویداد، متد Ping را با یک مقدار float اجرا می‌کند.

#### ۳. تنظیم یونیتی ایونت در اینسپکتور

برای تنظیم یونیتی ایونت در اینسپکتور، باید ابتدا مطمئن شوید که کلاس حاوی یونیتی ایونت با [System.Serializable] تزئین شده است.

using UnityEngine;
using UnityEngine.Events;

public class MyEventClass : MonoBehaviour
{
[System.Serializable]
public class MyCustomEvent : UnityEvent<string> { }

public MyCustomEvent myCustomEvent;

private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
myCustomEvent.Invoke("Hello, World!");
}
}
}


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

### نتیجه‌گیری

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

#یونیتی #برنامه_نویسی
15🔥3👌1
دوستان عزیز 🌟

من مدت زیادی هست که با عشق و علاقه در کانال Start Unity فعالیت می‌کنم و آموزش‌های متنی و کدهای یونیتی رو با شما به اشتراک می‌گذارم. از حمایت‌های شما بسیار ممنونم.

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

همچنین می‌خواهم از دوست عزیزم که کانال رو بوست کرد، تشکر ویژه کنم. حمایت تو برای من بسیار ارزشمنده ❤️

به عنوان تشکر از حمایت‌های شما، در آینده قصد دارم آموزش‌های ویدیویی یونیتی هم بسازم و در کانال قرار بدم.

از همراهی و حمایت‌های شما بسیار سپاسگزارم. با هم می‌تونیم این کانال رو به یکی از بهترین منابع آموزشی یونیتی تبدیل کنیم 🚀
3417👍3❤‍🔥11
شروع آموزش‌های ویرایشگرهای سفارشی در یونیتی

درود به همه! 🌟

در این سری آموزش‌ها، قصد داریم به بررسی و یادگیری ویرایشگرهای سفارشی (Custom Editors) در یونیتی بپردازیم. ویرایشگرهای سفارشی ابزارهای قدرتمند و کاربردی هستند که می‌توانند به شما کمک کنند تا محیط ویرایشگر یونیتی را متناسب با نیازهای خاص پروژه‌های خود تغییر دهید و تجربه بهتری از کار با آن داشته باشید.

کاربرد و مزایای ویرایشگرهای سفارشی


ویرایشگرهای سفارشی به شما این امکان را می‌دهند که:

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

2. بهبود تجربه کاربری: با فراهم کردن رابط کاربری بهتر و ساده‌تر، می‌توانید به راحتی کار با ابزارها و تنظیمات پیچیده‌تر را برای خود و تیم‌تان ساده‌تر کنید. این به ویژه برای پروژه‌های بزرگ و پیچیده که شامل تنظیمات زیادی هستند، بسیار مفید است.

3. افزایش بهره‌وری: ویرایشگرهای سفارشی می‌توانند به شما کمک کنند تا فرآیندهای تکراری و زمان‌بر را به سرعت و به صورت مؤثرتر انجام دهید. به عنوان مثال، می‌توانید با اضافه کردن دکمه‌های خاصی، تغییرات زیادی را به صورت یکجا اعمال کنید.

4. پروژه‌های حرفه‌ای‌تر: با تسلط بر ویرایشگرهای سفارشی، می‌توانید پروژه‌های حرفه‌ای‌تری را ایجاد کنید که به صورت بهینه و منظم‌تری با ویژگی‌های مورد نظر شما سازگار هستند.

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

امیدوارم این آموزش‌ها برای شما مفید و کاربردی باشند و بتوانید از این تکنیک‌ها در پروژه‌های خود بهره‌برداری کنید! 🎮

---
💬 اگر سوالی دارید یا نیاز به راهنمایی بیشتر است، حتما در نظرات با ما در میان بگذارید.
🔔 برای دریافت آموزش‌های بیشتر، کانال ما را دنبال کنید.

#یونیتی #ویرایشگر_سفارشی #برنامه_نویسی
🔥7👍22
آموزش ایجاد Custom Editor در یونیتی

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

مرحله 1: ایجاد اسکریپت PlayerStats

ابتدا باید یک اسکریپت ساده ایجاد کنیم که شامل چندین متغیر برای وضعیت‌های مختلف بازیکن باشد. به این اسکریپت PlayerStats می‌گوییم:

using UnityEngine;

public class PlayerStats : MonoBehaviour
{
public int health = 100;
public int mana = 50;
public int stamina = 75;
}


این اسکریپت سه متغیر health`، `mana و stamina را تعریف می‌کند که می‌خواهیم آنها را در ویرایشگر سفارشی نمایش دهیم.

مرحله 2: ایجاد اسکریپت PlayerStatsEditor

حالا وقت آن است که ویرایشگر سفارشی خود را ایجاد کنیم. برای این کار، یک اسکریپت جدید به نام PlayerStatsEditor ایجاد کرده و کد زیر را به آن اضافه کنید:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(PlayerStats))]
public class PlayerStatsEditor : Editor
{
public override void OnInspectorGUI()
{
// بازیابی مرجع اسکریپت PlayerStats
PlayerStats playerStats = (PlayerStats)target;

// نمایش برچسب
EditorGUILayout.LabelField("Player Stats", EditorStyles.boldLabel);

// نمایش اسلایدرها برای تنظیم مقادیر
playerStats.health = EditorGUILayout.IntSlider("Health", playerStats.health, 0, 100);
playerStats.mana = EditorGUILayout.IntSlider("Mana", playerStats.mana, 0, 100);
playerStats.stamina = EditorGUILayout.IntSlider("Stamina", playerStats.stamina, 0, 100);

// اگر تغییری ایجاد شد، اسکریپت را علامت‌گذاری کنید
if (GUI.changed)
{
EditorUtility.SetDirty(playerStats);
}
}
}


توضیحات کد

- توضیح [CustomEditor(typeof(PlayerStats))]: این attribute به یونیتی می‌گوید که این کلاس ویرایشگر سفارشی برای PlayerStats است.

- توضیح Editor: کلاس پایه‌ای است که برای ایجاد ویرایشگرهای سفارشی استفاده می‌شود.

- توضیح OnInspectorGUI: این متد برای رسم رابط کاربری ویرایشگر سفارشی استفاده می‌شود. در اینجا متد OnInspectorGUI اورراید شده تا رفتار دلخواه پیاده‌سازی شود.

- توضیح EditorGUILayout.LabelField: این متد برای نمایش یک برچسب با استایل خاص استفاده می‌شود.

- توضیح EditorGUILayout.IntSlider: این متد برای ایجاد اسلایدرهایی که به شما امکان تغییر مقدار متغیرها را می‌دهد، استفاده می‌شود.

- توضیح GUI.changed و EditorUtility.SetDirty: این‌ها برای اطمینان از ذخیره تغییرات در ویرایشگر استفاده می‌شوند.

امیدوارم این آموزش به شما کمک کند تا ویرایشگرهای سفارشی خود را بسازید و تجربه بهتری از کار با یونیتی داشته باشید! 🎮

---
💬 اگر سوالی دارید یا نیاز به راهنمایی بیشتر است، حتما در نظرات با ما در میان بگذارید.
🔔 برای دریافت آموزش‌های بیشتر، کانال ما را دنبال کنید.

#یونیتی #ویرایشگر_سفارشی #برنامه_نویسی
🔥3👍22
آموزش ایجاد Custom Editor در یونیتی - قسمت دوم

درود به همه! 🌟

در قسمت قبلی، یاد گرفتیم که چگونه یک ویرایشگر سفارشی برای اسکریپت PlayerStats ایجاد کنیم. در این قسمت، قصد داریم چند ویژگی جدید به ویرایشگر سفارشی خود اضافه کنیم تا کاربردی‌تر شود.

اضافه کردن دکمه‌های سفارشی

برای اینکه بتوانیم در ویرایشگر خود عملیات خاصی را انجام دهیم، می‌توانیم دکمه‌هایی اضافه کنیم. به عنوان مثال، فرض کنید می‌خواهیم دکمه‌ای داشته باشیم که با فشار دادن آن، مقادیر health`، `mana و stamina به مقادیر پیش‌فرض برگردد.

ابتدا باید اسکریپت PlayerStats را به‌روز کنیم تا یک متد برای بازنشانی مقادیر داشته باشد:

using UnityEngine;

public class PlayerStats : MonoBehaviour
{
public int health = 100;
public int mana = 50;
public int stamina = 75;

// متد برای بازنشانی مقادیر به پیش‌فرض
public void ResetStats()
{
health = 100;
mana = 50;
stamina = 75;
}
}


حالا، ویرایشگر سفارشی را به‌روز می‌کنیم تا شامل دکمه‌های جدید باشد:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(PlayerStats))]
public class PlayerStatsEditor : Editor
{
public override void OnInspectorGUI()
{
// بازیابی مرجع اسکریپت PlayerStats
PlayerStats playerStats = (PlayerStats)target;

// نمایش برچسب
EditorGUILayout.LabelField("Player Stats", EditorStyles.boldLabel);

// نمایش اسلایدرها برای تنظیم مقادیر
playerStats.health = EditorGUILayout.IntSlider("Health", playerStats.health, 0, 100);
playerStats.mana = EditorGUILayout.IntSlider("Mana", playerStats.mana, 0, 100);
playerStats.stamina = EditorGUILayout.IntSlider("Stamina", playerStats.stamina, 0, 100);

// دکمه برای بازنشانی مقادیر
if (GUILayout.Button("Reset Stats"))
{
playerStats.ResetStats();
}

// اگر تغییری ایجاد شد، اسکریپت را علامت‌گذاری کنید
if (GUI.changed)
{
EditorUtility.SetDirty(playerStats);
}
}
}


توضیحات کد

- توضیح ResetStats: این متد در اسکریپت PlayerStats برای بازنشانی مقادیر به مقادیر پیش‌فرض استفاده می‌شود.

- توضیح GUILayout.Button: این متد یک دکمه در ویرایشگر ایجاد می‌کند که با فشار دادن آن، متد ResetStats فراخوانی می‌شود.

اضافه کردن دکمه‌های سفارشی به ویرایشگر می‌تواند به شما کمک کند تا عملیات خاصی را به سرعت و با سهولت انجام دهید و تجربه کاربری بهتری داشته باشید.

امیدوارم این آموزش به شما کمک کند تا ویرایشگرهای سفارشی خود را بهبود بخشید و حرفه‌ای‌تر کار کنید! 🎮

---
💬 اگر سوالی دارید یا نیاز به راهنمایی بیشتر است، حتما در نظرات با ما در میان بگذارید.
🔔 برای دریافت آموزش‌های بیشتر، کانال ما را دنبال کنید.

#یونیتی #ویرایشگر_سفارشی #برنامه_نویسی
4🔥21❤‍🔥1👍1🥰1😁1🤣1🗿1👾1
آموزش ایجاد Custom Editor در یونیتی - قسمت سوم

درود به همه! 🌟

در این پست می‌خواهیم با GUIStyle در یونیتی آشنا شویم. GUIStyle یک ابزار بسیار قدرتمند است که به شما امکان می‌دهد ظاهر و رفتار عناصر گرافیکی را در ویرایشگرهای سفارشی به طور کامل تغییر دهید.

استفاده از GUIStyle برای سفارشی‌سازی متن


بیایید با یک مثال ساده شروع کنیم تا نحوه استفاده از GUIStyle را برای نمایش متنی با رنگ و استایل خاص درک کنیم.

در این مثال، ما یک GUIStyle ایجاد می‌کنیم که رنگ متن، اندازه فونت، استایل فونت، و تراز متن را تغییر می‌دهد:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(PlayerStats))]
public class PlayerStatsEditor : Editor
{
public override void OnInspectorGUI()
{
// بازیابی مرجع اسکریپت PlayerStats
PlayerStats playerStats = (PlayerStats)target;

// ایجاد یک GUIStyle جدید
GUIStyle myStyle = new GUIStyle();
myStyle.fontSize = 18;
myStyle.normal.textColor = Color.cyan;
myStyle.fontStyle = FontStyle.Bold;
myStyle.alignment = TextAnchor.MiddleCenter;

// نمایش یک متن با استفاده از GUIStyle
GUILayout.Label("Player Stats", myStyle);

// نمایش اسلایدرها برای تنظیم مقادیر
playerStats.health = EditorGUILayout.IntSlider("Health", playerStats.health, 0, 100);
playerStats.mana = EditorGUILayout.IntSlider("Mana", playerStats.mana, 0, 100);
playerStats.stamina = EditorGUILayout.IntSlider("Stamina", playerStats.stamina, 0, 100);

// اگر تغییری ایجاد شد، اسکریپت را علامت‌گذاری کنید
if (GUI.changed)
{
EditorUtility.SetDirty(playerStats);
}
}
}


توضیحات کد

- توضیح fontSize: اندازه فونت را تعیین می‌کند.
- توضیح normal.textColor: رنگ متن را تنظیم می‌کند.
- توضیح fontStyle: استایل فونت را به صورت Bold (پررنگ) تنظیم می‌کند.
- توضیح alignment: متن را در مرکز (وسط) تراز می‌کند.

- توضیح GUILayout.Label: این متد، متنی را با استفاده از GUIStyle تعریف‌شده نمایش می‌دهد. در اینجا، متن "Player Stats" با رنگ آبی روشن، اندازه بزرگ و استایل Bold در مرکز صفحه نمایش داده می‌شود.

با استفاده از GUIStyle، می‌توانید ویرایشگرهای خود را به گونه‌ای طراحی کنید که هم زیبا و هم کاربردی باشند، و بخش‌های مهمی از رابط کاربری خود را برجسته کنید.

امیدوارم این آموزش به شما کمک کند تا ویرایشگرهای سفارشی خود را با استفاده از GUIStyle بهبود ببخشید و ظاهر پروژه‌های یونیتی خود را حرفه‌ای‌تر کنید! 🎨🎮

---
💬 اگر سوالی دارید یا نیاز به راهنمایی بیشتر است، حتماً در نظرات با ما در میان بگذارید.
🔔 برای دریافت آموزش‌های بیشتر، کانال ما را دنبال کنید.

#یونیتی #ویرایشگر_سفارشی #برنامه_نویسی #GUIStyle #سفارشی‌سازی
4❤‍🔥3👍3
در یونیتی، Native Plugins به پلاگین‌هایی گفته می‌شود که به شما اجازه می‌دهند کدهای بومی (مانند C++، Java، Swift و ...) را وارد پروژه یونیتی کنید و از قابلیت‌های سیستم‌عامل‌هایی مانند اندروید، iOS، ویندوز و مک به طور مستقیم استفاده کنید. این پلاگین‌ها برای دسترسی به APIها و ویژگی‌های خاص هر پلتفرم که یونیتی به‌صورت پیش‌فرض ارائه نمی‌دهد، استفاده می‌شوند.

📌 کاربرد Native Plugins
- استفاده از APIهای بومی: به شما اجازه می‌دهد از امکاناتی مانند GPS، دوربین، سنسورهای حرکتی و دیگر قابلیت‌های دستگاه‌های موبایل استفاده کنید.
- بهینه‌سازی عملکرد: اجرای بخشی از منطق بازی به صورت بومی می‌تواند عملکرد را بهبود بخشد، به خصوص در بخش‌هایی که نیاز به سرعت پردازش بالاست.
- دسترسی به توابع سیستم‌عامل: برای مواردی که نیاز دارید از توابعی استفاده کنید که در یونیتی قابل دسترس نیستند، مانند مدیریت فایل‌ها، شبکه یا استفاده از قابلیت‌های سخت‌افزاری.

✍️ مثال نحوه استفاده از Native Plugin

1. نوشتن کد بومی (C++):
extern "C"
{
__declspec(dllexport) int MultiplyByTwo(int value)
{
return value * 2;
}
}


2. اضافه کردن به یونیتی:
- فایل DLL تولید شده از کد C++ را به پوشه Assets/Plugins اضافه کنید.

3. فراخوانی از یونیتی (C#):
using System.Runtime.InteropServices;
using UnityEngine;

public class NativePluginExample : MonoBehaviour
{
[DllImport("NativePlugin")]
private static extern int MultiplyByTwo(int value);

void Start()
{
int result = MultiplyByTwo(5);
Debug.Log("Result from Native Plugin: " + result);
}
}

در این مثال، تابع MultiplyByTwo که در کد بومی تعریف شده، در یونیتی فراخوانی می‌شود و نتیجه در کنسول نمایش داده می‌شود.

📝 نکات مهم:
- برای هر پلتفرم باید فایل مناسب آن (مثل .dll برای ویندوز یا .so برای اندروید) ساخته شود.
- استفاده از پلاگین‌های بومی می‌تواند به بهینه‌سازی بازی‌ها در موبایل و دسکتاپ کمک کند.

#یونیتی #برنامه_نویسی #NativePlugin #UnityPlugins
8👍2🔥1
کدام متد برای محاسبه زاویه بین دو بردار استفاده می‌شود؟
Anonymous Quiz
8%
Vector3.Reflect();
79%
Vector3.Angle();
10%
Vector3.Distance();
3%
Vector3.Project();
14
درود دوستان عزیز،
ببخشید که این پست مستقیم به موضوعات آموزشی کانال مرتبط نیست، اما حس می‌کنم نیاز هست این مسئله رو با شما به اشتراک بذارم. متاسفانه در جامعه ما افرادی وجود دارن که احساس می‌کنن همه چیز رو می‌دونن و از دیگران برتر هستن. این افراد توی گفتگوهاشون سعی می‌کنن دیگران رو تخریب کنن، دنبال فرصتی هستن تا با پایین آوردن بقیه، خودشون رو بزرگ نشون بدن. در نهایت، راهنمایی‌های درستی هم ارائه نمی‌دن و بیشتر از واژه‌های تحقیرآمیزی مثل "احمق"، "کودن" و حتی "گاو" استفاده می‌کنن. وقتی بهشون اعتراض کنی، معمولاً میگن "نه، من توهین نکردم!" یا دلیل‌هایی از این دست میارن.

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

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

با سپاس از همراهی شما دوستان.
👍13👏4
🛠 سیستم Job در یونیتی

سیستم Job در یونیتی یک سیستم چند نخی است که به توسعه‌دهندگان این امکان را می‌دهد تا کدهای خود را به صورت مؤثر و بهینه برای اجرا روی چند هسته پردازنده پیاده‌سازی کنند. این سیستم به طور خودکار کارها (Jobs) را به چندین هسته پردازنده تقسیم می‌کند تا به عملکرد بهتری دست یابید، به خصوص در پروژه‌های پیچیده و سنگین مانند بازی‌های بزرگ و واقعیت مجازی (VR).

🎯 کاربرد سیستم Job:
- بهبود عملکرد: اجرای موازی (Parallel) کدها روی چند هسته پردازنده باعث افزایش کارایی و سرعت اجرای پروژه می‌شود.
- استفاده از چندین هسته پردازنده: یونیتی به طور پیش‌فرض فقط از یک هسته پردازنده برای اغلب کارها استفاده می‌کند، ولی با Job System می‌توانید کارهای سنگین مثل پردازش فیزیک، هوش مصنوعی، و عملیات سنگین دیگر را روی هسته‌های متعدد توزیع کنید.
- مدیریت آسان: به جای نوشتن کدهای پیچیده برای مدیریت چند نخ (Multithreading)، سیستم Job یک رابط ساده و امن برای مدیریت و هماهنگ‌سازی کارها فراهم می‌کند.

👨‍💻 نحوه استفاده از سیستم Job:

.1ایجاد یک Job ساده:
برای تعریف یک Job باید از اینترفیس IJob استفاده کنید. مثال زیر یک Job ساده ایجاد می‌کند که عددی را در ۲ ضرب می‌کند:

using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;

public class JobExample : MonoBehaviour
{
[BurstCompile]
struct MultiplyByTwoJob : IJob
{
public int number;

public void Execute()
{
number *= 2;
}
}

void Start()
{
// ایجاد Job
MultiplyByTwoJob myJob = new MultiplyByTwoJob { number = 5 };

// اجرای Job
JobHandle jobHandle = myJob.Schedule();

// صبر برای اتمام Job
jobHandle.Complete();

// نمایش نتیجه
Debug.Log("Result: " + myJob.number);
}
}


2. استفاده از Burst Compiler:
با استفاده از `[BurstCompile]`، می‌توانید عملکرد بیشتری از Job خود بگیرید. Burst Compiler کد را بهینه‌سازی کرده و کارایی آن را بیشتر می‌کند.

3. اجرای موازی با IJobParallelFor:
برای اجرای کارها به صورت موازی (Parallel)، می‌توانید از IJobParallelFor استفاده کنید:

using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;

public class ParallelJobExample : MonoBehaviour
{
[BurstCompile]
struct MultiplyArrayJob : IJobParallelFor
{
[ReadOnly] public NativeArray<int> inputArray;
public NativeArray<int> outputArray;

public void Execute(int index)
{
outputArray[index] = inputArray[index] * 2;
}
}

void Start()
{
NativeArray<int> inputArray = new NativeArray<int>(new int[] { 1, 2, 3, 4, 5 }, Allocator.TempJob);
NativeArray<int> outputArray = new NativeArray<int>(inputArray.Length, Allocator.TempJob);

MultiplyArrayJob job = new MultiplyArrayJob
{
inputArray = inputArray,
outputArray = outputArray
};

JobHandle jobHandle = job.Schedule(inputArray.Length, 1);
jobHandle.Complete();

for (int i = 0; i < outputArray.Length; i++)
{
Debug.Log("Result " + i + ": " + outputArray[i]);
}

inputArray.Dispose();
outputArray.Dispose();
}
}


📌 نکات کلیدی:
- بهینه‌سازی: با اضافه کردن [BurstCompile] به Job خود، می‌توانید کدهایتان را بهینه‌تر کنید.
- حافظه: برای استفاده از حافظه امن در سیستم چند نخی، از NativeArray یا دیگر انواع Native Containers استفاده کنید.
- مدیریت: برای مدیریت اجرای کارها و اطمینان از اتمام آن‌ها قبل از دسترسی به داده‌های خروجی، از JobHandle استفاده کنید.

#یونیتی #برنامه_نویسی #UnityJobs #Multithreading #Performance #Optimization
82🔥2👍1
خروجی کد زیر در Unity چه مقداری خواهد بود؟

float result = Mathf.Clamp(7.0f, 1.0f, 5.0f);
Anonymous Quiz
12%
1.0
55%
5.0
24%
7.0
9%
3.0
4
خروجی کد زیر در Unity چیست؟

float result = Mathf.Round(3.7f);
Anonymous Quiz
22%
3.0
11%
3.5
62%
4.0
5%
5.0
6
🎮 چرا مقایسه سی‌شارپ یونیتی با C++ اشتباه است؟

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

#یونیتی #برنامه_نویسی #فیزیک #Rigidbody
🔥55❤‍🔥4👍2