STDIO
Tìm kiếm gần đây
    Mục lục
    Thảo luận
    0
    Liên kết
    QR Code

    Hiện Thực Game Zero Với Unity - Phần 2 - Hiện Thực Gameplay

    Tôi tiếp tục chuỗi bài viết giúp bạn đọc xây dựng một game đơn giản thực tế: Hướng Dẫn Hiện Thực Game Zero Với Unity. Ở phần 2 tôi sẽ giới thiệu và hướng dẫn các bạn xây dựng gameplay cơ bản của game.

    Rye Nguyen

    09/08/2015
    10/12/2017
    7 phút đọc
    Hiện Thực Game Zero Với Unity - Phần 2 - Hiện Thực Gameplay

    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, ở phần 2 tôi sẽ giới thiệu và hướng dẫn các bạn xây dựng gameplay cơ bản của game.

    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.

    Bạn đọc vui lòng tham khảo bài viết Hiện Thực Game Zero Với Unity - Phần 1 - Nhận Sự Kiện Button để thiết lập môi trường làm việc cho project.

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

    Giới thiệu gameplay

    Gameplay của Zero khá đơn giản: Mỗi lượt chơi là một phép tính được biểu thị bằng hình ảnh ngẫu nhiên 4 chất của bộ bài Tây (chúng tôi – những nhà phát triển Zero, gọi là suit). Người chơi sẽ phải tính số lượng suit có ở hai bên, kết hợp với các toán tử (>, <, =) và quyết định nhanh chóng.

    Sau một khoảng thời gian ngắn, nếu trả lời đúng sẽ được chuyển sang mức độ tiếp theo với độ khó tăng dần, trả lời sai sẽ thua. Người chơi có thể cạnh tranh bằng cách chia sẻ điểm số đạt được với nhau. Với yếu tố về thời gian và các hiệu ứng, Zero là một trong những game thú vị thuộc thể loại endless.

    Trong bài viết này, tôi sẽ hướng dẫn bạn hiện thực lại gameplay bao gồm random phép tính và kiểm tra tính đúng sai của phép tính. Các thành phần khác của gameplay tôi sẽ hướng dẫn trong các bài viết sau.

    GameManager

    GameManager là nơi quản lý tập trung các sự kiện xảy ra trong game. Toàn bộ phần Gameplay sẽ được quản lý bởi script GameManager.cs. Script này sẽ được gắn vào một đối tượng được gọi là GameManager. Chi tiết về script các bạn vui lòng tham khảo project đính kèm. Tôi sẽ hướng dẫn các bạn hiện thực các hàm quan trọng ở phần bên dưới.

    Giao diện và cấu trúc của các GameObject trong project của tôi như sau:

    ss_1

    Các thuộc tính và phương thức cần thiết của script GameManager.cs:

    • Left, Right, Operator: Lưu trữ ảnh hiển thị mô phỏng của phép tính hiện tại.
    • Calculation: Lưu trữ phép tính được ngẫu nhiên sau mỗi lần trả lời đúng. Calculation là cơ sở để vẽ các đối tượng lên màn hình.
    • Hàm GenerateNextCalculation: Tạo phép tính mới. Hàm sẽ được gọi khi người chơi vượt qua được một câu hỏi.
    • Hàm IsRightAnswer: Kiểm tra tính đúng sai của phép tính. Hàm này được sử dụng trong button khi click chuột.

    Đối với các suit đại diện cho phép tính, tôi sử dụng các container (đối tượng chứa) và thành phần Transform của container để tìm và lưu trữ các đối tượng con. Cách hiện thực như sau (dòng 23-27, GameManager.cs):

    for(int i = 0; i < 4; i++)
    {
         m_lefts[i] = m_leftContainer.transform.GetChild(i).gameObject;
         m_rights[i] = m_rightContainer.transform.GetChild(i).gameObject;
    }

    Random phép tính

    Việc random phép tính phụ thuộc vào số lượng suit mỗi bên và số lượng các toán tử. Đối với Zero, số lượng tối đa ở một phía là 4, đồng thời sử dụng ba toán tử >, < và =. Hiện thực hàm GenerateNextCalcultion như sau (dòng 55-65, GameManager.cs):

    public void GenerateNextCalculation()
    {
    	m_calculation[0] = Random.Range(1, 5);     // Suits left
    	m_calculation[1] = Random.Range(1, 5);     // Suits right
    	m_calculation[2] = Random.Range(0, 3);     // Operator
    	
    	GetSuitsPosition(m_lefts, m_calculation[0]);
    	GetSuitsPosition(m_rights, m_calculation[1]);
    	
    	m_operator.GetComponent<SpriteRenderer>().sprite = m_sprOperators[m_calculation[2]];
    }

    (Tham khảo bài viết C# Script – Lớp Random).

    Sau khi thực hiện ngẫu hiên phép tính, tôi cập nhật lại các suit hai bên bằng cách cho ẩn những suit không cần thiết, đồng thời toán tử cũng được cập nhật lại. Việc cập nhật vị trí các suits được hiện thực trong hàm GetSuitsPosition. Nguyên mẫu hàm như sau:

    void GameManager.GetSuitsPosition(GameObject[] _suits, int _count);

    Hàm nhận vào hai giá trị là danh sách đối tượng cùng với số lượng. Tôi thiết kế hàm như thế để sử dụng chung cho cả các suits ở hai bên. Hiện thực hàm khá đơn giản do Zero chỉ có tối đa 4 suit mỗi bên (dòng 67-130, GameManager.cs):

    void GetSuitsPosition(GameObject[] _suits, int _count)
    {
    	switch (_count)
    	{
    		case 1:
    			_suits[0].SetActive(true);
    			_suits[1].SetActive(false);
    			_suits[2].SetActive(false);
    			_suits[3].SetActive(false);
    
    			_suits[0].transform.localPosition = Vector3.zero;
    			_suits[0].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			break;
    		case 2:
    			_suits[0].SetActive(true);
    			_suits[1].SetActive(true);
    			_suits[2].SetActive(false);
    			_suits[3].SetActive(false);
    
    			_suits[0].transform.localPosition = new Vector3(-0.6f, 0, 0);
    			_suits[0].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			_suits[1].transform.localPosition = new Vector3(0.6f, 0, 0);
    			_suits[1].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			break;
    		case 3:
    			_suits[0].SetActive(true);
    			_suits[1].SetActive(true);
    			_suits[2].SetActive(true);
    			_suits[3].SetActive(false);
    
    			_suits[0].transform.localPosition = new Vector3(-0.6f, -0.5f, 0);
    			_suits[0].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			_suits[1].transform.localPosition = new Vector3(0.6f, -0.5f, 0);
    			_suits[1].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			_suits[2].transform.localPosition = new Vector3(0, 0.5f, 0);
    			_suits[2].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			break;
    		case 4:
    			_suits[0].SetActive(true);
    			_suits[1].SetActive(true);
    			_suits[2].SetActive(true);
    			_suits[3].SetActive(true);
    
    			_suits[0].transform.localPosition = new Vector3(-0.6f, 0, 0);
    			_suits[0].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			_suits[1].transform.localPosition = new Vector3(0.6f, 0, 0);
    			_suits[1].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			_suits[2].transform.localPosition = new Vector3(0, 1.0f, 0);
    			_suits[2].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			_suits[3].transform.localPosition = new Vector3(0, -1.0f, 0);
    			_suits[3].GetComponent<SpriteRenderer>().sprite = m_sprSuits[Random.Range(0, 4)];
    
    			break;
    	}
    }
    

    Kiểm tra tính đúng sai bằng button

    Hai button được hiện thực trong bài viết trước có nhiệm vụ kiểm tra tính đúng đắn của phép tính. Khi người chơi trả lời sai thì lượt chơi sẽ kết thúc. Ở bài viết trước, tôi hiện thực đơn giản bằng cách xuất một chuỗi tương ứng ra màn hình Console. Tôi chỉnh sửa script ButtonManager.cs cho phù hợp với mục tiêu của gameplay như sau (dòng 6-24, GameManager.cs):

    public void CheckAnswer()
    {
    	GameManager manager = GameObject.FindGameObjectWithTag("GameManager").GetComponent<GameManager>();
    	
    	if(gameObject.name == "BtnRight")
    	{
    		if (manager.IsRightAnswer())
    			manager.GenerateNextCalculation();
    		else
    	        Static.S_Debug("You're wrong!");
    	}
    	else
    	{
    		if (!manager.IsRightAnswer())
    			manager.GenerateNextCalculation();
    		else
    	        Static.S_Debug("You're wrong!");
    	}
    }

    Script GameManager.cs được gắn vào đối tượng GameManager có tag là “GameManager” (Xem lại hình minh hoạ ở trên). Do đó tôi sử dụng hàm FindGameObjectWithTag để tìm và lấy ra scipt này (Xem thêm bài viết GameObject – Thao Tác Với C# Script để nắm được cách sử dụng hàm này).

    Tại đây là lúc hàm GenerateNextCalculation được gọi khi người chơi chọn đúng. Hàm kiểm tra tính đúng đắn của phép tính được đặt trong script GameManager.cs với thuộc tính public (dòng 132-138, GameManager.cs):

    public bool IsRightAnswer()
    {
    	return
    			(m_calculation[2] == 0 && m_calculation[0] == m_calculation[1]) ||
    			(m_calculation[2] == 1 && m_calculation[0] > m_calculation[1]) ||
    			(m_calculation[2] == 2 && m_calculation[0] < m_calculation[1]);
    }

    Ngoài ra, trong hàm Update, tôi gắn chức năng của hai button này vào 2 phím mũi tên trái phải để tiện theo dõi trong Unity Editor (dòng 35-52, GameManager.cs):

    #if UNITY_EDITOR
    		{
    			if(Input.GetKeyDown(KeyCode.LeftArrow))
    			{
    				if (IsRightAnswer())
    					GenerateNextCalculation();
    				else
    					Static.S_Debug("You're wrong!");
    			}
    			else if (Input.GetKeyDown(KeyCode.RightArrow))
    			{
    				if (!IsRightAnswer())
    					GenerateNextCalculation();
    				else
    					Static.S_Debug("You're wrong!");
    			}
    		}
    #endif

    Lời nhắn

    Trên đây chỉ là một trong nhiều những hướng để hiện thực lại gameplay của Zero. Nếu bạn nghĩ được cách khác hiệu quả hơn, hãy chia sẻ để cùng nhau phát triển.

    Download Project

    STDIO_ZeroUnity-2.

    Lập Trình Game

    Lập Trình Game

    Kiến thức, kỹ thuật, kinh nghiệm lập trình game.

    Đề xuất

    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 3 - Điểm Số Và Progress Timer

    Tiếp tục chuỗi bài viết Hướng Dẫn Hiện Thực Game Zero Với Unity, ở phần ...

    Lập Trình GameKiến Thức Nâng Cao

    10/08/2015

    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 1 - Nhận Sự Kiện Button

    Tôi tiếp tục chuỗi bài viết giúp bạn đọc xây dựng một game đơn giản thực ...

    Lập Trình GameKiến Thức Nâng Cao

    09/08/2015

    Khám phá thêm

    Hiện Thực Game Zero Với Unity - Phần 5 - Âm Thanh Và Effect

    Hiện Thực Game Zero Với Unity - Phần 5 - Âm Thanh Và Effect

    Tiếp tục chuỗi bài viết Hướng Dẫn Hiện Thực Game Zero Với Unity, trong ...

    Lập Trình GameKiến Thức Nâng Cao

    11/08/2015

    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 4 - Scene Và Popup

    Tiếp tục chuỗi bài viết Hướng Dẫn Hiện Thực Game Zero Với Unity, trong ...

    Lập Trình GameKiến Thức Nâng Cao

    10/08/2015

    Hiện Thực Menu Select Level Với Scroll Rect

    Hiện Thực Menu Select Level Với Scroll Rect

    Đối với các thể loại game giải đố (puzzle), luôn luôn có một hệ thống ...

    Lập Trình GameKiến Thức Nâng Cao

    08/08/2015

    Phát Triển Game Funny Halloween Pumpkins với Cocos2d-x - Phần 1

    Phát Triển Game Funny Halloween Pumpkins với Cocos2d-x - Phần 1

    Hướng dẫn làm game cụ thể bằng Cocos2d-x với code mẫu và game mẫu.

    Lập Trình GameCùng làm game

    27/11/2015

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 9: Hiện thực GameScene - Điểm Số

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 9: Hiện thực GameScene - Điểm Số

    Tiếp tục chuỗi bài viết về hướng dẫn làm game Zero, hôm nay tôi sẽ hướng ...

    Lập Trình GameCocos2d-x

    15/03/2015

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 7: Hiện thực GameScene - Button

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 7: Hiện thực GameScene - Button

    Tiếp tục chuỗi bài viết về hướng dẫn làm game, hôm nay tôi sẽ hướng dẫn ...

    Lập Trình GameCocos2d-x

    12/03/2015

    GameObject - Thao Tác Với C# Script

    GameObject - Thao Tác Với C# Script

    GameObject là một khái niệm cơ bản trong Unity. Mọi đối tượng trong game ...

    Lập Trình GameKiến Thức Nâng Cao

    08/08/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020