Hướng dẫn nhảy tường 3D và 2D của người chơi cho Unity

Nhảy tường, một cơ chế phổ biến trong các trò chơi xếp hình và hành động, cho phép người chơi nhảy khỏi tường, tăng thêm độ phức tạp và tính linh hoạt cho việc điều hướng. Hướng dẫn này nhằm mục đích tích hợp tính năng nhảy tường vào Bộ điều khiển FPS được cung cấp. Cuối cùng, nhân vật của người chơi sẽ có thể thực hiện nhảy tường ở cả cài đặt 2D và 3D.

Triển khai Wall Jump cho 3D bằng tập lệnh 'SC_FPSController'

Bắt đầu với mã cơ sở nhất định từ hướng dẫn Unity FPS Controller, chúng tôi sẽ giới thiệu cơ chế nhảy tường.

Bước 1: Thiết lập phát hiện tường

  • Thêm một lớp mới trong Unity có tên "Wall" cho các đối tượng có thể nhảy từ trên tường xuống.
  • Cập nhật lớp 'SC_FPSController' mà bạn có thể lấy từ hướng dẫn Unity FPS Controller của chúng tôi, với các biến sau:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

Bước 2: Phát hiện bức tường

  • Kết hợp logic sau vào phương thức 'Update()' để phát hiện bức tường:
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.right, out hit, 1f, wallLayer) || Physics.Raycast(transform.position, -transform.right, out hit, 1f, wallLayer))
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

Raycast này trong đoạn mã trên sẽ phát hiện các bức tường ở bên trái và bên phải của người chơi.

Bước 3: Thực hiện Nhảy tường cho 3D

  • Trong phương thức 'Update()', sau logic nhảy xuống đất, hãy chèn:
else if (Input.GetButton("Jump") && canMove && isTouchingWall)
{
    moveDirection.y = wallJumpForce;

    // This adds a bit of horizontal force opposite the wall for a more dynamic jump
    if (Physics.Raycast(transform.position, transform.right, 1f, wallLayer))
    {
        moveDirection += -transform.right * wallJumpForce / 2.5f; // Adjust the divisor for stronger/weaker push.
    }
    else if (Physics.Raycast(transform.position, -transform.right, 1f, wallLayer))
    {
        moveDirection += transform.right * wallJumpForce / 2.5f;
    }
}

Logic này trong đoạn mã trên sẽ kiểm tra xem người chơi có đang nhấn nút nhảy, có thể di chuyển và chạm vào tường hay không. Nếu vậy, nó sẽ truyền một lực thẳng đứng và một lực ngang nhỏ ra xa tường.

Triển khai Wall Jump cho 2D bằng tập lệnh 'CharacterController2D'

Bắt đầu với mã cơ sở đã cho từ Bộ điều khiển ký tự 2D cho hướng dẫn Unity, chúng tôi sẽ giới thiệu cơ chế wall jump.

Bước 1: Thiết lập phát hiện tường

  • Thêm một lớp mới trong Unity có tên "Wall" cho các đối tượng có thể nhảy từ trên tường xuống.
  • Cập nhật lớp 'CharacterController2D' mà bạn có thể lấy từ 2D Character Controller cho hướng dẫn Unity của chúng tôi, với các biến sau:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

Bước 2: Phát hiện bức tường ở dạng 2D

  • Kết hợp logic sau vào phương thức 'Update()' để phát hiện bức tường:
RaycastHit2D wallHitLeft = Physics2D.Raycast(transform.position, Vector2.left, 1f, wallLayer);
RaycastHit2D wallHitRight = Physics2D.Raycast(transform.position, Vector2.right, 1f, wallLayer);

if (wallHitLeft.collider != null || wallHitRight.collider != null)
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

Bước 3: Thực hiện Nhảy tường cho 2D

  • Trong phương thức 'Update()', sau logic nhảy xuống đất, hãy chèn:
if (Input.GetKeyDown(KeyCode.W) && isTouchingWall && !isGrounded)
{
    r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight);
    if (wallHitLeft.collider != null)
    {
        r2d.AddForce(new Vector2(wallJumpForce, 0)); // Push to the right when wall is on the left
    }
    else if (wallHitRight.collider != null)
    {
        r2d.AddForce(new Vector2(-wallJumpForce, 0)); // Push to the left when wall is on the right
    }
}

Câu hỏi được giải quyết:

  1. Làm cách nào để nhân vật có thể phát hiện bức tường trong Unity?: Một nhân vật có thể phát hiện bức tường bằng cách sử dụng raycasting. Bằng cách bắn một tia vô hình từ người chơi theo hướng mong muốn, người ta có thể xác định xem một vật thể, chẳng hạn như bức tường, có giao nhau với tia này hay không.
  2. Sự khác biệt giữa việc triển khai nhảy tường 2D và 3D trong Unity?: Trong Unity, vật lý 2D sử dụng các phương thức 'Physics2D' (như 'Physics2D.Raycast()'), trong khi vật lý 3D sử dụng các phương thức 'Physics' (như 'Physics.Raycast()'). Logic vẫn tương đối giống nhau, nhưng phương pháp và hướng dẫn (Vector2 cho 2D, Vector3 cho 3D) khác nhau.

Phần kết luận

Sự bổ sung này cho phép nhân vật trong không gian 2D có thể nhảy ra khỏi tường. Việc thử nghiệm các giá trị lực có thể cần thiết để đảm bảo lối chơi mượt mà. Bằng cách tích hợp các bước này, người chơi sẽ thấy chuyển động của nhân vật 2D linh hoạt và năng động hơn trong môi trường có tường.

Bài viết được đề xuất
Hướng dẫn sử dụng đèn pin cho Unity
Tạo chuyển động của người chơi trong Unity
Hướng dẫn sử dụng bộ điều khiển Worm 3D cho Unity
Hướng dẫn điều khiển trình phát từ trên xuống cho Unity
Bộ điều khiển trình phát RTS và MOBA cho Unity
Thêm hỗ trợ nhảy đôi vào bộ điều khiển nhân vật nền tảng 2D trong Unity
Triển khai hệ thống Parkour trong Unity