Search…

Vector Trong Unity

24/09/20206 min read
Giới thiệu và hướng dẫn sử dụng các đối tượng cơ bản thuộc lớp Vector3 trong Unity.

Trong môi trường game 3D, 1 vị trí hay vector được biểu diễn bằng 3 con số, đại diện cho 3 chiều không gian tương ứng. Trong Unity, lớp Vector3 được sử dụng để biểu diễn điểm hoặc vector 3 chiều. Ngoài ra Unity còn tích hợp 1 số hàm và thuộc tính hữu ích hỗ trợ lập trình viên.

Các vector đơn vị

Trong 1 số trường hợp cần sử dụng 1 Vector3 (0, 0, 0) làm giá trị ban đầu cho 1 đối tượng.

Tương tự khi cần thay đổi trên 1 trục của đối tượng, sử dụng Vector3(x, 0, 0) hoặc các Vector3 tương tự.

Đáp ứng nhu cầu sử dụng thường xuyên của lập trình viên, Unity đã hỗ trợ sẵn các vector đơn vị với tên gọi dễ nhớ để thuận tiện trong các thao tác. Danh sách các vector đơn vị như sau:

Tên thuộc tính Chức năng
zero Đại diện cho Vector3(0, 0, 0).
one Đại diện cho Vector3(1, 1, 1).
left Đại diện cho Vector3(-1, 0, 0).
right Đại diện cho Vector3(1, 0, 0).
up Đại diện cho Vector3(0, 1, 0).
down Đại diện cho Vector3(0, -1, 0).
back Đại diện cho Vector3(0, 0, -1).
forward Đại diện cho Vector3(0, 0, 1).

Dưới đây là vài ví dụ thực tế khi sử dụng các vector đơn vị:

// Set default position
transform.position = Vector3.zero;

// Translate object through z-axis
transform.Translate(Vector3.forward * Time.deltaTime);

Các thuộc tính cơ bản

Đối với Vector3, việc thay đổi từng thành phần bên trong là hoàn toàn được. Có thể truy xuất các thành phần bằng thuộc tính x, y, z tương ứng hoặc sử dụng mảng this đều được chấp nhận.

Đối với mảng this, các chỉ số [0], [1], [2] sẽ tương ứng với các thành phần x, y, z.

Vector3 stdioLogoPosition = Vector3.zero;

stdioLogoPosition.x += 10;
stdioLogoPosition[2] += 5; // z-axis

Tính toán độ dài

Thuộc tính normalize hỗ trợ chuyển đổi vector thành vector đơn vị với độ dài là 1, tức là chỉ quan tâm đến chiều của vector. Vector ban đầu sẽ được giữ lại giá trị cũ và thuộc tính sẽ trả về 1 vector mới. Để chuẩn hoá vector hiện tại, vui lòng xem phần hướng dẫn bên dưới.

Lưu ý: đối với vector có độ dài quá nhỏ, Vector3.zero sẽ được trả về thay vì vector cần tìm.

  • magnitude: trả về độ dài của vector, tính bằng công thức  √(x2 + y2 + z2).
  • sqrMagnitude: trả về giá trị bình phương của magnitude.

magnitudesqrMagnitude thường được sử dụng để:

  • Xác định vận tốc ban đầu cho 1 số đối tượng
  • Tính toán để 2 đối tượng không thể tách rời nhau, ...

Tuỳ vào tình huống cụ thể mà sử dụng cho phù hợp. Khi chỉ cần so sánh giữa hai vector, nên sử dụng sqrMagnitude vì chi phí tính toán căn bậc hai là tương đối cao.

Dưới đây là 1 số ví dụ thực tế:

// Make gameObject to default position when near
if ((transform.position - position).magnitude <= 0.1f)
    transform.position = position;

// Destroy gameObject when it not moving anymore
if(gameObject.GetComponent<Rigidbody2D>().velocity.magnitude < 0.1f)
    Destroy(gameObject);

Các hàm hỗ trợ

Max - Min

Nguyên mẫu của hàm:

public static Vector3 Max(Vector3 lhs, Vector3 rhs);
public static Vector3 Min(Vector3 lhs, Vector3 rhs);

Hàm Max sẽ so sánh từng thành phần của hai vector và trả về 1 vector mới với các thành phần là lớn nhất giữa hai vector đó.

Hàm Min cũng có chức năng tương tự hàm Max. Xem ví dụ sau đây để hiểu về tính năng của 2 hàm trên:

public Vector3 a = new Vector3(1, 2, 3);
public Vector3 b = new Vector3(4, 3, 2);
public Vector3 c = new Vector3(0, 5, 1);

void StdioTutorial()
{
	Debug.Log(Vector3.Max(a, b));
	Debug.Log(Vector3.Min(a, c));
	Debug.Log(Vector3.Min(a, Vector3.Max(b, c))); //Min(a, Vector3(4, 5, 2)
}

Giá trị trả về tương ứng tại cửa sổ Console như sau:

ss_2

MoveTowards - RotateTowards

2 hàm có chức năng di chuyển 1 vector đến vị trí khác trong không gian.

public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta);
public static Vector3 RotateTowards(Vector3 current, Vector3 target, float maxRadiansDelta, float maxMagnitudeDelta);
  • MoveTowards, sau mỗi vòng lặp đối tượng sẽ di chuyển tuyến tính về target với khoảng cách tối đa được quy định trước. Nếu vị trí hiện tại gần đích hơn là khoảng cách tối đa, hàm sẽ trả về giá trị là target và kết thúc di chuyển. 
  • RotateTowards sẽ quay 1 vector trong không gian đến vị trí target với góc quay tối đa là maxRadianDelta.

Lưu ý: Nếu như maxDistanceDeltamaxRadianDelta nhận giá trị âm, vector ban đầu sẽ dần dần di chuyển xa khỏi target. Khi 2 vector hoàn toàn ngược nhau cả về độ lớn, thì hàm sẽ dừng lại.

Lerp - Slerp

2 hàm có chức năng tương tự nhau, đều thực hiện nội suy giữa 2 vector và trả về 1 vector mới tương ứng với thành phần S trong hàm.

public static Vector3 Lerp(Vector3 from, Vector3 to, float t);
public static Vector3 Slerp(Vector3 from, Vector3 to, float t);
  • Với t = 0, hàm sẽ trả về vector from.
  • Với t = 1, hàm sẽ trả về vector to.
  • Với t thuộc khoảng (0, 1), hàm sẽ nội suy để tìm ra vị trí giữa fromto.

Sự khác nhau về kết quả thu được giữa 2 hàm là không nhiều, do đó không cần tìm hiểu sâu về sự khác nhau đó mà có thể sử dụng 2 hàm tương đương. 

Dot - Cross

  • Hàm Dot trả về tích vô hướng giữa 2 vector.
  • Hàm Cross trả về tích có hướng giữa 2 vector.

Các hàm khác

Hàm Chức năng
Angle Trả về góc đo giữa 2 vector tính bằng độ.
Distance Trả về khoảng cách giữa 2 vector.
Normalize Chuẩn hoá vector và gán lại giá trị. Vector sẽ mang giá trị mới sau khi sử dụng hàm Normalize.
Project Thực hiện chiếu 1 vector lên 1 vector khác. Tham số onNormal của hàm là hướng của vector mới.
Reflect Thực hiện phép phản xạ 1 vector lên 1 mặt phẳng chiếu.
Scale Thu phóng 1 vector với 1 vector khác. Từng thành phần của 2 vector sẽ được nhân với nhau tạo thành vector mới.

Operator

Ngoài các hàm và thuộc tính nói trên, Unity cũng cung cấp 1 số toán tử để thực hiện tính toán giữa các vector được dễ dàng hơn. Danh sách các toán tử được hỗ trợ như sau:

Toán tử Chức năng
operator+ Cộng 2 vector.
operator- Phép trừ giữa 2 vector.
operator* Nhân 1 vector với 1 số.
operator/ Chia 1 vector cho 1 số.
operator!= So sánh và trả về true nếu 2 vector khác nhau.
operator== So sánh và trả về true nếu 2 vector giống nhau.
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024