Đôi khi trả tiền để được ở trên giường vào ngày thứ Hai, thay vì dành phần nghỉ ngơi còn lại của tuần gỡ rối mật mã ngày thứ Hai. Vidiu Platon.
STDIO Tiếp tục chuỗi bài viết Hướng Dẫn Hiện Thực Game Zero Với Unity, trong bài viết này, tôi sẽ tập trung thiết kế hệ thống scene và popup trong game. Ngoài ra, tôi mở rộng thêm một chút về gameplay đã tương đối hoàn thiện trong các bài viết trước.
Nội dung bài viết

Giới thiệu

Tiếp tục chuỗi bài viết Hướng Dẫn Hiện Thực Game Zero Với Unity, trong bài viết này, tôi sẽ tập trung thiết kế hệ thống scene và popup trong game. Ngoài ra, tôi mở rộng thêm một chút về gameplay đã tương đối hoàn thiện trong các bài viết trước.

Tiền đề bài viết

Bài viết thuộc chuỗi bài viết Hướng Dẫn Hiện Thực Game Zero Với Unity, giúp bạn đọc biết cách quản lý project và xây dựng một game đơn giản với Unity.

Đối tượng hướng đến

Bài viết hướng đến đối tượng MỚI BẮT ĐẦU với Lập trình game trên Unity. Script hướng dẫn trong bài được viết bằng ngôn ngữ C# nên bạn đọc cần có kiến thức tương đối về C# để có thể đọc hiểu tốt.

Các bài viết thuộc series

Quản lý GameState trong game

Trong Zero, khi người chơi không vượt qua được một level, hoặc CurrentTime vượt quá LevelTime, một 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, tôi ứng dụng một kĩ thuật quản lý GameState đơn giản, sử dụng một thuộc tính để lưu trữ GameState.

Trước hết, GameState được định nghĩa là một 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ôi đặ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. Ở hai button, các phím mũi tên tương ứng và vị trí kiểm tra m_currentTime, tôi 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 một level. Bạn đọc xem xét kĩ các script ButtonManager.csGameManager.cs để nắm rõ hơn.

Để quản lý trạng thái của game, tôi hiện thực việc kiểm tra m_gameState trong hàm Update của GameManager.cs. Tại đây tôi 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;
}

Đọc thêm về cấu trúc switch… case tại Cấu Trúc Switch… Case Trong Ngôn Ngữ C++.

Đến đây, cơ bản chúng ta đã 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 tôi chưa hiện thực một thao tác nào để trả giá trị của m_gameState về PLAYING. Phần bên dưới tô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à một số button. Giao diện của GameOver popup tương tự như sau:

ss_1

 

Các dòng chữ "Your Score", "Best Score", số điểm và các button đều là các đối tượng UI. Bạn đọc tham khảo bài viết Thiết Kế Giao Diện Người Dùng Trên Unity và project đính kèm ở cuối bài viết để tự hiện thực tương tự.

Tôi 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, bạn đọc sử dụng biến s_score trong Statics.cs và thực hiện tương tự như hướng dẫn trong bài viết Hiện Thực Game Zero Với Unity - Phần 3 - Điểm Số Và Progress Timer. Đối với BestScore, tôi sử dụng PlayerPrefs để lưu trữ xuống bộ nhớ máy, sử dụng cho các lần chơi sau. Tìm hiểu thêm về PlayerPrefs tại Lưu Trữ Thông Tin Game Với PlayerPrefs.

Hàm ShowGameOverPopup sẽ được gọi khi người chơi thua, do đó tôi thay thế các dòng code thay đổi m_gameState sang FAILED bằng việc gọi hàm ShowGameOverPopup. Chi tiết các bạn xem thêm project đính kèm.

MenuScene

MenuScene của Zero khá đơn giản, bao gồm button Play và một button mở InfoPopup.

ss_4

Info popup

ss_5

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 hai scene trong Zero. Để link được giữa hai scene, bạn phải thêm cả hai scene này vào Build Setting, sau đó sử dụng hàm LoadLevel thuộc lớp Application để chuyển scene. Tham khảo thêm bài viết Chuyển Đổi Scene Trong Unity. Đối với button Back tại InfoPopup, tôi sử dụng event OnClick để bật/tắt poup (canvas).

Lời kết

Đến đây, game Zero đã khá hoàn thiện về mặt nội dung. Bài viết sau tôi sẽ đi sâu về âm thanh và các hiệu ứng của game Zero, các tính năng thu hút người chơi. Nếu chưa theo kịp dòng nội dung của bài viết, các bạn xem thêm project đính kèm.

Download Project

STDIO_ZeroUnity-4.zip.

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG