Vector3 là một struct
Thuộc phần Những kiến thức cơ bản về lập trình trong Unity trong hành trình Unity của Coddy. Bài học 29 trên 85.
Vector3 là một struct, một kiểu dữ liệu bạn chưa gặp. Struct là một giá trị như int: khi gán, toàn bộ giá trị sẽ được sao chép. Sau câu lệnh Vector3 b = a; b.x = 9;, a.x không thay đổi vì b là một bản sao riêng. (Lớp hoạt động theo cách ngược lại: hai biến có thể tham chiếu đến cùng một đối tượng.)
transform.position là một thuộc tính. Khi đọc thuộc tính này, bạn nhận được một bản sao của vị trí. Vì vậy, transform.position.x = 0; sẽ thay đổi một bản sao rồi bị loại bỏ ngay lập tức, và C# từ chối biên dịch câu lệnh này: error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. Cách khắc phục là sao chép vị trí, thay đổi bản sao rồi gán lại. Đoạn code này đưa nhân vật chạy về làn giữa khi bạn nhấn Space:
if (Input.GetKeyDown(KeyCode.Space))
{
Vector3 p = transform.position; // Sao chép
p.x = 0; // Thay đổi bản sao
transform.position = p; // Gán lại
}Bỏ dòng cuối cùng thì code vẫn biên dịch, nhưng không có gì di chuyển: chỉ có bản sao thay đổi. transform.localScale và các thuộc tính Vector3 khác cũng hoạt động tương tự.
Thử thách
DễSửa script của xe trượt tuyết để script biên dịch được, giúp xe nằm trên sàn và không vượt ra ngoài hai bức tường.
- Thay hai dòng đặt
transform.position.yvà.xbằng một bản sao:Vector3 p = transform.position;. - Đặt
p.y = Mathf.Max(p.y, 0.5f);vàp.x = Mathf.Clamp(p.x, -4f, 4f);, sau đó đặttransform.position = p;.
Nhấn Chơi: xe trượt tuyết đáp xuống sàn và hai bức tường giữ xe lại. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class Sled : MonoBehaviour
{
public float speed = 4f;
public float fall = 3f;
void Update()
{
float h = Input.GetAxisRaw("Horizontal");
transform.position += new Vector3(h * speed, -fall, 0) * Time.deltaTime;
// Giữ xe trượt trên sàn và ở giữa hai bức tường.
transform.position.y = Mathf.Max(transform.position.y, 0.5f);
transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
}
}
Tất cả bài học trong Những kiến thức cơ bản về lập trình trong Unity
1C# cơ bản trong Unity
Xin chào, UnityBiếnSố thập phân cần có fVăn bản trong ConsoleBiến có thể ghi nhớIf và elseSo sánh các sốÔn tập: Thu thập xu7Vòng lặp và phương thức
Lặp lại với forVòng lặp lồng nhauViết phương thứcPhương thức trả lờiMảngÔn tập: Cầu thang2Làm cho nó chuyển động
Đặt khối lập phươngDi chuyển theo từng khung hìnhXoay mỗi giâyĐiều khiển bằng các phímÔn tập: Lái khối lập phương5Vectơ
Cộng vectơPhương hướngKhông gian cục bộ và không gian thế giớiTốc độ theo đường chéoKhoảng cách giữa các vậtVector3 là một structÔn tập: Người điều khiển drone8GameObject và thành phần
Tham chiếu trong InspectorLấy một thành phầnThành phần bị thiếuThêm một thành phầnRequireComponentHiện và ẩnÔn tập: Công tắc đèn3Inspector
Các trường trong InspectorSerializeFieldSố thực và MathfThuộc tính trong InspectorÔn tập: thang máy6Biến đổi và hệ phân cấp
Đối tượng cha và conKéo cờ lênTỷ lệNhìn vào các vật thểDi chuyển đến một điểmÔn tập: Mặt trăng quay quanh9Dự án: Bắt lấy ngôi sao
Người bắt saoNgôi sao rơiTự luyện tập: Playground Unity