Unity Learning
2.99K subscribers
574 photos
211 videos
1.05K files
280 links
⭕️کانال آموزش حرفـــه ای موتور بازی سازی یـــونیتی

▪️ @UnityLearning ▫️

🔹ارتباط با مدیر کانال/👇

@UnityLearning_Admin

🔹 کد شامد /👇

1-1-3526-61-3-1

💰 تعرفه تبلیغات/👇

@UnityLearning_Ads

لینک گروه تبادل نظر اعضای کانال
@UnityLearning_Group
Download Telegram
روش دیگــری برای انجام اعمالی که باید با نزدیک شدن به آبجکت ها انجام گیرد (غیر از روش وقت گیر Trigger)

🔹 در روش های قبل برای انجام این گونه اعمال (مثل باز کردن درب) از Trigger ها استفاده می شد که هم درد سر ساز و هم طراحی آن کمی سخت بود. البته در همینجا خاطر نشان می شود، برخی اعمال باید توسط Trigger انجام شود و جایگزین ندارد. مثل حالت سوار شدن به ماشین که فقط باید زمانی رخ دهد که کاربر در محل مورد نظر ما قـــرار گرفته است.

🔸 برای اعمال دیــگری مثل همین موضوع باز و بسته کردن درب ها روش دیگری ارائه می شود(که در اسکریپت پست قبل مشهود است) و آن محاسبه فاصله آبجکت تا Player است. اگر اسکریپت بتواند به آبجکت Player دسترسی داشته باشد و فاصله او تا درب را محاسبه کند می توانیم با دستور if کاری کنیم هر گاه این فاصله کمتر از یک حد معمول شد، و کلید مورد نظر فشار داده شد، عمل انجام شود. مثلاً درب باز یا بسته شود و یا آژیر خطر فعال شود.

(این روش در اسکریپت کاملا انجام شده است و کلیه دستورات نیز در کانال توضیح داده شده است، برای بدست آوردن آبجکت
ـ Player از دستور FindWithTag استفاده شده است و برای محاسبه فاصلــه از Distance)

👈 دقت کنید این روش برای بازی های چند نفری یا بازی هایی که در یک آن چند Player دارد غیر قابل انجام است و تنها در بازی هایی قابل پیاده سازی است که در آن در حل لحظه تنها یک Player وجود دارد. بنابراین برای انجام اینگونه موارد (انجام عمل در بازی های چند نفری) تنها راه استفاده از Trigger هاست.

مزیت این روش ساده بودن آن است، شما اسکریپتی که نوشتید را به هر آبجکت مشابهی بدهید عمل بدون مشکل انجام می شود، بدون اینکه لازم باشد به آبجکت Trigger بدهید.

عیب این روش اجرای همیشگی اسکریپت است و اگر تعداد عمل ها (مثلا تعداد درب ها) زیاد باشد، سرعت اجرای بازی کاهش میابد چون تمام اسکریپت ها همیشه در حال محاسبه فاصله دو آبجکت هستند و هیچگاه متوقف نمی شوند. اما استفاده از روش Trigger باعث می شود اسکریپت تنها زمانی اجــرا شود که کاراکتر (Player) وارد محدوده شده و در خارج آن هیچ کدی اجرا نمی شود.

#اسکریپت_نویسی #کد_نویسی #جاوا #باز_و_بسته_شدن_درب


کانال یونیتی لرنینگ
💢 @UnityLearning💢
⭕️ انجام اعمال مربوط به ماتریس ها

📟 گاهی اوقات در ساخت بازی لازم است به محاسبات ماتریسی دسترسی داشته باشیم. همانطور که برای انجام اعمال ریاضی از mathf استفاده می‌شود، برای انجام اعمال ماتریسی از #کلاس Matrix4x4 استفاده می‌شود. این کلاس کلیه محاسبات لازم ماتریسی را انجام میدهد(البته ماتریس 4 در 4)

💡این گونه محاسبات در اعمال حرکتی و چرخشی(Vector3 و Quarternion) بسیار مورد استفاده قرار می‌گیرند.

📍به طور #مثال با دستور determinant دترمینان یک متغیر که از نوع ماتریسی است را بر می گرداند. این متغیر (دترمینان) از نوع float است.

▫️برای محاسبه معکوس یک ماتریس نیز از inverse استفاده می‌شود که خروجی آن از نوع ماتریسی است (Matrix4x4)

🔜 در سایر پست ها نحوه کار با متغیر های ماتریسی را بیشتر بررسی خواهیم کرد.

#اسکریپت_نویسی #جاوا #یونیتی #ماتریس


⭕️کانال یونیتی لرنینگ⭕️
💢@UnityLearning💢
🚀 #آبجکت موشک هوا به هوا

🛩 قابل استفاده برای موشک هواپیما های جنگی

فرمت های مختلف آبجکت در دسترس است.

🔰دانلود در پست بعدی🔰

@UnityLearning
i19xown45atc_AIM120DMissile.rar
10.2 MB
⭕️ #آبجکت آماده برای موشک هواپیما های جنگی

AIM-120D Missile 

🔹با فرمت های مختلف 3ds fbx obj و...

@UnityLearning
🔴 #خبر مهم

🔹وزیر ارتباطات: در مورد بازی نهنگ آبی اطلاع رسانی کنید، بازی چالش نهنگ آبی به ایران نمی‌آید.


🐳 نهنگ آبی بازیی که در سال 2013 ارائه شد یک بازی چالش بر انگیز است که در کشور های خاصی عرضه شد. در این بازی از شما یک سری عمل خواسته شده و شما باید آنرا در طول روز یا شب انجام دهید. مثلا از شما می خواهد با چاقو🔪 روی دست خود یک شکل بکشید و سپس باید از طرح خود عکس بگیرید تا به مرحله بعد بروید. این بازی که باعث تاثیر گذاری شدید روی روح و روان بازی کنان می شود در مراحل پایانی خواستار خودکشی افراد می‌گردد. اصلا نام بازی از همین موضوع گرفته شده و اشاره به خودکشی نهنگ ها دارد.

لطفا این مطلب را #انتشار_دهید تا دیگران نیز از ماهیت این بازی با خبر شوند.

@UnityLearning
⭕️باز شدن صفحه کلید لمسی در بازی

در یونیتی برای باز شدن صفحه کلید لمسی گوشی های موبایل از کلاس TouchScreenKeyboard استفاده می‌شود، این کلاس با توجه به نوع سیستم عامل گوشی (یعنی iOS ، #اندروید ، ویندوز فون و...) صفحه کلید مورد نظر را باز می‌کند. برای باز شدن صفحه کلید از دستور Open استفاده می‌شود. این دستور پارامتر های بسیاری دارد که دو پارامتر اول از همه مهمتر هستند.

🖱پارامتر اول متن اولیه برای ویرایش است (یعنی این کیبورد به طور پیش فرض یک متن را به بازی (محل نوشتن) ارسال می‌کند معمولا این پارامتر خالی است ( "" )

💡پارامتر دوم نوع صفحه کلید است، مثلا صفحه کلید عددی گوشی یا صفحه کلید متنی و... این پارامتر ورودی های بسیاری دارد که همه آنها را در یک اسکریپت آماده قرار می‌دهیم تا آنها را مشاهده کنید. به طور مثال اگر بخواهیم صفحه کلید عددی گوشی باز شود دستورات زیر را می‌نویسیم/👇

var keyboard: TouchScreenKeyboard;

keyboard = TouchScreenKeyboard.Open("", TouchScreenKeyboardType.NumberPad);

(ابتدا یک متغیر از کلاس تعریف کرده و سپس آنرا برابر دستور Open قرار می‌دهیم)

📍 #کلاس TouchScreenKeyboard دستورات بسیاری برای بهره گیری از حداکثر قابلیت های صفحه کلید گوشی ها دارد که در پست های بعدی توضیح داده خواهد شد.

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

👈 #ادامه_دارد


#اسکریپت_نویسی #جاوا #یونیتی #صفحه_کلید


⭕️کانال یونیتی لرنینگ⭕️
💢@UnityLearning💢
Touch_Screen_Keyboard.js
1.7 KB
⭕️ اسکریپت آماده باز شدن صفحه کلید لمسی

🔹نمایش انواع صفحه کلید لمسی با انتخاب توسط کاربر

🔸خروجی فقط در موبایل ها قابل نمایش است.

@UnityLearning
🌹علے را وصف در باور نیاید
زبان هرگز ز وصفش بر نیاید

💐علی با درد غربت آشنا بود
علی تنها ترین مرد خدا بود

🌷علی در آستین دست خدا داشت
قدم در آستان کبریا داشت

🌸پیشاپیش عید غدیر مبارک🌸
#نکته #برنامه_نویسی

⭕️ توضیحاتی در مورد کلاس Vector3

🔹مطالب مربوط به حرکت توسط کلاس Vector3


👈همانطور که می دانیم این کلاس برای انجام عملیات مربوط به صفحه مختصات سه بعدی(دارای محور های xyz) به کار می‌رود.

🔸حال به طور #مثال فرض کنید می خواهید یک شی را جابجا کنید، این کار در ساده ترین روش با تغییر پارامتر های xyz از پارامتر position مربوط به کلاس transform قابل انجام است. مثلا دستور زیر در هر بار اجرا 5 واحد به مقدار x از position آبجکت جاری اضافه می‌کند/👇

transform.position.x += 5 ;

🔹اما اکنون فرض کنید یک آبجکت تنها به یک سمت حرکت کند، مثلا روبرو . در این صورت استفاده از دستور فوق باعث حرکت آبجکت می‌شود ولی نه همیشه به سمت روبرو (چون نسبت چرخش آبجکت متفاوت است به بیان دیگر چون آبجکت می‌چرخد دیگر حرکت او در محور x باعث حرکت به سمت روبرو نمی‌شود. راه حل این مسئله استفاده از دستور و #کلاس Vector3 است (تفاوتی در محل استفاده از دستور نیست، یعنی فرقی نمی کند از دستور Translate برای جابجایی استفاده کنیم یا از دستورات دیگر، مهم استفاده از کلاس Vector3 است. به طور مثال دستور زیر آبجکت مورد نظر را (که کد به آن متصل شده است) به سمت روبرو جابجا میکند (پیش فرض 1 واحد و اگر بخواهید مقدار بیشتر شود باید خروجی دستور Vector3 را در آن مقدار ضرب کنید.

transform.position += Vector3.forward ;

transform.Translate(Vector3.forward);

▪️خروجی هر دو دستور بالا یکسان بوده و نهایتا آبجکت به سمت روبرو حرکت می‌کند (باید توجه کنید اگر می‌خواهید از این دستورات در تابع Update استفاده کنید باید مقادیر Vector3.forward را در Time.deltaTime ضرب کنید تا از نظر زمانی خروجی در تمام دستگاه ها یکسان گردد)

👈اکنون سایر دستورات که مربوط به کلاس Vector3 است و مربوط به حرکت به جهات مختلف می‌شود را بررسی می‌کنیم.

🔹حرکت به سمت عقب (مخالف جهت روبرو)
Vector3.back;

🔹حرکت به سمت بالا
Vector3.up;

🔹حرکت به سمت پایین
Vector3.down;

🔹حرکت به سمت راست
Vector3.right;

🔹حرکت به سمت چپ
Vector3.left;

🔹یک واحد حرکت به تمام جهات (xyz)
Vector3.one ;


#اسکریپت_نویسی #جاوا #سی_شارپ

❗️نکته بسیار مهم: یک بردار در ریاضیات یک جهت و یک طول دارد، در واقع برای نمایش یک بردار در صفحه مختصات لازم است جهت و طول آن مشخص شود، بنابر این در اصل دستورات ذکر شده بردار های جهتی تولید شده هستند که باعث حرکت آبجکت(ها) در جهت و به میزان طول خود می‌شوند. طول پیش فرض تمامی بردار های بالا 1 واحد است و با ضرب عدد در آن می‌توان مقدار آن را تغییر داد.


⭕️کانال یونیتی لرنینگ⭕️
💢@UnityLearning💢
سِیو کردن بازی ( Game Saving)

🔸 یکی از مهمــترین شرایطی که بازی ها می توانند داشته باشد، قابلیت ذخیره (سِیو) در آنهاست. سیو در بازی می تواند در حالـــت های متفاوتی اتفاق بیافتد. مثـــلاً سیو مراحل بازی یا سیو تمام بخش های بازی در زمان زدن گزینه Save توسط کاربر.

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

🔹 ذخیره مرحله بازی را روی #فایل انجام می دهیم. (فایل متنی) بنابراین اگـــر در مورد ذخیره فایل متنی مطالب را نمی دانید پست مربوطه را مطالعه کنید. /👇

https://telegram.me/UnityLearning/458

بنابراین کافی است زمانی که کاربر به مرحله جدید می رود (حال در تابع Start آن مرحله یا توابع دیگر) شماره مرحله یا نام آن را در یک فایل که برای این کار (سیو بازی) ساخته می شود، فـــرار دهیم و همیشه در ابتدای بازی یک اسکریپت داشته باشیم که دستور

Application.LoadLevel

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

در صورتی که به یاد داشته باشید در آموزش مربوط به فایل، اسکریپت بسیار کاربردی برای ذخیره فایل متنی در مسیر داده شده و همچنین خواندن از آن و قرار دادن متن در متغیر رشته ای را قرار دادیم به کمک این توابع به راحتی عمل نوشتن نام و یا شماره مرحله در فایل امکان پذیر است، مثلا به کمک دستورات زیر فایلی را می سازیم که شامل شماره مرحله بازی است/👇 (دقت کنید فرض بر این است که توابع WriteFile و ReadFile که خودمان نوشتیم را به اسکریپت داده ایم.)

WriteFile(Application.dataPath+"\\Save.txt",Application.loadedLevel.ToString());

🔹 این دستور شماره مرحله جاری را در یک فایل به نام Save.txt در مسیر جاری بازی (متفاوت برای پلتفرم های مختلف) ذخیره می کند.

👈 با دستور زیر هم می توانید این شماره را در یک String قرار دهید و بر اساس آن تصمیم بگیرید که چه مرحله load شود/👇

var Level=ReadFile(Application.dataPath+"\\Save.txt");

🔸 متغیر Level از نوع رشته ای و شامل نام فایل مورد نظر می باشد. البته باید دقت کرد که این فایل باید وجود داشــته باشد (در صورتی که وجود نداشته باشد این دستور با خطا مواجه می گردد بنابراین باید دقت کرد که دستور در چه محلی صدا زده می شود.)

🔹 اسکریپت آماده تمام مطالبی که بیان شد، در کانال و در پست های بـــعدی قرار خواهد گرفت. این اسکریپت ها شامل 1- اسکریپت برای ذخیره شماره مرحله بازی در یک فایل در محل لود شدن مرحله بعد است (یعنی زمانی که کاربر به مرحله بعد می رود شماره آن در فایل ذخیره شود) 2- اسکریپت بار گزاری بازی از روی فایل ذخیره شده (تابع Start) و اجرای مرحله مورد نظر است.

#اسکرپیت_نویسی #کد_نویسی #جاوا #سیو_کردن_بازی


کانال یونیتی لرنینگ
💢 @UnityLearning💢
LoadLevel_Save.js
889 B
⭕️اسکریپت سیو کردن مرحله (در هنگام لود مرحله بعد) در مسیر جاری بازی و در فایل Save.txt

🔹ما این کار را با یک Button انجام داده ایم، شما هر وقت لازم بود مرحله بعدی لود شود، تابع را صدا بزنید.
LoadLevel_FromFile.js
664 B
⭕️اسکریپت لود کردن مرحله بازی از روی فایل Save.txt
که البته برای شروع اولیه باید ابتدا مقدار 0 در آن باشد. (فایل را دستی بسازید)

🔹این اسکریپت را می‌توانید به یک GameObject خالی در مرحله اول بدهید.
⭕️ #دانلود #آبجکت سِپر ساخته شده با 3D MAX

🔹فرمت فایل max و fbx

⬇️دانلود در پست بعدی⬇️

@UnityLearning
Shield_@UnityLearning.rar
5.7 MB
#آبجکت سپر 🛡

🔹آماده برای استفاده در یونیتی

@UnityLearning
🔴 #خبر

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

https://t.me/UnityLearning/1106


@UnityLearning
🌹میلاد با سعادت حضرت امام کاظم، باب الحوائج را تبریک می‌گوییم.

🌷السلام علیک یا اباالحسن یا موسی بن جعفر

🌺برایتان بهترین لحظه ها را آرزومندیم.

🌸 @UnityLearning
BrickMessy0175_5_S.jpg
127.1 KB
⭕️ #تکسچر مناسب دیوار های سنگی

🔹با کیفیت عادی

🔸این تکسچر باید پشت سر هم تکرار شود.

@UnityLearning
🔹 نکاتی در رابطه با ساخت بازی

معرفی چند نکته برای برنامه نویسی بهتـــر و کاراتـــر در #یونیتی

🔹 همیشه سعی کنید، کدهایی که عملکرد اجرایی برای آبجکت خاصی ندارند را به Empty GameObject هایی با نام صحیح بدهید، منظور از این اسکریپت ها، اسکریپت هایی هستند که کاری روی آّبجکت خاصی انجام نمی دهند (مثل اسکریپت ساخت منو)- زیاد شدن این اسکریپت ها و عدم رعایت این موضوع باعث سردرگمی بازی ساز برای پیدا کردن آنها می شود.

🔸 اگــــر تکسچرهایی که در اختیار دارید، کیفیت بالایی ندارند و یا اینکه برای سایز کوچک طراحی شده اند، از کنار هم گذاشتن آبجکت ها برای ساخت یک آبجکت بزرگ استفاده کنید تا تکسچر آبجکت کیفیت خود را حفظ کند و بازی زیباتر به نظر برسد.

🔹 در اکثر مواقع سعی کنید، آبجکت های خود را دسته بندی کنید، برای دسته بندی یک سری آبجکت بعد از انتخاب آنها در #پنجره Hierarchy آنها را روی یک GameObject خالی درگ کنید، با این کار همه آبجکت ها به عنوان زیر مجموعه آبجکت مذکور خواهند شد و عملیاتی مثل جابجایی، چرخش و بزرگ کردن آن روی همه آبجکت های زیر مجموعه (فرزند-Child) اعمال می شود. حسن اصلی این کار شلوغ نشدن Hierarchy و دسترسی آسان به آبجکت هاست.

🔸 به برخی Warning هایی که در پنجره Debug نوشته می شود، توجه کنید. همه این هشدار ها قابل چشم پوشی نیستند و عمل کردن به آنها می تواند سرعت زیادی به انجام بازی بدهد.

🔹 همانطور که قبلا هم توضیح داده ایم ، سعی کنید در برنامه نویسی از توابعی که همیشه در حال اجرا هستند کمتر استفاده کنید (البته در برخی شرایط استفاده از آنها اجتناب ناپذیر است، اما سعی کنید تا جایی که می شود از آنها استفاده نگردد)

🔸 سعی کنید کدهایی که می نویسید، به صورت بهینه شده باشد. کد بهینه شده از نظر اشغال کردن منابع (مثل CPU پردازشی- Ram حافظه و...) کمترین میزان را برای بهترین نتیجه انتخاب می کنند. یعنی مثلا در آنها از انجام حلقه های بی مورد جلوگیری شده است که سرعت پردازش کد را بالا می برد یا میزان متغیرهای لازم برای اسکریپت را به حداقل رسانده که این حافظه رم مصرفی بازی را کاهش می دهد.

عدم رعایت این موارد باعث می شود، بازی ساخته شده بدون دلیل با بهترین قابلیت(مد نظر) کار نکند و نتیجه مناسب از ساخت بازی توسط شما حاصل نمی شود.

#اسکریپت_نویسی #نکته #برنامه #یونیتی


کانال یونیتی لرنینگ
💢 @UnityLearning💢
اسکریپت آماده حرکت یک آبجکت به سمت محل لمس شده

#درخواست

🔹 دستورات مربوط به بررسی Touch در #کلاس Input را قبلاً مورد بررسی قرار دادیم، اکنون قصد داریم اسکریپت آماده ای برای آن قرار دهیم. البته این اسکریپت درخواست برخی کاربران نیز بوده است.

🔸 اسکریپتی که در پست بعدی برای #دانلود قرار می گیرید، برای حرکت یک آبجکت در محیط «دو بعدی» به سمت محل لمس شده در بازی است، این اسکریپت همچنین سرعت حرکت آبجکت را نیز از ورودی دریافت می کند. برای بدست آوردن موقعیت لمس در این اسکریپت از پارامــــتر deltaPosition مربوط به Input.GetTouch استفاده شده است. حرکت آبجکت به سمت نقطه XY است که کاربر روی آن کلیک کرده (لمس کرده) است. (دقت کنید حرکت سه بعد داشته و موقعیت محل لمس در صفحه گوشی دو بعد- بنابراین برای این تبدیل به این صورت عمل شده است)

👈 اسکریپت آماده در پست بعدی قابل دانلود است.



کانال یونیتی لرنینگ
💢 @UnityLearning💢
GetTouchPos.js
539 B
اسکریپت آماده برای بررسی محل لمس در گوشی ها

حرکت ساده در محور های XY نسبت به موقعیت لمس شده در صفحه گوشی

@UnityLearning
#بردار عمود بر دو بردار

🔹 در ریاضیات تعریف خاصی برای بردار عمود بر دو بردار (قوانین فیزیک در محاسبه جهت میدان مغناطیسی) وجود دارد. این بردار کاربردهای خاصی نیز در طراحی بازی دارد. طبق تعریف در ریاضیات، تنها یک بردار جهت دارد عمود بر دو بردار دیگر می تواند وجود داشته باشد.

🔸 در یونیتی با استفاده از #کلاس Vector3 می توان این بردار را محاسبه کرد. خروجی تابع Cross از این تابع یک بردار دیگر است که بر هر دو بردار ورودی عمود خواهد بود.

👈 #سی_شارپ
Vector3 perp = Vector3.Cross(s1, s2);

👈 #جاوا
var perp:Vector3 = Vector3.Cross(s1, s2);

در اینجا متغیر perp بردار عمود بر دو بردار S1 و S2 خواهد بود.

#اسکریپت_نویسی


کانال یونیتی لرنینگ
💢 @UnityLearning💢