Bài viết nằm trong chuỗi Hướng Dẫn Hiện Thực Game Zero Với Unity, cung cấp kiến thức trong việc xây dựng 1 game trên Unity, đồng thời biết cách tổ chức project hiệu quả trong Unity.
Trong bài viết này sẽ tập trung thiết kế hệ thống scene và popup trong game. Ngoài ra, mở rộng thêm 1 chút về gameplay đã tương đối hoàn thiện trong các bài viết trước.
Quản lý GameState trong game
Trong Zero, khi người chơi không vượt qua được 1 level, hoặc CurrentTime vượt quá LevelTime, 1 popup sẽ xuất hiện và lượt chơi sẽ kết thúc, điểm số cuối cùng sẽ được hiển thị. Để kiểm soát quá trình này, ứng dụng 1 kỹ thuật quản lý GameState
đơn giản, sử dụng 1 thuộc tính để lưu trữ GameState
.
Trước hết, GameState
được định nghĩa là 1 enum trong Statics.cs như sau (dòng 16-20, Statics.cs):
public enum GameState { PLAYING, FAILED }
Khai báo thuộc tính lưu trữ GameState
, đặt trong GameManager với tuỳ chọn HideInInspector
để không hiển thị tại cửa sổ Inspector (dòng 26, GameManager.cs):
public GameState m_gameState;
Thiết lập giá trị ban đầu cho GameState trong hàm Start
(dòng 46, GameManager.cs):
m_gameState = GameState.PLAYING;
Ngay khi GameScene được nạp, trạng thái của game sẽ được cập nhật là PLAYING
, đồng nghĩa game sẽ được bắt đầu ngay lập tức. Ở 2 button, các phím mũi tên tương ứng và vị trí kiểm tra m_currentTime
, cập nhật lại trạng thái game thành FAILED
khi người chơi không vượt qua được 1 level.
Để quản lý trạng thái của game, hiện thực việc kiểm tra m_gameState
trong hàm Update
của GameManager.cs. Tại đây dùng cấu trúc rẽ nhánh switch… case
để quản lý tương tự như sau:
switch(m_gameState) { case GameState.PLAYING: // Logic Game break; case GameState.FAILED: // Do something break; }
Đến đây, cơ bản đã quản lý được trạng thái của game. Tuy nhiên, khi người chơi thua, game sẽ dừng lại và không có cách nào đưa game trở lại trạng thái ban đầu. Đó là do chưa hiện thực 1 thao tác nào để trả giá trị của m_gameState
về PLAYING
. Phần bên dưới sẽ hiện thực điều đó.
GameOver popup
Đây là đối tượng sẽ xuất hiện khi người chơi trả lời sai. Trên GameOver popup sẽ hiển thị điểm số người chơi đạt được, điểm số cao nhất (Best Score) và 1 số button. Giao diện của GameOver popup tương tự như sau:
Các dòng chữ "Your Score
", "Best Score
", số điểm và các button đều là các đối tượng UI.
Hiện thực hàm ShowGameOverPopup
để hiển thị GameOver popup như sau:
public void ShowGameOverPopup() { m_gameOverPopup.enabled = true; m_gameState = GameState.FAILED; m_popupScore.text = Static.s_score.ToString(); if(PlayerPrefs.GetInt("BestScore") < Static.s_score) PlayerPrefs.SetInt("BestScore", Static.s_score); m_popupBestScore.text = PlayerPrefs.GetInt("BestScore"); }
Đối với việc hiển thị điểm hiện tại, sử dụng biến s_score
trong Statics.cs. Đối với BestScore
, sử dụng PlayerPrefs để lưu trữ xuống bộ nhớ máy, sử dụng cho các lần chơi sau.
Hàm ShowGameOverPopup
sẽ được gọi khi người chơi thua, do đó thay thế các dòng code thay đổi m_gameState
sang FAILED
bằng việc gọi hàm ShowGameOverPopup
.
MenuScene
MenuScene của Zero khá đơn giản, bao gồm button Play và 1 button mở InfoPopup.
Info popup
Các button Play của MenuScene và button Menu, Replay của GameScene là các liên kết qua lại giữa 2 scene trong Zero.
Để link được giữa 2 scene, phải thêm cả 2 scene này vào Build Setting, sau đó sử dụng hàm LoadLevel
thuộc lớp Application
để chuyển scene.
Đối với button Back
tại InfoPopup
, sử dụng event OnClick
để bật/tắt poup (canvas).
Download Project
Bài chung series
- Hiện Thực Game Zero Với Unity - Phần 1 - Nhận Sự Kiện Button.
- Hiện Thực Game Zero Với Unity - Phần 2 - Hiện Thực Gameplay.
- Hiện Thực Game Zero Với Unity - Phần 3 - Điểm Số Và Progress Timer.
- Hiện Thực Game Zero Với Unity - Phần 4 - Scene Và Popup.
- Hiện Thực Game Zero Với Unity - Phần 5 - Âm Thanh Và Effect.