Event Functions
Một script trong Unity không giống như ý tưởng viết một chương trình truyền thống, nghĩa là các đoạn code vẫn tiếp tục được chạy cho đến khi hết vòng lặp chẳng hạn. Thay vào đó, Unity kiểm soát các đoạn script không liên tục bằng việc gọi những function cụ thể được khai báo trong đó. Những function ...
Một script trong Unity không giống như ý tưởng viết một chương trình truyền thống, nghĩa là các đoạn code vẫn tiếp tục được chạy cho đến khi hết vòng lặp chẳng hạn. Thay vào đó, Unity kiểm soát các đoạn script không liên tục bằng việc gọi những function cụ thể được khai báo trong đó. Những function này gọi là Event Function, bởi vì nó được khởi tạo trong Unity từ việc phản hồi các sự kiện được diễn ra trong suốt gameplay. Unity sử dụng 1 naming scheme để định danh function gọi đến 1 event nhất định. Chẳng hạn, ta có thể thấy hàm Update (được gọi trước khi 1 frame thực hiện việc update) và hàm Start (chỉ được gọi trước khi frame của object được cập nhật lần đầu tiên). Ngoài ra còn nhiều Event Function khác có sẵn trong Unity, danh sách đầy đủ các function này ta có thể tham khảo trong Mono Behaviour Script Reference Page. Ta sẽ xem xét những event quan trọng và thường dùng sau đây.
Regular Update Event
Một game cũng phần nào giống một animation, vì một game có các animation frame được tạo ra một cách đều đặn. Có một khái niệm quan trọng trong lập trình game là sự thay đổi vị trí, trạng thái và biểu hiện của một object trong game cần phải được thực hiện trước khi mỗi frame được hiện lên. Hàm Update được gọi trước khi một frame được hiện lên và trước khi animation được thể hiện ra.
void Update() { float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal"); transform.Translate(Vector3.right * speed); }
Physics Engine cũng cập nhật với những giai đoạn không liên tục tương tự như việc cập nhật frame. Có 1 event function là Fixed Update được gọi trước khi 1 thành phần vật lý được update. Vì việc update của các thành phần vật lý và của frame diễn ra với tần suất khác nhau nên ta sẽ nhận được kết quả chính xác hơn từ physics code nếu ta đặt nó trong hàm FixedUpdate, hơn là việc đặt trong hàm Update.
void FixedUpdate() { Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical"); rigidbody.AddForce(force); }
Điều đó cũng có ích khi thỉnh thoảng ta có thể tạo ra thêm một số sự thay đổi tại 1 điểm sau khi hàm Update và hàm FixedUpdate được gọi cho tất cả các object trong game scene và sau khi tất cả các animation được thể hiện ra. Ví dụ, camera trong game scene nên được đặt sao cho có thể dõi theo đối tượng một cách liên tục. Sự điều chỉnh hướng của camera phải được thực hiện sau khi đối tượng di chuyển. Một ví dụ khác là mắt của nhân vật luôn phải hướng về đối tượng mà nó đang nhìn theo. Hàm LateUpdate có thể được dùng trong những trường hợp như này.
void LateUpdate() { Camera.main.transform.LookAt(target.transform); }
Initiazation Events
Ta thường gọi đoạn code khởi tạo 1 object trước bất kỳ 1 hàm Update nào được gọi trong gameplay. Hàm Start được gọi trước frame đầu tiên hay lần cập nhật thành phần vật lý đầu tiên. Hàm Awake được gọi cho mỗi một object trong scene tại thời điểm mà scene đang load. Cần chú ý rằng mặc dù có rất nhiều hàm Start và Awake của object được gọi theo thứ tự tùy ý, nhưng tất cả các hàm Awake sẽ kết thúc trước khi hàm Start đầu tiên được gọi. Điều đó có nghĩa là 1 hàm Start có thể lấy kết quả từ sự khởi tạo trong giai đoạn Awake.
GUI Events
Unity có 1 hệ thống cho việc thể hiện ra các GUI control trong suốt main action trong scene và phản hồi lại các cú click trên những control đó. Đoạn code này được điều khiển hơi khác biệt chút so với sự update frame thông thường, vậy nên nó thường được đặt trong OnGUI function (hàm này được gọi theo chu kỳ).
void OnGUI() { GUI.Label(labelRect, "Game Over"); }
Ta có thể bắt được các sự kiện của chuột xảy ra với mọi điểm trên 1 Game Object khi nó xuất hiện trong game scene. Điều này được sử dụng cho việc hướng đến 1 vũ khí hay hiển thị thông tin của nhân vật hiện tại ngay dưới con trỏ chuột. Một tập các OnMouseXXX event function (OnMouseOver, OnMouseDown...) được cung cấp sẵn để cho phép script phản ứng lại với hành động dùng chuột của người chơi. Chẳng hạn, nếu con trỏ chuột đang đưa đến 1 object cụ thể nào đó, nếu người chơi nhấn chuột thì các đoạn mã được viết trong hàm OnMouseDown của ọbject đó sẽ được chạy nếu hàm đó được developer tạo ra.
Physics Event
Physics Engine sẽ ghi lại sự va chạm với 1 object bằng việc gọi event function trong script của object đó. Hàm OnCollisionEnter, OnCollisionStay và OnCollisionExit sẽ được gọi nếu mối liên hệ giữa các object được tạo ra, duy trì hay chấm dứt. Các hàm tương tự OnTriggerEnter, OnTriggerStay và OnTriggerExit sẽ được gọi khi phần va chạm của object được đặt như 1 Trigger ( là 1 collider dễ dàng nhận ra khi nào có một vật chạm vào, như 1 phản ứng vật lý). Những function này có thể được gọi nhiều lần nếu có nhiều hơn 1 mối liên hệ được phát hiện trong suốt quá trình update vật lý, nên 1 tham số được truyền vào hàm để mang thông tin chi tiết về sự va chạm (vị trí, định danh của object, etc..)
void OnCollisionEnter (otherObj: Collision) { if(otherObj.tag == "Arrow") ApplyDamage(10); }
Tham khảo
Unity Documentation