سلام دوستان
سه تا پکیج داخل است استور به مدت محدود با کد SYNTY2021 رایگان شدن
لینک : https://assetstore.unity.com/publisher-sale
👉 @UnityEngine 👈
سه تا پکیج داخل است استور به مدت محدود با کد SYNTY2021 رایگان شدن
لینک : https://assetstore.unity.com/publisher-sale
👉 @UnityEngine 👈
This media is not supported in your browser
VIEW IN TELEGRAM
سلام
دوستان ۲۵۰ هزار مکعب سه بعدی میرن اون آخر و دوباره بر میگردن اول (یعنی متحرک هستن) و با ECS و JobSystem زدم
به پنجره stats دقت کنید حدود ۲۷ و ۲۸ فریم هم داد توی ادیتور
(و اینکه رزولوشن پنجره Game رو هم همینطور که میبینید گذاشتم روی 4K)
(۲۵۰ هزار تا خیلیه😑)
دوستان ۲۵۰ هزار مکعب سه بعدی میرن اون آخر و دوباره بر میگردن اول (یعنی متحرک هستن) و با ECS و JobSystem زدم
به پنجره stats دقت کنید حدود ۲۷ و ۲۸ فریم هم داد توی ادیتور
(و اینکه رزولوشن پنجره Game رو هم همینطور که میبینید گذاشتم روی 4K)
(۲۵۰ هزار تا خیلیه😑)
بهترین ویرایشگر کد برای یونیتی از نظر شما کدومش هست؟
Anonymous Poll
43%
Visual Studio
19%
Visual Studio Code
13%
Jetbrains Rider
5%
Script Inspector 3
0%
Super Editor
5%
Notepad
4%
Notepad ++
0%
XCode
9%
MonoDevelop
3%
سایر موارد (کامنت)
سلام دوستان
توی این قسمت میخوایم بریم سراغ وارد کردن پکیج های مورد نیاز برای DOTS
اول اینکه نسخه ای که من الان استفاده میکنم 2022.1.0a3 هست و شما هم سعی کنید از نسخه های جدید یونیتی برای این آموزش استفاده کنید تا به مشکلی بر نخورید
موضوع : وارد کردن پکیج های مورد نیاز DOTS
اول اینکه وارد پکیج منیجر بشید و روی تنظیمات بالا (علامت چرخ دنده) کلیک کنید و روی گزینه Advanced Project Settings کلیک کنید تا وارد قسمت تنظیمات پکیج منیجر بشید . گزینه Enable Pre-realse Packages رو فعال کنید و برگردید به پکیج منیجر و اینترنت خودتون و فیلترشکن رو روشن کنید ( ترجیحا یک بار پکیج منیجر رو ببندید و دوباره بازکنید و روی Refresh کلیک کنید ) چهار تا پکیج Jobs و Entities و Hybrid Renderer و Burst رو فعال کنید .
البته نسخه ای که من استفاده میکنم Burst رو به صورت پیش فرض داره و حذف هم نمیشه
اگر این چهار تا رو پیدا نکردید روی گزینه + بالای پکیج منیجر کلیک کنید و گزینه Add git from URL... رو بزنید و
com.unity.entities
com.unity.jobs
com.unity.rendering.hybrid
com.unity.burst
و ADD رو بزنید و بعد از وارد شدن هر پکیج ، بعدی رو بگذارید ADD رو بزنید
#یونیتی #ecs
#dots
#آموزش #فارسی
(قسمت های بعدی انشاءالله به زودی)
👉 @UnityEngine3D 👈
توی این قسمت میخوایم بریم سراغ وارد کردن پکیج های مورد نیاز برای DOTS
اول اینکه نسخه ای که من الان استفاده میکنم 2022.1.0a3 هست و شما هم سعی کنید از نسخه های جدید یونیتی برای این آموزش استفاده کنید تا به مشکلی بر نخورید
موضوع : وارد کردن پکیج های مورد نیاز DOTS
اول اینکه وارد پکیج منیجر بشید و روی تنظیمات بالا (علامت چرخ دنده) کلیک کنید و روی گزینه Advanced Project Settings کلیک کنید تا وارد قسمت تنظیمات پکیج منیجر بشید . گزینه Enable Pre-realse Packages رو فعال کنید و برگردید به پکیج منیجر و اینترنت خودتون و فیلترشکن رو روشن کنید ( ترجیحا یک بار پکیج منیجر رو ببندید و دوباره بازکنید و روی Refresh کلیک کنید ) چهار تا پکیج Jobs و Entities و Hybrid Renderer و Burst رو فعال کنید .
البته نسخه ای که من استفاده میکنم Burst رو به صورت پیش فرض داره و حذف هم نمیشه
اگر این چهار تا رو پیدا نکردید روی گزینه + بالای پکیج منیجر کلیک کنید و گزینه Add git from URL... رو بزنید و
com.unity.entities
com.unity.jobs
com.unity.rendering.hybrid
com.unity.burst
و ADD رو بزنید و بعد از وارد شدن هر پکیج ، بعدی رو بگذارید ADD رو بزنید
#یونیتی #ecs
#dots
#آموزش #فارسی
(قسمت های بعدی انشاءالله به زودی)
👉 @UnityEngine3D 👈
کانال تخصصی یونیتی ( آموزش و نکته )
#نکته #یونیتی 👉 @UnityEngine3D 👈
به علت نامشخص کامنت زیر این پست بسته شد😐
خواستید کامنت مربوط به پست قبل بدید ، توی همین پست پیام بدید
خواستید کامنت مربوط به پست قبل بدید ، توی همین پست پیام بدید
سلام دوستان
ادامه آموزش DOTS
این قسمت در مورد کار با JobSystem هست و میشه برای GameObject استفاده کرد و نیاز ندارید آبجکت رو به Entity تبدیل کنید . هر چند JobSystem برای GameObject با JobSystem برای Entity در برخی از جا ها کمی متفاوت هست
موضوع : کار با JobSystem و مقایسه آن با حالت معمولی (شامل ۲ قسمت ، یکی این پست و یکی پست بعدی)
اول در مورد سیستم قدیمی یونیتی یک توضیح کوتاهی بدم
خب دوستان شما فرض کنید که 1000 تا آبجکت دارید و میخواید کاری رو روی اون انجام بدید . مثلا هر 1000 تا آبجکت روی محور z حرکت کنند
اول توی متد Start گیم آبجکت هارو Instantiate میکنیم و ظرفیت آرایه رو هم بهش میدیم و اندیس ها رو هم با آبجکت پر میکنیم ، یک چیز شبیه کد زیر
obj = new GameObject[objCount];
for (int i = 0; i < objCount; i++)
{
obj[i] = Instantiate(objPrefab);
}
پیشنهاد میکنم که مختصات آبجکت رو توی حلقه for به صورت رندوم قرار بدید
بعد ما یک حلقه for ایجاد میکنیم و در متد آپدیت اینکار رو انجام میدیم
یک چیزی مثل کد زیر :
for (int i; i<objCount ; i++){
obj[i].transform.position += new Vector3(0,0,1);
}
متغیر objCount در اینجا تعداد آبجکت هایی هست که شما توی آرایه obj ریختید
تا به اینجا سیستم قدیمی یونیتی هست
ادامه آموزش DOTS
این قسمت در مورد کار با JobSystem هست و میشه برای GameObject استفاده کرد و نیاز ندارید آبجکت رو به Entity تبدیل کنید . هر چند JobSystem برای GameObject با JobSystem برای Entity در برخی از جا ها کمی متفاوت هست
موضوع : کار با JobSystem و مقایسه آن با حالت معمولی (شامل ۲ قسمت ، یکی این پست و یکی پست بعدی)
اول در مورد سیستم قدیمی یونیتی یک توضیح کوتاهی بدم
خب دوستان شما فرض کنید که 1000 تا آبجکت دارید و میخواید کاری رو روی اون انجام بدید . مثلا هر 1000 تا آبجکت روی محور z حرکت کنند
اول توی متد Start گیم آبجکت هارو Instantiate میکنیم و ظرفیت آرایه رو هم بهش میدیم و اندیس ها رو هم با آبجکت پر میکنیم ، یک چیز شبیه کد زیر
obj = new GameObject[objCount];
for (int i = 0; i < objCount; i++)
{
obj[i] = Instantiate(objPrefab);
}
پیشنهاد میکنم که مختصات آبجکت رو توی حلقه for به صورت رندوم قرار بدید
بعد ما یک حلقه for ایجاد میکنیم و در متد آپدیت اینکار رو انجام میدیم
یک چیزی مثل کد زیر :
for (int i; i<objCount ; i++){
obj[i].transform.position += new Vector3(0,0,1);
}
متغیر objCount در اینجا تعداد آبجکت هایی هست که شما توی آرایه obj ریختید
تا به اینجا سیستم قدیمی یونیتی هست
خب حالا برای اینکه این کد رو بر مبنای JobSystem اجرا کنیم باید کلا یک جور دیگه کد بنویسیم
یک اسکریپت جدید ایجاد کنید و دو فضای نام
using Unity.Jobs;
using UnityEngine.Jobs;
رو بهش اضافه کنید
یک int به اسم objCount به صورت public اضافه کنید برای تعداد آبجکت (برای اینکه تعدادش توی ادیتور قابل تغییر باشه)
یک GameObject به اسم objPrefab برای اینکه بعدا ازش نمونه بسازیم و به صورت public تعریف کنید
یک آرایه به اسم objects و از نوع GameObject برای ریختن آبجکت هایی که ایجاد میشوند
یک آرایه از نوع Transform و به اسم objTransform برای دسترسی به transform آبجکت های نمونه سازی شده
یک متغیر از نوع TransformAccessArray و به اسم objTransformAccessArray (این خودش آرایه هست و نباید [ ] جلوش گذاشت و یک چیزی مثل transform خودمون هست ولی برای JobSystem)
یک PositionUpdateJob اضافه کنید و اسمش رو بگذارید objectUpdateJob و توجه کنید که احتمالا با ارور مواجه میشید و ارور رو نادیده بگیرید چون که این یک نمونه از یک struct هست که کمی بعد اون رو اضافه میکنیم
یک JobHandle به اسم objJobHandle اضافه کنید ( این برای اطلاع از اتمام Job هست)
خب حالا میرسیم به اصل کاری یعنی ساخت struct . من اول مینویسم بعدش در موردش توضیح میدم
struct PositionUpdateJob : IJobParallelForTransform
{
public void Execute(int index, TransformAccess transform)
{
transform.position += new Vector3(0, 0, 0.25f);
}
}
خب این یک چیز حدود همون حلقه for خودمون هست . دقت کنید کلمه For داخل اینترفیس IJobParallelForTransform به معنای حلقه For هست نه به معنای "برای"
خب IJobParallelForTransform که یک اینترفیس هست و یک متد داره به اسم Execute .
پارامتر این متد یک int index داره که به معنای همون ایندکس حلقه for هست
بعدیش هم یک TransformAccess که شاید معادل Transform خودمون ولی مخصوص JobSystem
خط بعدیش هم داره محور z رو جلو میبره
خب میرسیم به متد Start
private void Start()
{
objects = new GameObject[objCount];
objectsTransform = new Transform[objCount];
for (int i = 0; i < objCount; i++)
{
objects[i] = Instantiate(objPrefab);
objects[i].transform.position = new Vector3(Random.Range(-30, 30), 0, Random.Range(-30, 30));
objectsTransform[i] = objects[i].transform;
}
objTransformAccessArray = new TransformAccessArray(objectsTransform);
}
خط اول و دوم که داره ظرفیت آرایه ها رو تعیین میکنه
خط بعد یک حلقه for هست و چون این حلقه توی متد Start هست من به صورت عادی نوشتم چون توی فریم اول بازی هست و خیلی مشکلی پیش نمیاره
همون طور که میبینید داره آبجکت رو نمونه سازی میکنه و میریزه توی آرایه
بعدش میره و مختصات رندوم برای هر آبجکت رو ایجاد میکنه
و بعدش هم transform هر آبجکت رو میریزه داخل آرایه Transform ها
خط بعد آرایه transform رو به آرایه TransformAccess تبدیل میکنه تا برای JobSystem شناخته بشه
توجه کنید که ما در اینجا یک آبجکت رو به تعداد زیاد Instantiate میکنیم و اگه میخواید آبجکت های مشابه هم توی ادیتور اینطور بشن یا یک آرایه GameObject به صورت public تعریف کنید و آبجکت های مورد نظر رو بهش بدید یا هنگام اجرای بازی بهش بشناسونید و در این صورت دیگه نیازی به Instantiate نیست چون ما دیگه آبجکت داریم و برای تست من Instantiate کردم
بعد میریم سراغ متد Update
private void Update()
{
objJobHandle = objectUpdateJob.Schedule(objTransformAccessArray);
}
اینجا با فرستادن objTransformAccessArray به objectUpdateJob هم متد Execute رو اجرا میکنیم و هم میگیم که چه TransformAccess رو روش عملیات انجام بده و در آخر هم به objJobHandle نتیجه رو نسبت میدیم تا بتونیم بعدا Job رو تموم کنیم
برای همین در متد LateUpdate :
private void LateUpdate()
{
objJobHandle.Complete();
}
این خط رو مینویسیم تا کار objJobHandle ما تمام بشه (متد LateUpdate بعد از Update اجرا میشه)
بعد در متد OnDestroy
private void OnDestroy()
{
objTransformAccessArray.Dispose();
}
و موقعی که اسکریپت نابود شد با متد Dispose اون رو از روی رم برمیداریم (اگه اینکار رو نکنید احتمالا با خطا مواجه بشید)
یک اسکریپت جدید ایجاد کنید و دو فضای نام
using Unity.Jobs;
using UnityEngine.Jobs;
رو بهش اضافه کنید
یک int به اسم objCount به صورت public اضافه کنید برای تعداد آبجکت (برای اینکه تعدادش توی ادیتور قابل تغییر باشه)
یک GameObject به اسم objPrefab برای اینکه بعدا ازش نمونه بسازیم و به صورت public تعریف کنید
یک آرایه به اسم objects و از نوع GameObject برای ریختن آبجکت هایی که ایجاد میشوند
یک آرایه از نوع Transform و به اسم objTransform برای دسترسی به transform آبجکت های نمونه سازی شده
یک متغیر از نوع TransformAccessArray و به اسم objTransformAccessArray (این خودش آرایه هست و نباید [ ] جلوش گذاشت و یک چیزی مثل transform خودمون هست ولی برای JobSystem)
یک PositionUpdateJob اضافه کنید و اسمش رو بگذارید objectUpdateJob و توجه کنید که احتمالا با ارور مواجه میشید و ارور رو نادیده بگیرید چون که این یک نمونه از یک struct هست که کمی بعد اون رو اضافه میکنیم
یک JobHandle به اسم objJobHandle اضافه کنید ( این برای اطلاع از اتمام Job هست)
خب حالا میرسیم به اصل کاری یعنی ساخت struct . من اول مینویسم بعدش در موردش توضیح میدم
struct PositionUpdateJob : IJobParallelForTransform
{
public void Execute(int index, TransformAccess transform)
{
transform.position += new Vector3(0, 0, 0.25f);
}
}
خب این یک چیز حدود همون حلقه for خودمون هست . دقت کنید کلمه For داخل اینترفیس IJobParallelForTransform به معنای حلقه For هست نه به معنای "برای"
خب IJobParallelForTransform که یک اینترفیس هست و یک متد داره به اسم Execute .
پارامتر این متد یک int index داره که به معنای همون ایندکس حلقه for هست
بعدیش هم یک TransformAccess که شاید معادل Transform خودمون ولی مخصوص JobSystem
خط بعدیش هم داره محور z رو جلو میبره
خب میرسیم به متد Start
private void Start()
{
objects = new GameObject[objCount];
objectsTransform = new Transform[objCount];
for (int i = 0; i < objCount; i++)
{
objects[i] = Instantiate(objPrefab);
objects[i].transform.position = new Vector3(Random.Range(-30, 30), 0, Random.Range(-30, 30));
objectsTransform[i] = objects[i].transform;
}
objTransformAccessArray = new TransformAccessArray(objectsTransform);
}
خط اول و دوم که داره ظرفیت آرایه ها رو تعیین میکنه
خط بعد یک حلقه for هست و چون این حلقه توی متد Start هست من به صورت عادی نوشتم چون توی فریم اول بازی هست و خیلی مشکلی پیش نمیاره
همون طور که میبینید داره آبجکت رو نمونه سازی میکنه و میریزه توی آرایه
بعدش میره و مختصات رندوم برای هر آبجکت رو ایجاد میکنه
و بعدش هم transform هر آبجکت رو میریزه داخل آرایه Transform ها
خط بعد آرایه transform رو به آرایه TransformAccess تبدیل میکنه تا برای JobSystem شناخته بشه
توجه کنید که ما در اینجا یک آبجکت رو به تعداد زیاد Instantiate میکنیم و اگه میخواید آبجکت های مشابه هم توی ادیتور اینطور بشن یا یک آرایه GameObject به صورت public تعریف کنید و آبجکت های مورد نظر رو بهش بدید یا هنگام اجرای بازی بهش بشناسونید و در این صورت دیگه نیازی به Instantiate نیست چون ما دیگه آبجکت داریم و برای تست من Instantiate کردم
بعد میریم سراغ متد Update
private void Update()
{
objJobHandle = objectUpdateJob.Schedule(objTransformAccessArray);
}
اینجا با فرستادن objTransformAccessArray به objectUpdateJob هم متد Execute رو اجرا میکنیم و هم میگیم که چه TransformAccess رو روش عملیات انجام بده و در آخر هم به objJobHandle نتیجه رو نسبت میدیم تا بتونیم بعدا Job رو تموم کنیم
برای همین در متد LateUpdate :
private void LateUpdate()
{
objJobHandle.Complete();
}
این خط رو مینویسیم تا کار objJobHandle ما تمام بشه (متد LateUpdate بعد از Update اجرا میشه)
بعد در متد OnDestroy
private void OnDestroy()
{
objTransformAccessArray.Dispose();
}
و موقعی که اسکریپت نابود شد با متد Dispose اون رو از روی رم برمیداریم (اگه اینکار رو نکنید احتمالا با خطا مواجه بشید)
(دو پست قبل در مورد سیستم قدیمی یونیتی حرف زدم و پست قبلی مربوط به JobSystem هست)
خب دوستان این آموزش هم تموم شد ولی خب یک چالش بگذارم برای اینکه یادبگیرید
چالش هم اینه که بعد از اتمام این کار ها به جای تغییر مختصات محور z شما rotation آبجکت رو حول محور y تغییر بدید یا اگه میتونید کارای خفن تر انجام بدید
نتیجه رو به صورت اسکریپت یا فیلم یا... کامنت بدید
(توجه کنید که چالش جایزه نداره)
#یونیتی #JobSystem
#dots
#آموزش #فارسی
👉 @UnityEngine3D 👈
خب دوستان این آموزش هم تموم شد ولی خب یک چالش بگذارم برای اینکه یادبگیرید
چالش هم اینه که بعد از اتمام این کار ها به جای تغییر مختصات محور z شما rotation آبجکت رو حول محور y تغییر بدید یا اگه میتونید کارای خفن تر انجام بدید
نتیجه رو به صورت اسکریپت یا فیلم یا... کامنت بدید
(توجه کنید که چالش جایزه نداره)
#یونیتی #JobSystem
#dots
#آموزش #فارسی
👉 @UnityEngine3D 👈
اگر لینک برای حمایت مالی از کانال گذاشتم ، چقدر حمایت میکنید؟
Anonymous Poll
70%
هیچی
16%
بین هزار تا ۱۰ هزار تومن
6%
بین ۱۰ هزار تا ۱۰۰ هزار تومن
0%
بین ۱۰۰ هزار تا ۵۰۰ هزار تومن
8%
۵۰۰ هزار تومن به بالا
دوستان فعلا کپی مطالب کانال حتی بدون ذکر منبع هم آزاده✅