soheil moonesi
soheil moonesi
خواندن ۳ دقیقه·۸ ماه پیش

Unity SceneManager

خوب خوب حالا میریم سراغ این که چه جوری صفحه یا level که داریم رو ریست کنیم با استفاده از SceneManager ، حالا این اصلا یعنی چی؟ مثلا میخوایم وقتی که راکتمون خورد به یه جسمی که هیچی تگی براش تنظیم نکردیم بازی دوباره reload بشه و از اول بیاد.

خوب قبل این که بریم کدش رو بررسی کنیم باید با مفهوم Scene آشنا بشیم. خوب هر چیزی که روی صفحه میبینیم و داریم باهاش کار میکنیم میشه scene حالا ما اینجا صفحه که داریم به اسم sandbox اسم گذاریش کردیم و اگر به گوشه سمت راستش دقت کنید میبینید که عدد صفر نوشته شده که این همون index این صفحه است که جلوتر باهاش میخوایم کار کنیم

خوب اینجا اومدیم توی یه switch اجسامی رو که اوکی هستند راکت بهشون بخوره رو تعیین کردیم و توی default اومدیم گفتیم که اگر جسمی که بهش برخورد کردی غیر از این 3 تا بود متد ReloadLevel رو اجرا کن. خوب حالا میرسیم به sceneManager

اینجا برای این که از متد loadScence بخوایم استفاده کنیم چند تا راه داره

SceneManager.LoadScence('SandBox')

SceneManager.LoadScence(0)

یا بیایم توسط getActiveScene و buildIndex بیایم و ایندکس صفحه ای که فعال هستش رو به صورت اتوماتیک بگیریم و ازش استفاده کنیم مثل خط 28 و 29 که این کار رو انجام دادیم.

خوب حالا در ادامه میخوایم یه level دیگه رو به بازی اضافه کنیم که بعد از این که مرحله اول رو با موفقیت رد کردیم بره مرحله ی دوم.

خوب برای این کار اول لازمه که بریم رو راکت کلیک کنیم و بعد بریم داخل inspector و اونجا بزنیم روی override و همه ی تغییراتی رو که روی راکت انجام دادیم رو apply کنیم.

حالا میریم توی قسمت Scene میزنیم روی صفحه که داریم و بعد control + D رو میزنیم و duplicate میکنیم scene رو .

خوب حالا که scene جدید درست کردیم میبریم میندازیمش توی build setting که بعدا ازش استفاده کنیم.

اینجا نکته ای که هست اینه که حواسمون باشه که sceneManager.sceneCount رو به جای sceneManager.sceneCountInBuildSetting استفاده نکنیم چون این دو با هم فرق دارن.

خوب برای توضیح کد بالا باید بگم که اینجا بعد از این که 2 تا صفحه طراحی کردیم اومدیم یه کدی نوشتیم که بعد از این که راکت رو رسوندیم به نقطه finish بره مرحله ی بعد و وقتی که تمام مراحل تموم شدن بازی برگرده به صفحه ی اول.

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

invoke("methodName",delayInSeconds)

خوب استفاده کردنش ازش مزیتش اینه که سریعه و کار رو راه میندازه ولی مشکلی که داره اینه که مرجع اون متد به صورت string هستش و داستانی که ایجاد میشه اینه که اگر ما اسم متد اصلی رو تغییر بدیم و یادمون بره که اینجا تغییرات رو ایجاد کنیم invoke کار نمیکنه.

not as performant as using coroutine.






کارscenemanagerscene صفحه
C# enthusiast
شاید از این پست‌ها خوشتان بیاید