Lập trình game cờ vua - Bài 4 - Tạo và lập trình bàn cờ vua (Phần 1)
Back To BlogsNhư bài trước, chúng mình đã giới thiệu các bạn cách tải và quản lý mã nguồn. Bài viết này sẽ hướng dẫn các bạn các bước tiếp theo tạo và lập trình các quân cờ
Viết Script Quản lý Game (GameManager)
Chúng ta sẽ sử dụng lại script GameManager đã tạo trước đó và thêm vào để chạy được.
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { void Awake() { InitGame(); } private void InitGame() { // khởi chạy tất cả dữ liệu StartGame(); } private void StartGame() { // người chơi có thể bắt đầu chơi tại đây } private void EndGame() { // xử lý việc kết thúc game ở đây } }
Mình sẽ viết khung cho script GameManager, ban đầu sẽ có 4 phương thức, Awake (cũng giống như start tuy nhiên awake sẽ được khởi chạy trước start) mình sẽ cho game khởi tạo dữ liệu game trước khi bắt đầu chơi nên mình sẽ viết thêm hàm Init và cho gọi trong Awake.
Trong hàm Init sẽ gọi cho hàm StartGame(), đảm bảo việc khởi tạo dữ liệu game sẽ được hoàn thành trước khi người chơi có thể chơi game.
Hàm StartGame sẽ gọi xử lý các logic trong lúc chơi game.
Hàm EndGame sẽ xử lý sau khi kết thúc trò chơi, vd như gọi UI lên để thông báo ai là người thắng, đưa ra lựa chọn chơi lại hay thoát game.
Viết script quản lý bàn cờ
Tiếp theo cũng như bước tạo script quản lý game, thì mình sẽ tạo 1 script quản lý bàn cờ tương tự như trên và 1 gameobject BoardManager
Chúng ta sẽ sử dụng lại script GameManager đã tạo trước đó và thêm vào để chạy được.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BoardManager : MonoBehaviour { //Creating a reference field for the cell prefab in the Unity Editor [SerializeField] private GameObject _cellPrefab; internal GameManager GameManager; public void InitBoard(GameManager gameManager) { this.GameManager = gameManager; CreateBoard(); } private void CreateBoard() { //Creating the all the cells for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { //Instantiating a new cell from the Cell Prefab GameObject newCell = Instantiate(_cellPrefab, transform); newCell.transform.position = new Vector2(x, y); } } } }
Ở script này mình sẽ khởi tạo các ô cờ trong bàn cờ, mình cũng sẽ cần truy cập vào GameManager nên sẽ tạo 2 trường là gameobject cellPrefab và GameManager
Trong script này mình cho biến cellPrefab là private vì mình chỉ cần sử dụng biến này ở trong phạm vi class này, tuy nhiên nếu sử dụng private thì trên editor sẽ không hiển thị lên Inspector mà mình thì cần sẽ kéo prefab của ô cờ vào trong này.
Prefab các bạn có thể hiểu đơn giản đây là 1 gameobject được các bạn cài đặt, gán các component vào sau đó được các bạn lưu lại để có thể tái sử dụng. Link tham khảo: (Unity - Manual: Prefabs)[https://docs.unity3d.com/Manual/Prefabs.html]
Tiếp tục với đoạn code của mình, mình sẽ tạo hàm InitBoard truyền parameter GameManager vào để gán cho trường GameManager ở trên, và mình sẽ gọi tới hàm tạo bàn cờ CreateBoard().
Hàm tạo bàn cờ thì mình có thể hiểu đây là 1 mảng 2 chiều, vậy nên mình sẽ cho chạy 2 vòng for mỗi vòng sẽ chạy từ 0 tới 8, tại sao lại là 8, vì bàn cờ của chúng ta sẽ có kích thước 8x8.
Tiếp theo mình sẽ ra editor gán script vào gameobject BoardManager, sau đó mình sẽ kéo reference gameobject BoardManager vào GameManager.
Sau đó thì mình sẽ tạo 1 gameobject 2d Sprite/Square
Đặt tên gameobject là Cell, sau đó chọn màu của gameobject ở trong component Sprite Renderer, ở đây các bạn có thể kéo màu bằng hệ rgb 255 hoặc dùng hệ hex, ở đây mình sẽ dùng hệ hex với mã màu (E2D5A1) cho ô cờ màu trắng.
Sau đó bạn kéo gameobject Cell vào trong folder Prefabs, à trước tiên hãy tạo 1 folder con trong Prefabs đặt tên là BoardCell, sau đó kéo gameobject Cell vừa tạo vào, vậy là các bạn đã có prefab Cell.
Tiếp theo kéo prefab vừa tạo vào trường cellPrefab trong Inspector BoardManager.
Lúc này các bạn có thể xóa Cell trên scene. Tiếp theo mình sẽ gọi hàm tạo bàn cờ từ GameManager.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] private BoardManager _board; private void Awake() { InitGame(); } private void InitGame() { _board.InitBoard(this); StartGame(); } }
Lúc này mình sẽ thử play game bằng cách nhấn vào biểu tượng play trong editor Unity
Nếu như bàn cờ bị lệch thì chúng ta sẽ chỉnh sửa thông số (Size, Position,...) của Camera sao cho Camera chính diện với bàn cờ.
Tác giả: Nguyễn Minh Thuận & Nguyễn Văn Khánh