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ủamagnitude
.
magnitude
và sqrMagnitude
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](https://resources.stdio.vn/content/article/5ef629b0fc765a6e805ebc2f/resources/res-1600943582-1600943582665.png)
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ư maxDistanceDelta
và maxRadianDelta
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ề vectorfrom
. - Với
t = 1
, hàm sẽ trả về vectorto
. - Với
t
thuộc khoảng(0, 1)
, hàm sẽ nội suy để tìm ra vị trí giữafrom
vàto
.
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. |