Unity - Di chuyển một GameObject

Dong Ho · about 8 mins read

Di chuyển một GameObject dựa trên Input từ người dùng

void Update()
{
    // GetAxis: trả về giá trị tăng dần 0->1, luôn là 1 nếu không thả phím
    // GetAxisRaw: luôn luôn trả về -1 hoặc 1 khi bấm phím, 0 khi thả phím
    xAxis = Input.GetAxis("Horizontal"); // Left-Right hoặc A-D ~ [-,+]
    yAxis = Input.GetAxis("Vertical"); // Up-Down hoặc W-S ~ [+,-]

    #region Di chuyn mt GameObject sang TRÁI và PHI bng cách s dng phím A và D
    // [TRỤC X]: bàn tay trái => là hướng ngang (dang 2 tay), [+] đi về bên phải, [-] đi về bên trái

    // Tính toán tốc độ di chuyển
    xSpeed = 5 * Time.deltaTime; // không bao gồm giá trị của Axis (lực bấm / distance tay cầm)

    // Di chuyển GameObject sang trái
    if (xAxis < 0)
    {
        gameObject.transform.Translate(-xSpeed, 0, 0); // người dùng bấm 'A' -> đi về bên trái [-]
    }
    // Di chuyển GameObject sang phải
    if (xAxis > 0)
    {
        gameObject.transform.Translate(xSpeed, 0, 0); // người dùng bấm 'D' -> đi về bên phải [+]
    }
    #endregion

    #region Di chuyn mt GameObject LÊN và XUNG bng cách s dng phím W và S
    // [TRỤC Z]: bàn tay trái => là hướng người nhìn, + đi ra về phía trước, - đi về phía sau lưng

    // Tính toán tốc độ di chuyển
    ySpeed = 5 * Time.deltaTime; // không bao gồm giá trị của Axis (lực bấm / distance tay cầm)

    // Di chuyển GameObject lên
    if (yAxis < 0)
    {
        gameObject.transform.Translate(0, 0, -ySpeed); // người dùng bấm 'S' -> đi về phía sau lưng [-]
    }
    // Di chuyển GameObject xuống
    if (yAxis > 0)
    {
        gameObject.transform.Translate(0, 0, ySpeed); // người dùng bấm 'W' -> đi về phía trước [+]
    }
    #endregion

    // [TRỤC Y]: bàn tay trái => là phương thẳng đứng => không sử dụng

    #region CÁCH DI CHUYN PH THUC VÀO GIÁ TR Axis (tăng dn t 0->1 và luôn = 1 nếu gi phím)
    //gameObject.transform.Translate(xSpeed * xAxis, 0, 0); // <--- đoạn code này sử dụng cả dấu của Axis
    //gameObject.transform.Translate(0, 0, ySpeed * yAxis); // <--- đoạn code này sử dụng cả dấu của Axis
    #endregion

    #region KT LUN
    // 1. Không nhầm lẫn giữa Horizontal và Vertical của INPUT với X-Y-Z (quy tắc bàn tay trái)
    // 2. Sử dụng cả giá trị của Axis để có cảm giá thật hơn (có quán tính 0->1) và đã kèm dấu (+,-) trong giá trị rồi.
    // [TRỤC X]: bàn tay trái => là hướng ngang (dang 2 tay), [+] đi về bên phải, [-] đi về bên trái
    // [TRỤC Y]: bàn tay trái => là phương thẳng đứng, + lên trên, - xuống dưới
    // [TRỤC Z]: bàn tay trái => là hướng người nhìn, + đi ra về phía trước, - đi về phía sau lưng
    #endregion
}

Lấy Input

GetAxis: Phương thức này trả về giá trị của một trục điều khiển.

GetAxisRaw: Phương thức này trả về giá trị thô của một trục điều khiển.

GetKeyDown: Phương thức này trả về true nếu một phím được nhấn xuống.

GetKeyUp: Phương thức này trả về true nếu một phím được thả ra.

float xAxis = Input.GetAxis("Horizontal"); // -1<-0->+1
float xAxisRaw = Input.GetAxisRaw("Horizontal"); // -1/0/+1
bool isKeyDown = Input.GetKeyDown(KeyCode.A);
bool isKeyUp = Input.GetKeyUp(KeyCode.A);

Lấy Reference của một GameObject

Biến gameObject sẽ luôn trỏ đến GameObject đang được đính kèm Script hiện tại.

Hàm GetComponent có thể được sử dụng để lấy reference của một Component cụ thể từ một GameObject. VD: Rigidbody rb = GetComponent<Rigidbody>(); hoặc otherGameObject.GetComponent<Rigidbody>();

Khai báo một biến GameObject public và kéo thả GameObject vào Inspector.

Sử dụng hàm Find của GameObject. VD: GameObject player = GameObject.Find("MainHeroCharacter");

Sử dụng hàm FindWithTag của GameObject. VD: GameObject chef = GameObject.FindWithTag("Chef");

Sử dụng hàm FindGameObjectsWithTag của GameObject. VD: GameObject[] stoves = GameObject.FindGameObjectsWithTag("Stove");

Ngoài ra, bạn cũng có thể sử dụng các phương thức sau để lấy reference của GameObject:

  • player.GetComponentInChildren: Lấy reference của một thành phần từ một GameObject hoặc một GameObject con của nó.
  • player.GetComponentInParent: Lấy reference của một thành phần từ một GameObject cha của nó.
  • GameObject.FindObjectOfType: Tìm kiếm một GameObject có loại cụ thể trong Scene.

Di chuyển bằng Transform

Translate: Phương thức này di chuyển GameObject theo một vector.

Rotate: Phương thức này xoay GameObject theo một góc.

// Di chuyển một GameObject sang bên phải
gameObject.Translate(1, 0, 0); // X-Y-Z của 'Translate' tùy theo quy tắc bàn tay trái

// Xoay một GameObject theo chiều kim đồng hồ
gameObject.transform.Rotate(new Vector3(0, 0, 1)); // X-Y-Z của 'Vector3' tùy theo quy tắc bàn tay trái

Di chuyển GameObject theo phản ứng lực và mô-men xoắn.

AddForce: Phương thức này thêm một lực vào GameObject.

AddTorque: Phương thức này thêm một mô-men xoắn vào GameObject.

// Thêm một lực 'AddForce' vào GameObject
rigidbody = gameObject.GetComponent<Rigidbody>();
rigidbody.AddForce(xAxis * 1500 * Time.deltaTime * new Vector3(0, 0, 1)); // X-Y-Z của 'Vector3' theo QT BTT
rigidbody.AddForce(0, 0, xAxis * speed * Time.deltaTime); // có +3 overloads của 'AddForce', bản chất là sử dụng 'Vector3'
// Thêm một gia tốc liên tục vào vật rắn, bỏ qua khối lượng của nó. Sử dụng 
rigidbody.AddForce(0, 0, xAxis * speed * Time.deltaTime, ForceMode.Acceleration); // Sử dụng ForceMode để chỉ định cách áp dụng lực

// Cách dùng giống 'AddForce', thêm một mô-men xoắn 'AddTorque' vào GameObject
rigidbody.AddTorque(xAxis * 1500 * Time.deltaTime * new Vector3(0, 0, 1)); // X-Y-Z của 'Vector3' theo QT BTT

xSpeed = xAxis * speed * Time.deltaTime;
zSpeed = yAxis * speed * Time.deltaTime;
ySpeed = jumpAxis * speed * Time.deltaTime;
rigidbody.AddForce(xSpeed, ySpeed, zSpeed); // X-Y-Z của 'Vector3' theo QT BTT
Outline

history cached

play_arrow arrow_right_alt

update skip_next

create close

settings arrow_downward

×

Memo

...
×

Under Maintenance