ใช้การตรวจจับ Hit ด้วย tilemaps

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมการตรวจสอบ

หน้าต่าง
  • หน้าต่าง 11
บรรณาธิการ Unity
  • ปี 2021.3.3f1
แพ็คเกจระบบอินพุต
  • 1.3.0

ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้

การตั้งค่าต่อไปนี้ได้ทําไว้ล่วงหน้าเพื่อเป็นหลักฐานสําหรับคําอธิบายของเคล็ดลับนี้

ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้คืออะไร?

เกี่ยวกับการยืมวัสดุแผนที่

เราดําเนินการยืมจากเว็บไซต์ต่อไปนี้

การใช้งานตัวละครเดิน

ขั้นแรกให้ใช้แผนที่และตัวละครที่ทําการตรวจจับการตี อักขระนี้สามารถย้ายได้ด้วยปุ่มเคอร์เซอร์บนแป้นพิมพ์ อย่างไรก็ตามหากคุณใช้การเดินที่เหมาะสมมันจะยาวและห่างไกลจากสาระสําคัญของเคล็ดลับหนังสือดังนั้นคราวนี้ฉันจะย้ายภาพเดียวที่เรียบง่ายเท่านั้น

หากคุณต้องการใช้ภาพเคลื่อนไหวการเดินโปรดดูเคล็ดลับต่อไปนี้:

หลังจากที่คุณสร้างโครงการแล้ว ให้เพิ่มรูปสไปรท์ของวัตถุที่คุณต้องการย้ายไปยังโครงการ

เลือกภาพและตั้งค่าพิกเซลต่อหน่วยเป็น 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);
    }
  }
}

แนบกับสไปรท์ที่คุณต้องการย้าย

เรียกใช้เกมและตรวจสอบว่าคุณต้องการย้ายด้วยแป้นพิมพ์หรือไม่

การเตรียมเคล็ดลับแผนที่

ก่อนอื่นเราจะเตรียม mapchip และสร้างแผนที่ ขั้นตอนนี้คล้ายกับเคล็ดลับต่อไปนี้: MapTips กับ 2D Tilemap Extras ยังสามารถตรวจจับการชนกันได้ แต่จะไม่ใช้ในบทความนี้เนื่องจากขั้นตอนจะยาว

เตรียมภาพต้นฉบับของ MapTip และเพิ่มลงในโครงการของคุณ เพื่อให้เข้าใจง่ายขึ้นโปรดเตรียม "สถานที่ที่เดินได้" และ "สถานที่ที่เดินไม่ได้" สําหรับวัสดุชิปแผนที่

ตั้งค่าสําหรับ MapChips ในตัวตรวจสอบแล้วคลิกปุ่มใช้ เมื่อกําหนดค่าแล้วให้เปิดตัวแก้ไขสไปรท์

มันเป็น maptip 32 พิกเซลดังนั้นฉันจะแยกมันขึ้นที่ 32

เลือกแท็บ จานสีไทล์ หากไม่เป็นเช่นนั้น ให้แสดงด้วย "Window > 2D -> Tile Palette" จากเมนู สร้างจานสีใหม่ ชื่อนี้เป็นไปตามอําเภอใจ แต่ตอนนี้เราจะเรียกมันว่า "MapChipPalette"

สร้างโฟลเดอร์ MapChipPalette ในฉากและระบุ

เพิ่มคําแนะนําแผนที่โดยการลากไปยังจานสี บันทึกลงในโฟลเดอร์ 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" ก็ใช้ได้

ในทํานองเดียวกันให้เพิ่ม "Physics 2D -> Rigidbody 2D"

ตั้งค่าสเกลแรงโน้มถ่วงเป็น 0 เพื่อป้องกัน Rigidbody 2D การตกอัตโนมัติ

ตรวจสอบ Z ภายใต้ข้อ จํากัด เพื่อป้องกันไม่ให้สไปรท์หมุนเมื่อชนกัน

จากนั้นเลือก "TilemapObject" ที่คุณต้องการกดและเลือก "Tilemap -> Tilemap Collider 2D" จาก "Add Component"

นั่นคือทั้งหมดที่มีไป คุณไม่จําเป็นต้องมีการเขียนโปรแกรมใด ๆ เรียกใช้เกมและพยายามตีวัตถุที่กลายเป็นกําแพง ฉันคิดว่าคุณสามารถตรวจสอบให้แน่ใจว่ามันหยุดอย่างถูกต้อง

อย่างไรก็ตามเมื่อคุณตีมันจริงฉันคิดว่าจะมีประเด็นที่น่ากังวลในพฤติกรรม นี่คือวิธีแก้ปัญหาบางส่วน:

พฤติกรรมที่ไม่สะดวกในการตรวจจับการตีด้วยแผนที่และโซลูชัน

เมื่อคุณชนกําแพงคุณอาจพบบางสิ่งที่รบกวนคุณ

หากคุณเคลื่อนที่ไปชนกําแพง คุณจะถูกจับได้ตรงกลาง

Box Collider 2D ฉันคิดว่ามันจะเกิดขึ้นถ้าคุณใช้วัตถุ

ตัวอย่างเช่นจากฉากด้านล่างเมื่อคุณกดปุ่มที่ด้านล่างซ้ายคุณต้องการให้เลื่อนไปทางซ้ายตามผนัง อย่างไรก็ตามหลังจากความคืบหน้าบางอย่างฉันคิดว่ามันจะติดอยู่ในบางสิ่งและหยุด

จดจํารอยบุบในผนังตามตําแหน่ง

Circle Collider 2D ฉันคิดว่ามันเป็นเรื่องง่ายที่จะเข้าใจถ้าคุณแนบ ผนังควรแบน แต่ถ้าคุณเลื่อนไปติดกับผนังคุณจะเห็นว่าผนังเคลื่อนที่ราวกับว่ามันไม่สม่ําเสมอ

สาเหตุและแนวทางแก้ไขอุปสรรค์และการกระแทก

สาเหตุที่สิ่งเหล่านี้เกิดขึ้นน่าจะเป็น "การกําหนดการตีจะดําเนินการบนพื้นฐานของ mapchip" ในความเป็นจริงเมื่อคุณเลือก TilemapObject เส้นสีเขียวจะปรากฏขึ้นที่ตําแหน่งที่การตรวจจับการตีตั้งอยู่และคุณจะเห็นว่านี่คือเส้นที่วาดในหน่วย MapTip

ดังนั้นหากวัตถุที่เคลื่อนที่อยู่บนเส้นเทียบเท่ากับชิปแผนที่หนึ่งตัวมันจะถูกตัดสินว่าตีด้วยชิปแผนที่เดียว หากคุณชนกันที่ขอบเขตของชิปแผนที่ชิปแผนที่สองตัวจะถูกตีและตัดสินดังนั้นความแรงของการตีกลับจะเพิ่มขึ้น

ฉันคิดว่าวิธีที่ดีที่สุดในการแก้ปัญหานี้คือการรวมการตรวจจับการตีกับ mapchips ที่แนบมา นี่คือวิธีการ:

เลือกTilemap Collider 2D "TilemapObject" พร้อมการตรวจจับการตีจากตัวตรวจสอบและตรวจสอบ "ใช้ในคอมโพสิต" จาก .

ตามที่ระบุไว้ในคําเตือนเพียงอย่างเดียวนี้ไม่มีผลดังนั้นเลือก "Physics 2D -> Composite Collider 2D" จาก "Add Component"

เพิ่ม Rigidbody 2D พร้อมกับ Composite Collider 2D

มันสับสนเล็กน้อย แต่ฉันคิดว่าคุณสามารถยืนยันได้ว่าเส้นสีเขียวที่ขอบเขตระหว่าง mapchips ที่มีการตรวจจับการตีได้หายไป

ฉันไม่ต้องการให้ tilemap ย้ายดังนั้นฉันจะ Rigidbody 2D ออกจากประเภทร่างกายส่วนประกอบเป็น"คงที่"

ตอนนี้เรียกใช้เกมและพยายามทําให้มันเคลื่อนไหว ฉันคิดว่าแม้ว่าคุณจะเคลื่อนที่ในแนวทแยงมุมตามผนัง มันจะไม่ถูกจับและคุณสามารถเคลื่อนไหวได้อย่างราบรื่นโดยไม่มีการเคลื่อนไหวเป็นหลุมเป็นบ่อ

กําจัดการผลักตัวละครกลับจากผนัง

คุณจะเห็นได้ว่าถ้าคุณย้ายตัวละครเพื่อผลักกําแพงแล้วหยุดเคลื่อนไหวมันจะทําตัวเหมือนเด้งกลับจากกําแพง

ในการแก้ปัญหานี้Rigidbody 2D ให้เลือกวัตถุอักขระและเปลี่ยน "การตรวจจับการชนกัน" เป็น "ต่อเนื่อง" จากส่วนประกอบ

ความแตกต่างระหว่าง "ไม่ต่อเนื่อง" และ "ต่อเนื่อง" มีดังนี้

ไม่ต่อเนื่อง

การตรวจจับการชนเป็นกลไกที่คิดหลังจากเคลื่อนที่ เป็นรูปแบบที่ทําการตรวจจับการชนจากสถานะที่มันถูกเคลื่อนย้ายและฝังอยู่ในผนัง มันง่ายที่จะเข้าใจถ้าคุณเชื่อมโยงกับแทรมโพลีนและยาง แต่ยิ่งฝังตัวมากเท่าไหร่แรงก็จะยิ่งเพิ่มขึ้นและการตีกลับจะแข็งแกร่งขึ้น การคํานวณจะดําเนินการหลังจากย้ายดังนั้นต้นทุนการประมวลผลจึงต่ํา

ต่อเนื่อง

มันถูกประมวลผลในขณะที่กําหนดสิ่งที่กําลังจะมาถึง ตรวจสอบว่ามีกําแพงระหว่างตําแหน่งก่อนและหลังการย้ายหรือไม่ หากมีกําแพงมันจะตัดสินการชนที่นั่นและหยุดดังนั้นจึงไม่มีการผลักไส แต่ค่าใช้จ่ายในการประมวลผลเพิ่มขึ้นเล็กน้อยเนื่องจากการคํานวณรวมอยู่ในระหว่างการเคลื่อนไหว

ติดอยู่ที่มุมของวัตถุแผนที่

ขึ้นอยู่กับโปรแกรมและสถานที่บางคนถูกจับและบางคนไม่ได้และสาเหตุไม่ได้เปลี่ยนแปลงมากนัก อย่างไรก็ตามมันเกิดขึ้นกับมุมเชิงมุมเช่น Box Collider 2D ไม่ใช่กับวงกลมโค้งมน

แม้ว่าปรากฏการณ์ลึกลับดังกล่าวจะเกิดขึ้น แต่ก็เป็นการดีที่จะมีมุมโค้งมนของชนกันเพื่อหลีกเลี่ยงอุปสรรค์ จํากัดเฉพาะ Box Collider 2D แต่เพื่อให้กลมส่วนประกอบ Box Collider 2D ของวัตถุตัวละครมี "รัศมีขอบ" และคุณใส่ค่าไว้ที่นั่น ถ้าคุณป้อน 1 เป็นหน่วยตัวเลข การปัดเศษจะเกิดขึ้นสําหรับขนาดวัตถุ ขึ้นอยู่กับขนาด แต่เป็นการดีที่จะใส่ประมาณ 0.1

โดยวิธีการตัดสินตีเพิ่มขึ้นตามขนาดของความกลมเท่านั้นดังนั้นโปรดปรับถ้ามันมีขนาดใหญ่ Box Collider 2D มีปุ่ม Collider Edit ที่ให้คุณปรับขนาดได้โดยตรงในมุมมองโดยคลิกที่ปุ่ม เนื่องจากเส้นสีเขียวด้านนอกเป็นการตรวจจับการตีจริงให้กําหนดขนาดเพื่อไม่ให้ผิดธรรมชาติ

หลังจากนั้นให้เรียกใช้เกมเพื่อให้แน่ใจว่าจะไม่มีรอยขีดข่วนและทําการปรับเปลี่ยน