Thực hiện phát hiện lượt truy cập với tilemaps

Trang Cập Nhật :
Ngày tạo trang :

Môi trường xác minh

Windows
  • cửa sổ 11
Biên tập viên Unity
  • 2021.3.3F1
Gói hệ thống đầu vào
  • 1.3.0

Điều kiện tiên quyết cho mẹo này

Các cài đặt sau đây đã được thực hiện trước làm tiền đề cho mô tả về mẹo này.

Điều kiện tiên quyết cho mẹo này là gì?

Về việc mượn tài liệu bản đồ

Chúng tôi xử lý mượn từ các trang web sau.

Thực hiện các nhân vật đi bộ

Đầu tiên, thực hiện một bản đồ và một nhân vật thực hiện phát hiện hit. Ký tự này có thể được di chuyển bằng các phím con trỏ trên bàn phím. Tuy nhiên, nếu bạn thực hiện một cuộc đi bộ thích hợp, nó sẽ dài và xa bản chất của các mẹo sách, vì vậy lần này tôi sẽ chỉ di chuyển một bức tranh đơn giản.

Nếu bạn muốn triển khai hoạt ảnh đi bộ, hãy xem các mẹo sau:

Sau khi bạn tạo dự án, hãy thêm hình ảnh sprite của đối tượng bạn muốn di chuyển vào dự án.

Chọn hình ảnh và đặt Pixels Per Unit thành 32 từ Trình kiểm tra. Điều này là do kích thước của một hình vuông của mapchip là 32 pixel, vì vậy nó phù hợp với điều đó. Sau khi định cấu hình, hãy nhấp vào nút "Áp dụng" bên dưới.

Đặt sprite trong chế độ xem.

Tạo một kịch bản để di chuyển sprite. Điều này tương tự như các mẹo sau:

Để tên tập lệnh Player là .

Mã số như sau:

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);
    }
  }
}

Gắn vào sprite bạn muốn di chuyển.

Chạy trò chơi và kiểm tra xem bạn có muốn di chuyển nó bằng bàn phím không.

Chuẩn bị MapTips

Trước hết, chúng tôi sẽ chuẩn bị một mapchip và tạo ra một bản đồ. Thủ tục này tương tự như các mẹo sau: MapTips với 2D Tilemap Extras cũng có khả năng phát hiện va chạm, nhưng chúng sẽ không được sử dụng trong bài viết này vì thủ tục sẽ dài.

Chuẩn bị hình ảnh gốc của MapTip và thêm nó vào dự án của bạn. Để làm cho thao tác dễ hiểu hơn, vui lòng chuẩn bị "địa điểm có thể đi bộ" và "nơi không thể đi bộ" cho tài liệu chip bản đồ.

Thiết lập nó cho MapChips trong Inspector và nhấp vào nút Apply. Sau khi được định cấu hình, hãy mở Sprite Editor.

Đó là một maptip 32 pixel, vì vậy tôi sẽ chia nó thành 32.

Chọn tab Bảng ô. Nếu không, hãy hiển thị nó với "Window > 2D -> Tile Palette" từ menu. Tạo một bảng màu mới. Tên là tùy ý, nhưng bây giờ chúng tôi sẽ gọi nó là "MapChipPalette".

Tạo một thư mục MapChipPalette trong Scenes và chỉ định nó.

Thêm một maptip bằng cách kéo nó vào bảng màu. Lưu nó trong thư mục MapChipPalette bạn đã tạo trước đó.

Tạo bản đồ

Lần này, phán đoán đánh bản đồ sẽ được thực hiện theo đơn vị của "Tilemap". Do đó, chúng tôi sẽ tạo hai Tilemaps, "Tilemap without hit detection" và "Tilemap with hit detection".

Đầu tiên, tạo hai Tilemap trong hệ thống phân cấp. Bạn có thể tạo hai trong Lưới. Các tên là "TilemapObeject" và "TilemapGround" cho rõ ràng.

Đầu tiên, tạo một "TilemapGround". Vì nó là một phạm vi di chuyển, bạn chỉ cần đặt mặt đất. Nếu nó ở trên mặt đất, bạn có thể thay đổi mô hình.

Nhân tiện, nếu ký tự bị ẩn, hãy chọn đối tượng ký tự và đặt thứ tự lớp của Sprite Renderer trình kiểm tra thành 2. Thứ tự của các lớp là 0 theo mặc định và Tilemap là 0, vì vậy nếu bạn tăng nó trên giá trị này, nó sẽ được hiển thị ở nền trước.

Sau đó chọn TilemapObject và đặt maptip bạn muốn làm bất động. Đặt thứ tự lớp thành 1 trước. Điều này là để làm cho nó xuất hiện trước mặt đất.

Đây là những gì nó trông giống như nếu bạn che giấu mặt đất.

Tất nhiên, tại thời điểm này, không có cài đặt nào liên quan đến phát hiện va chạm, vì vậy bạn có thể đi trên mặt đất cao bình thường. Sau này, chúng tôi sẽ thiết lập phát hiện va chạm.

Cài đặt phát hiện va chạm

Đầu tiên, hãy thiết lập nhân vật. Cài đặt này gần giống như các mẹo bên dưới, vì vậy tôi sẽ bỏ qua các chi tiết và giải thích ngắn gọn quy trình.

Chọn một đối tượng ký tự từ hệ thống phân cấp và chọn Vật lý 2D -> Circle Collider 2D từ Thêm thành phần. Nếu hình dạng của vật thể là hình chữ nhật, "Box Collider 2D" là tốt.

Tương tự, thêm "Vật lý 2D -> Rigidbody 2D".

Đặt thang trọng lực thành 0 để tránh Rigidbody 2D rơi tự động.

Kiểm tra Z trong Ràng buộc để ngăn sprite quay khi va chạm.

Tiếp theo, chọn "TilemapObject" bạn muốn nhấn và chọn "Tilemap -> Tilemap Collider 2D" từ "Add Component".

Đó là tất cả những gì cần có. Bạn thậm chí không cần bất kỳ chương trình nào. Chạy trò chơi và cố gắng đánh vào vật thể trở thành bức tường. Tôi nghĩ bạn có thể chắc chắn rằng nó dừng lại đúng cách.

Tuy nhiên, khi bạn thực sự đánh nó, tôi nghĩ rằng sẽ có những điểm đáng lo ngại trong hành vi. Dưới đây là một số giải pháp:

Hành vi bất tiện của việc phát hiện hit với bản đồ và giải pháp

Khi bạn va vào tường, bạn có thể tìm thấy một vài điều làm phiền bạn.

Nếu bạn di chuyển dựa vào tường, bạn sẽ bị kẹt ở giữa

Box Collider 2D Tôi nghĩ rằng nó sẽ xảy ra nếu bạn đang sử dụng một đối tượng.

Ví dụ, từ cảnh bên dưới, khi bạn nhấn phím ở phía dưới bên trái, bạn muốn nó di chuyển sang trái dọc theo bức tường. Tuy nhiên, sau một số tiến bộ, tôi nghĩ rằng nó sẽ bị mắc kẹt trong một cái gì đó và dừng lại.

Nhận biết vết lõm trên tường theo vị trí

Circle Collider 2D Tôi nghĩ rằng nó là dễ hiểu nếu bạn đính kèm . Bức tường phải bằng phẳng, nhưng nếu bạn di chuyển nó vào tường, bạn sẽ thấy rằng bức tường di chuyển như thể nó không bằng phẳng.

Nguyên nhân và giải pháp cho snags và va đập

Lý do tại sao những điều này xảy ra dường như là "xác định lượt truy cập được thực hiện trên cơ sở mapchip". Trên thực tế, khi bạn chọn TilemapObject, một đường màu xanh lá cây xuất hiện tại nơi đặt phát hiện lần truy cập và bạn có thể thấy rằng đây là một đường được vẽ trong các đơn vị MapTip.

Vì vậy, nếu đối tượng chuyển động nằm trên một đường tương đương với chính xác một chip bản đồ, nó sẽ được đánh giá là một cú đánh với một chip bản đồ. Nếu bạn va chạm ở ranh giới của chip bản đồ, hai chip bản đồ sẽ bị đánh và phán đoán, do đó sức mạnh của độ nảy sẽ tăng lên.

Tôi nghĩ cách tốt nhất để giải quyết vấn đề này là kết hợp phát hiện hit với các mapchip đính kèm. Dưới đây là cách thực hiện:

ChọnTilemap Collider 2D "TilemapObject" với tính năng phát hiện lượt truy cập từ trình kiểm tra và kiểm tra "Sử dụng trong tổng hợp" từ .

Như đã nêu trong cảnh báo, điều này một mình không có tác dụng, vì vậy hãy chọn "Vật lý 2D -> Máy va chạm tổng hợp 2D" từ "Thêm thành phần".

Rigidbody 2D được thêm vào cùng với Composite Collider 2D.

Có một chút khó hiểu, nhưng tôi nghĩ bạn có thể xác nhận rằng đường màu xanh lá cây ở ranh giới giữa các mapchip với phát hiện hit đã biến mất.

Tôi không muốn tilemap di chuyển, vì vậy tôi sẽ Rigidbody 2D để kiểu body thành phần là "tĩnh".

Bây giờ hãy chạy trò chơi và cố gắng làm cho nó di chuyển. Tôi nghĩ rằng ngay cả khi bạn di chuyển theo đường chéo dọc theo bức tường, nó sẽ không bị bắt và bạn có thể di chuyển trơn tru mà không cần chuyển động gập ghềnh.

Loại bỏ nhân vật bị đẩy lùi khỏi tường

Bạn có thể thấy rằng nếu bạn di chuyển nhân vật để đẩy bức tường và sau đó ngừng di chuyển, nó sẽ hoạt động giống như bị dội lại từ tường.

Để giải quyết vấn đề này,Rigidbody 2D hãy chọn đối tượng ký tự và thay đổi "Phát hiện va chạm" thành "Liên tục" từ thành phần.

Sự khác biệt giữa "không liên tục" và "liên tục" như sau.

Không liên tục

Phát hiện va chạm là một cơ chế suy nghĩ sau khi di chuyển. Nó là một hình thức thực hiện phát hiện va chạm từ trạng thái nơi nó được di chuyển và nhúng vào tường. Thật dễ hiểu nếu bạn liên kết nó với tấm bạt lò xo và cao su, nhưng nó càng được nhúng, lực đẩy sẽ càng tăng và độ nảy sẽ mạnh hơn. Thay vào đó, việc tính toán được thực hiện sau khi di chuyển, do đó chi phí xử lý thấp.

Liên tục

Nó được xử lý trong khi xác định những gì đang trên đường. Xác định xem có một bức tường giữa vị trí trước và sau khi di chuyển, Nếu có một bức tường, nó sẽ đánh giá vụ va chạm ở đó và dừng lại, vì vậy thực tế không có lực đẩy. Thay vào đó, chi phí xử lý tăng lên một chút vì tính toán được bao gồm ở giữa chuyển động.

Bị bắt ở góc của một đối tượng bản đồ

Tùy thuộc vào chương trình và địa điểm, một số bị bắt và một số thì không, và nguyên nhân không thay đổi nhiều. Nhân tiện, nó xảy ra với các góc góc như Box Collider 2D chứ không phải với các vòng tròn tròn.

Ngay cả khi một hiện tượng bí ẩn như vậy xảy ra, thật tốt khi có các góc tròn của máy va chạm để tránh snags. Nó được giới hạn trong Box Collider 2D, nhưng để làm cho nó tròn, thành phần Box Collider 2D của đối tượng nhân vật có "bán kính cạnh" và bạn đặt một giá trị ở đó. Nếu bạn nhập 1 làm đơn vị số, việc làm tròn sẽ xảy ra cho kích thước đối tượng. Nó phụ thuộc vào kích thước, nhưng tốt nhất là đặt khoảng 0,1.

Nhân tiện, phán đoán đánh chỉ tăng theo kích thước của độ tròn, vì vậy vui lòng điều chỉnh nó nếu nó lớn. Box Collider 2D có nút Collider Edit cho phép bạn thay đổi kích thước trực tiếp trong chế độ xem bằng cách nhấp vào nút. Vì đường màu xanh lá cây bên ngoài là phát hiện cú đánh thực tế, hãy đặt kích thước sao cho nó không phải là không tự nhiên.

Sau đó, chạy trò chơi để đảm bảo nó không bị trầy xước và thực hiện các điều chỉnh.