Chuyển động người chơi trong Unity bằng Rigidbody và Collider

Bạn mới dùng Unity? Muốn học cách tạo chuyển động của nhân vật quanh màn hình cho game? Vậy thì hướng dẫn dưới đây sẽ hữu ích với bạn.

Chuyển động của người chơi

Chuyển động của người chơi trong Unity: Thu thập đầu vào

Đầu tiên, bạn cần biết cách ghi lại các input từ người dùng và biến chúng thành chuyển động trong game. Làm việc này trong Unity khá dễ miễn là bạn biết nơi cần tới.

Input Manager

Với Unity đã mở, click Edit ở thanh công cụ phía trên cùng. Giờ chọn Project Settings. Từ danh sách bên tay trái, chọn Input Manager. Chọn Axes, điền các giá trị input vào danh sách. Bạn sẽ muốn nhìn vào HorizontalVertical cho chuyển động cơ bản.

Bạn sẽ dùng những trục này cùng với Input.GetAxisRaw(); cho chuyển động cơ bản ở phần tiếp theo.

Chuyển động người chơi trong Unity bằng Rigidbody và Collider

Giờ bạn đã biết tên của các trục, bạn có thể dùng chúng để kiểm soát chuyển động người chơi.

Trong trình xem Hierarchy của dự án, click chuột phải & chọn 3D Object > Capsule để làm cho chuyển động. Đảm bảo sử dụng chiến thuật tương tự để tạo Plane trên mặt đất cho Capsule đứng lên.

Đảm bảo reset giá trị Transform của cả hai đối tượng, và di chuyển Capsule để nó đứng trên Plane. Đổi lại tên Capsule, chẳng hạn như Player để dễ dàng nhận diện.

Click đối tượng Player và ở trình xem Inspector, cuộn xuống dưới Add Component. Thêm Rigidbody, sau đó thêm thành phần khác làm Capsule Collider. Bạn sẽ cần những thành phần này để thêm yếu tố vật lý, và chuyển động vào Player.

Sau đó, click chuột phải vào thư mục Scriptes và Create một C# Script mới. Đặt tên cho tập lệnh này theo dòng "PlayerMovement". Nếu bạn dự định thêm nhiều kiểu chuyển động cho các loại nhân vật hoặc cách điều khiển khác nhau, bạn sẽ muốn tạo nhiều tập lệnh khác nhau cho từng kiểu chuyển động. Ở bài viết, chúng ta sẽ tập trung vào những vấn đề cơ bản và dùng một script.

Click đúp vào tập lệnh để mở nó. Bạn sẽ thấy một tập lệnh Unity mặc định:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PlayerMovement : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }
 
    // Update is called once per frame
    void Update()
    {
        
    }
}

Bạn có thể xóa using System.Collections; using System.Collections.Generic vì chúng không cần cho tập lệnh này.

Ngoài ra, hãy tập trung vào:

public class PlayerMovement : MonoBehaviour {

Bên trong dấu ngoặc nhọn mở, tạo biến public float tên speed hoặc tương tự. Biến speed là một hệ số kiểm soát tốc độ Player di chuyển sau một số chương trình khác. Hiện tại, hãy đặt tốc độ bằng khoảng 10f.

Bạn cũng cần cho phép UnityRigidbody thao tác trong tập lệnh này. Điều đó được thực hiện với từ khóa Rigidbody và một tên biến— ở đây chọn rb.

public class PlayerMovement : MonoBehaviour
{
    public float speed = 10f; //Controls velocity multiplier
    
   Rigidbody rb; //Tells script there is a rigidbody, we can use variable rb to reference it in further script

Đó là tất cả những gì bạn cần thêm trong phần này. Bây giờ, chuyển sang void Start(). Khi bắt đầu trò chơi, bạn cần đặt biến rb bằng với Rigidbody trên Player như sau:

void Start()
    {
        rb = GetComponent(); //rb equals the rigidbody on the player
    }

Bây giờ, hãy xem hàm void Update(). Đây là chức năng bạn cần dùng để liên tục lấy đầu vào từ bàn phím, bộ điều khiển, v.v. của người chơi.

void Update()
    {
        float xMove = Input.GetAxisRaw("Horizontal"); // d key changes value to 1, a key changes value to -1
        float zMove = Input.GetAxisRaw("Vertical"); // w key changes value to 1, s key changes value to -1
 
        rb.velocity = new Vector3(xMove, rb.velocity.y, zMove) * speed; // Creates velocity in direction of value equal to keypress (WASD). rb.velocity.y deals with falling + jumping by setting velocity to y.
 
 
    }

Đừng lo, nếu cảm thấy choáng ngợp khi nhảy code, giải thích chi tiết sau sẽ giúp bạn dễ hiểu hơn. Đầu tiên, tạo biến float với tên xMove, và đặt nó sang Input.GetAxisRaw("Horizontal");

Input.GetAxisRaw(); là cách Unity ghi lại các input của Player từ những Axes mà bạn tìm thấy trong Project Settings.

Tiếp theo, bạn sẽ đặt biến speed đã tạo vào trò chơi và hoàn thành phần cuối cùng của câu đố cho chuyển động người chơi trong Unity.

rb.velocity = new Vector3(xMove, rb.velocity.y, zMove) * speed; // Creates velocity in direction of value equal to keypress (WASD). rb.velocity.y deals with falling + jumping by setting velocity to y.

Quay lại chế độ Inspector cho đối tượng Player. Hãy nhìn vào Rigibody trong Info, bạn sẽ thấy giá trị Velocity. Đây là giá trị bạn đang nhắm tới với rb.velocity.

new Vector3(xMove, rb.velocity.y, zMove) * tốc độ, tạo một vector mới với các giá trị x, y và z được cung cấp, sau đó nhân giá trị của vectơ với speed.

Đảm bảo kéo tập lệnh PlayerMovement vào đối tượng Player trong Unity. Thế là xong!

Code hoàn thiện:

using UnityEngine;
 
public class PlayerMovement : MonoBehaviour
{
    public float speed = 10f; //Controls velocity multiplier
 
    Rigidbody rb; //Tells script there is a rigidbody, we can use variable rb to reference it in further script
 
 
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent(); //rb equals the rigidbody on the player
    }
 
 
    // Update is called once per frame
    void Update()
    {
        float xMove = Input.GetAxisRaw("Horizontal"); // d key changes value to 1, a key changes value to -1
        float zMove = Input.GetAxisRaw("Vertical"); // w key changes value to 1, s key changes value to -1
 
        rb.velocity = new Vector3(xMove, rb.velocity.y, zMove) * speed; // Creates velocity in direction of value equal to keypress (WASD). rb.velocity.y deals with falling + jumping by setting velocity to y.
 
 
    }
}
Chủ Nhật, 20/08/2023 13:46
31 👨 814
0 Bình luận
Sắp xếp theo