STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

    Vector Trong Unity

    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.

    Rye Nguyen

    08/08/2015
    24/09/2020
    6 phút đọc
    Vector 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.
    0 Bình luận
    Lập Trình Game

    Lập Trình Game

    Kiến thức, kỹ thuật, kinh nghiệm lập trình game.

    Đề xuất

    Các Thành Phần Cơ Bản Trong Unity
    Các thành phần, component cơ bản trong Unity thường được sử dụng để phát ...
    01/08/2015
    STL - Vector Trong C++
    Hướng dẫn sử dụng STL vector container trong C++, các phương thức duyệt, ...

    Khám phá

    Kỹ Thuật Debug trong Unity
    Hướng dẫn các thao tác và kỹ thuật debug code trong Unity.
    Chuyển Đổi Scene Trong Unity
    Hướng dẫn cách để chuyển cảnh - đổi scene trong Unity.
    Ứng Dụng Của StartCoroutine Trong Unity
    Giới thiệu khái niệm Coroutine và hướng dẫn hiện thực Coroutine trong ...
    Âm Thanh Trong Unity
    Hướng dẫn cách phát âm thanh trong Unity.
    Cơ Bản về Camera trong Unity
    Giới thiệu các thông số của camera trong Unity và các thao tác thường sử ...
    Phân Biệt Awake và Start trong Unity
    Phân biệt phương thức Awake và phương thức Start trong Unity.
    Sử Dụng JsonUtility Trong Lập Trình Game Với Unity
    Hướng dẫn sử dụng đối tượng JsonUtility tổng hợp dữ liệu thành chuỗi ...
    Hiệu Ứng Camera Zoom Trong Unity
    Hướng dẫn hiện thực hiệu ứng Camera Zoom trong Unity
    Khi bạn nhấn vào liên kết sản phẩm do STDIO đề xuất và mua hàng, STDIO có thể nhận được hoa hồng. Điều này hỗ trợ STDIO tạo thêm nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020