پیاده سازی تشخیص ضربه با tilemaps

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط تایید

ویندوز
  • ویندوز 11
ویرایشگر یونیتی
  • دانلود: 2021.3.3f1
بسته سیستم ورودی
  • 1.3.0

پیشنیازهای این نکته

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

پیش شرط این نکته چیست؟

درباره مواد نقشه قرض گرفتن

ما پردازش از سایت های زیر قرض گرفته شده است.

پیاده سازی شخصیت های پیاده روی

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

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

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

تصویر را انتخاب کنید و Pixels Per Unit را از بازرس به 32 تنظیم کنید. این به این دلیل است که اندازه یک مربع از mapchip 32 پیکسل است، بنابراین متناسب با ان است. پس از پیکربندی، روی دکمه "درخواست" در زیر کلیک کنید.

روح را در منظره قرار دهید.

ایجاد یک اسکریپت برای حرکت روح. این شبیه به راهنمایی های زیر است:

نام Player اسکریپت را به عنوان .

کد به شرح زیر است:

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }
  }
}

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

بازی را اجرا کنید و بررسی کنید که ایا می خواهید ان را با صفحه کلید حرکت دهید.

اماده سازی MapTips

اول از همه، ما یک mapchip اماده خواهیم کرد و یک نقشه ایجاد خواهیم کرد. این روش شبیه به راهنمایی های زیر است: MapTips با 2D Tilemap Extras نیز قادر به تشخیص برخورد هستند، اما در این مقاله مورد استفاده قرار نخواهند گرفت زیرا این روش طولانی خواهد بود.

تصویر اصلی MapTip را اماده کنید و ان را به پروژه خود اضافه کنید. برای درک اسان تر عملیات، لطفا یک "مکان قابل پیاده روی" و "مکان غیر قابل پیاده روی" را برای مواد تراشه نقشه اماده کنید.

ان را برای MapChips در بازرس تنظیم کنید و روی دکمه Apply کلیک کنید. پس از پیکربندی، ویرایشگر Sprite را باز کنید.

این یک نقشه 32 پیکسلی است، بنابراین من ان را در 32 تقسیم می کنم.

گزینه Tile Palette را انتخاب کنید. اگر نه، ان را با "Window > 2D -> Tile Palette" از منو نمایش دهید. یک پالت جدید ایجاد کنید. نام خودسرانه است، اما در حال حاضر ما ان را "MapChipPalette" می نامیم.

ایجاد یک پوشه MapChipPalette در صحنه ها و مشخص کردن ان.

اضافه کردن یک maptip با کشیدن ان به پالت. ان را در پوشه MapChipPalette که قبلا ایجاد کرده اید ذخیره کنید.

ایجاد یک نقشه

این بار، قضاوت ضربه نقشه در واحدهای "Tilemap" انجام خواهد شد. بنابراین، ما دو Tilemaps، "Tilemap بدون تشخیص ضربه" و "Tilemap با تشخیص ضربه" ایجاد خواهیم کرد.

اول، ایجاد دو Tilemaps در سلسله مراتب. شما می توانید دو در شبکه ایجاد کنید. نام انها "TilemapObeject" و "TilemapGround" برای وضوح است.

ابتدا یک "TilemapGround" ایجاد کنید. از انجا که این یک محدوده متحرک است، می توانید به سادگی زمین را قرار دهید. اگر روی زمین باشد، می توانید الگوی ان را تغییر دهید.

به هر حال، اگر شخصیت پنهان است، شیء شخصیت را انتخاب کنید و ترتیب لایه بازرس را Sprite Renderer به 2 تنظیم کنید. ترتیب لایه ها به طور پیش فرض 0 و Tilemap 0 است، بنابراین اگر ان را بالاتر از این مقدار افزایش دهید، در پیش زمینه نمایش داده می شود.

سپس TilemapObject را انتخاب کنید و maptip را که می خواهید بی حرکت کنید قرار دهید. ابتدا لایه را روی 1 تنظیم کنید. این است که ان را در مقابل زمین ظاهر می شود.

این چیزی است که به نظر می رسد اگر شما زمین را پنهان کنید.

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

تنظیمات تشخیص برخورد

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

یک شیء کاراکتر را از سلسله مراتب انتخاب کنید و Physics 2D -> Circle Collider 2D را از Add Component انتخاب کنید. اگر شکل جسم مستطیل شکل باشد، "Box Collider 2D" خوب است.

به طور مشابه، اضافه کردن "فیزیک 2D -> Rigidbody 2D".

برای جلوگیری از Rigidbody 2D سقوط خودکار ، مقیاس جاذبه را روی 0 تنظیم کنید.

Z را در زیر Constraints بررسی کنید تا از چرخش روح در هنگام برخورد جلوگیری شود.

بعد، "TilemapObject" را که می خواهید ضربه بزنید انتخاب کنید و "Tilemap -> Collider Tilemap 2D" را از "Add Component" انتخاب کنید.

این همه چیزی است که در ان وجود دارد. شما حتی به هیچ برنامه ای نیاز ندارید. اجرای بازی و سعی کنید به ضربه شی که دیوار می شود. من فکر می کنم شما می توانید مطمئن شوید که ان را به درستی متوقف می شود.

با این حال، هنگامی که شما در واقع ان را ضربه، من فکر می کنم که نقاط نگرانی در رفتار وجود خواهد داشت. در اینجا چند راه حل وجود دارد:

رفتار ناخوشایند تشخیص ضربه با نقشه و راه حل

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

اگر به دیوار برخورد کنید، در وسط گیر خواهید کرد.

Box Collider 2D من فکر می کنم این اتفاق خواهد افتاد اگر شما با استفاده از یک شی.

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

تشخیص فرورفتگی در دیوار با موقعیت

Circle Collider 2D من فکر می کنم ان را اسان به درک اگر شما متصل . دیوار باید مسطح باشد، اما اگر ان را به دیوار حرکت دهید، خواهید دید که دیوار طوری حرکت می کند که انگار ناهموار است.

علل و راه حل هایی برای موانع و برامدگی ها

به نظر می رسد دلیل این اتفاق می افتد این است که "تعیین ضربه بر اساس mapchip انجام می شود". در واقع، هنگامی که TilemapObject را انتخاب می کنید، یک خط سبز در جایی که تشخیص ضربه قرار دارد ظاهر می شود و می توانید ببینید که این یک خط کشیده شده در واحدهای MapTip است.

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

من فکر می کنم بهترین راه برای حل این مشکل این است که ترکیب تشخیص ضربه با mapchips متصل شده است. در اینجا نحوه انجام ان است:

"TilemapObject" را با تشخیص ضربه از بازرس انتخاب کنیدTilemap Collider 2D و "استفاده در کامپوزیت" را از .

همانطور که در هشدار ذکر شده است، این به تنهایی هیچ تاثیری ندارد، بنابراین "Physics 2D -> Collider Composite 2D" را از "Add Component" انتخاب کنید.

Rigidbody 2D همراه با Collider 2D کامپوزیت اضافه شده است.

این کمی گیج کننده است، اما من فکر می کنم شما می توانید تایید کنید که خط سبز در مرز بین mapchips با تشخیص ضربه ناپدید شده است.

من نمی خواهم نقشه کاشی حرکت کند، بنابراین من نوع بدنه جزء را به عنوان "استاتیک" ترک می Rigidbody 2D کنم.

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

از بین بردن شخصیت هل می دهد از دیوار

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

برای حل این مشکل،Rigidbody 2D جسم کاراکتر را انتخاب کنید و "تشخیص برخورد" را از جزء به "پیوسته" تغییر ندهید.

تفاوت بین "ناپیوسته" و "پیوسته" به شرح زیر است.

ناپیوسته

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

مداوم

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

گرفتار در گوشه یک شیء نقشه

بسته به برنامه و مکان، برخی گرفتار می شوند و برخی نیستند و علت تغییر زیادی نکرده است. به هر حال، این اتفاق با گوشه های زاویه ای مانند Box Collider 2D رخ می دهد و نه با دایره های گرد.

حتی اگر چنین پدیده مرموزی رخ دهد، خوب است که گوشه های گرد برخورد دهنده را برای جلوگیری از موانع داشته باشیم. این محدود به Box Collider 2D است، اما برای گرد کردن ان، جزء Box Collider 2D شیء شخصیت دارای "شعاع لبه" است و شما یک مقدار را در انجا قرار می دهید. اگر 1 را به عنوان یک واحد عددی وارد کنید، گرد کردن برای اندازه جسم رخ خواهد داد. این بستگی به اندازه دارد، اما خوب است که حدود 0.1 قرار دهید.

به هر حال، قضاوت ضربه تنها با اندازه گرد بودن افزایش می یابد، بنابراین لطفا ان را تنظیم کنید اگر بزرگ است. Box Collider 2D دارای یک دکمه Edit Collider است که به شما اجازه می دهد با کلیک بر روی دکمه، اندازه ان را مستقیما در نمای نمایش تغییر دهید. از انجا که خط سبز بیرونی تشخیص ضربه واقعی است، اندازه را طوری تنظیم کنید که غیر طبیعی نباشد.

پس از ان، بازی را اجرا کنید تا مطمئن شوید که خراشیده نمی شود و تنظیمات را انجام دهید.