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

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

گروه: @StartUnityGP

🫂 @AmirHDeveloper @HaminGames
Download Telegram
سال نو آمد و با آغاز نوروز، امیدوارم که پر از شادی، سلامتی و موفقیت باشد برای شما و عزیزانتان. امسال همراه با آغاز فصل جدید، بهترین آرزوهای ما برای شماست که در هر زمینه‌ای که علاقه دارید، به موفقیت‌های بیشتری دست یابید. به امید اینکه هر روز از این سال جدید، فرصت‌های جدیدی برای رشد و یادگیری برای شما فراهم شود. نوروزتان پیروز!
❤‍🔥411
🎨 فرمت‌دهی متن در Debug.Log یونیتی با HTML

در Debug.Log یونیتی می‌توان از تگ‌های HTML برای فرمت‌دهی به متن استفاده کرد تا اطلاعات بهتر سازماندهی و برجسته شوند. در ادامه، چند نمونه پرکاربرد را می‌بینید:


🔹 ضخیم‌کردن متن — `<b>`
نمایش متن با ضخامت بیشتر در خروجی:

Debug.Log("<b>Important Message:</b> This is an important message.");


🔹 کج‌کردن متن — `<i>`
نمایش متن به حالت ایتالیک (کج):

Debug.Log("<i>Notice:</i> This is a notice.");


🔹 تغییر رنگ — `<color>`
نمایش متن با رنگ دلخواه:

Debug.Log("<color=red>Error:</color> This is an error message."); // نمایش قرمز


🔹 تغییر اندازه — `<size>`
تنظیم اندازه فونت متن:

Debug.Log("<size=20>Big Message:</size> This is a big message."); // اندازه 20 پیکسل


🔹 ترکیبی — `<b><color>`
نمایش متن با ضخامت و رنگ همزمان:

Debug.Log("<b><color=blue>Info:</color></b> This is an informational message."); // آبی و ضخیم



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

#یونیتی #برنامه_نویسی
🔥7👍1
متد DontDestroyOnLoad به عنوان یک متد استاتیک در Unity استفاده می‌شود تا از از دست رفتن یک شیء در زمان بارگذاری صحنه جلوگیری کند. این متد معمولاً برای حفظ اجزاء مهمی که باید در تمامی صحنه‌ها حضور داشته باشند، مورد استفاده قرار می‌گیرد، مثل اجزاء UI یا منابع مرکزی.

مثال:
فرض کنید یک شیء به نام "GameManager" داریم که شامل اطلاعات وضعیت بازی و دسترسی به منابع مهم است. می‌خواهیم این شیء را در تمامی صحنه‌ها حفظ کنیم تا اطلاعات بازی از دست نرود. برای این منظور، می‌توانیم از متد DontDestroyOnLoad استفاده کنیم.

using UnityEngine;

public class GameManager : MonoBehaviour
{
public static GameManager instance;

void Awake()
{
// بررسی وجود چنین شیءی
if (instance == null)
{
// اگر شیء وجود نداشت، این شیء را تنظیم کنید
instance = this;
// این شیء را از از بین نمیرود و در تمامی صحنه‌ها حفظ می‌شود
DontDestroyOnLoad(gameObject);
}
else
{
// اگر شیء قبلاً تنظیم شده بود، این شیء را از بین ببرید
Destroy(gameObject);
}
}

// توابع و منطق بازی اینجا اضافه شود
}


در این مثال، وقتی که "GameManager" بارگذاری می‌شود، ما از DontDestroyOnLoad استفاده می‌کنیم تا از از دست رفتن "GameManager" در هر تغییر صحنه جلوگیری کنیم. این کار باعث می‌شود که "GameManager" در تمامی صحنه‌های بازی حضور داشته باشد و اطلاعات مهم بازی در آن حفظ شود.

#یونیتی #برنامه_نویسی
🔥7👍43
🌟 به کدام نوع از محتوای آموزشی بیشتر علاقه‌مندید؟
Anonymous Poll
57%
آموزش‌های ویدئویی
21%
آموزش‌های متنی
22%
آموزش‌های تعاملی (پروژه‌های عملی)
🌟 اگر بخواهید دوره آموزشی یونیتی ببینید، کدام گزینه را ترجیح می‌دهید؟
Anonymous Poll
29%
خریداری یک دوره کامل و با کیفیت
71%
استفاده از آموزش‌های متفرقه رایگان
🌟 سطح مهارت شما در یونیتی چگونه است؟
Anonymous Poll
51%
مبتدی
37%
متوسط
12%
پیشرفته
22
متدهای کلاس 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