Code Game 2D Dodge Block Bằng Unity (Phần 2)

Code Game 2D Dodge Block Bằng Unity (Phần 2)

phần trước mình đã giới thiệu mọi người những thao tác cơ bản với unity và cách tạo giao diện tạo những thao tác cơ bản để chuyển giao diện. Hôm nay chúng ta sẽ làm phần gameplay bao gồm cả những tính năng cho game và hoàn thiện game này.

Sơ lược giao diện hoạt động của phần gameplay:

Trước khi bắt đầu code phần gameplay, thì chúng ta phải hình dung chúng ta cần làm cái gì trước. Trong ví dụ này mình tập trung về 1 loại game cổ điển là game né chướng ngại vật.

Chúng ta sẽ cần 2 đối tượng chính là chướng ngại vậtngười chơi.

Chúng ta cũng sẽ cần phải làm 1 phần tự động sinh ra chướng ngại vật, nhưng nó sẽ không được hiện thị ở phần view của người chơi mà phải ở trên phần view để người chơi không thấy được nó.

Chuẩn bị giao diện cho phần gameplay

Đầu tiên các bạn cần tạo ra 1 sence mới để chứa giao diện mới của phần gameplay.

Click chuột phải vào thư mực Scenes -> Create -> Scene. Sau đó các bạn đặt tên nó là Gameplay.

Sau đó các bạn hãy click đúp vào nó để mở lên.

Tiếp theo chúng ta sẽ tạo sẵn những object cần thiết cho game của chúng ta bằng cách

Click chuột phải -> chọn như hình, và hay đặt tên như hình để dễ làm việc

Sau đó chúng ta reset ví trí của tất cả object về trung tập trung bằng cách

click chuột phải ở trường Transform -> reset

Tiếp đến các bạn hãy down 3 file này về và ném vào thư mục assets. 3 file này mục đích để ta set background cho nó đẹp thôi, các bạn có thể thay 2 square file này bằng 1 file ảnh bất kì cũng được.

Link set background tại đây

Tiếp theo các bạn chọn Object background -> kéo thả Square vào chỗ sprite để nó lấy ảnh background.

Tiếp đến các bạn hãy set kích thước của background như sau:

  • Position: là ví trị của object
  • Rotation: là độ nguyên góc nhìn ở 360 độ nhưng vì chúng ta làm game 2D nên cài này không quan trọng
  • Scale: là nơi chúng ta thay đổi kích thước của object.

Ở phần Addition Settings -> Order in Layer -> đổi 0 thành -1. mục đích để background của chúng là xuống ở phía sau, tránh việc nó hiện thị đè lên các Object khác.

Các bạn có thể thay đổi theo ý muốn ở phần Scale nhé.

Note: Khi chọn độ rộng các bạn hãy nhớ lưu ý rằng là ta phải chia chiều rộng sao cho ta đủ chỗ chứa cả 5 chướng ngại vật như sau

Tiếp chúng ta sẽ set ví trí của camera để nó có thể thấy background của chúng bằng cách giảm tọa độ Z xuống còn -10. Vì nếu z = 0 thì nó sẽ ở cùng vị trí với background nó sẽ bị ghi đè lên nên ta không thể thấy gì.

Tiếp chúng ta sẽ thiết lập người chơi. Cũng tương tự như background các bạn hãy kèo thả Square vào trong Sprite sau đó thay đổi kích thước và ví trí của nó.

Chúng ta hãy đánh dấu những object sau bằng cách chọn object cần đánh dấu -> chọn nút phải -> chọn icon để đánh dấu

Làm tương tự với các spawnPoint1, spawnPoint2, spawnPoint3, spawnPoint4, spawnPoint5.

Tiếp chúng ta di chuyển Object BlockSpawner lên trên để không cho người chơi thấy được nó.

Sau đó chúng ta bố trí vị trí của các SpawnPoint cho phù hợp.

bằng cách click vào nút 4 mũi tên -> chọn object -> chọn mũi tên đỏ dể di chuyển qua trái và phải.

Sau đó chúng ta bố trí vị trí của các SpawnPoint cho phù hợp.

bằng cách click vào nút 4 mũi tên -> chọn object -> chọn mũi tên đỏ dể di chuyển qua trái và phải.

Tiếp đến chúng ta sẽ tạo 1 object chướng ngại vật

Chúng ta click chuột phải -> duplicate để tạo 1 object giống y như player

Sau đó các bạn hãy rename và thay đổi kích thước của Object Block đó sao cho vừa ý các bạn

Note: khi chọn chiều rộng ta phải chọn kích thước sao cho nó tương ứng với 5 spawn point

Sau khi tạo xong các bạn hãy kéo thả Object Block vừa tạo vào bảng bên dưới. sau khi kéo xong hãy xóa Object Block bên bảng bên trái đi.

Code chức năng cho player

Click chuột phải chọn Create -> Sscript C# -> đặt tên là Player

Mở file Player vừa tạo lên sau đó chúng ta sẽ code như sau:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Player : MonoBehaviour {
    public float speed = 150f; // tốc độ di chuyển trên bàn phím

    private Rigidbody2D rb;

    public float mapWidth = 3.25f; 
// giới hạn chiều ngang di chuyển của player tránh nó chạy ra khỏi màn hình

    public float MouseSpeed = 5f; // tốc độ di chuyển bằng chuột

    public float slowness = 10f; // slow motion khi player thua

    void Start() {
        rb = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void FixedUpdate() {
        // use 'A' or 'D' or right/left arrow to move
        float x = Input.GetAxis("Horizontal") * Time.fixedDeltaTime * speed;

        if (x == 0) {
            x = Input.GetAxis("Mouse X") * Time.fixedDeltaTime * speed * MouseSpeed; // use mouse to control
        }

        Vector2 newPosition = rb.position + Vector2.right * x;

        newPosition.x = Mathf.Clamp(newPosition.x, -mapWidth, mapWidth);

        rb.MovePosition(newPosition);

    }

    void OnCollisionEnter2D() {
        EndGame();
    }

    public void EndGame() {
        StartCoroutine(RestartLevel());
    }

    IEnumerator RestartLevel() {

        Time.timeScale = 1f / slowness; // khien time chay se giam tan toi 0.1 frame/s
        Time.fixedDeltaTime = Time.fixedDeltaTime / slowness; // de xu ly hinh anh duoc muot hon

        yield return new WaitForSeconds(2f / slowness);
        // luu y la khi xai timeScale se anh huong den waitForSeconds() 
        // vi vay phai chia cho so sloness de chay dung so second 

        Time.timeScale = 1f; // reset time ve bt
        Time.fixedDeltaTime = Time.fixedDeltaTime * slowness; // tra lai fixdeltaTime ban dau

        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
}

Sau đó các bạn hãy mở file Gamemanager mà chúng ta đã code ở phần 1 rồi sửa lại thành như sau:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour {

    public GameObject CreditUI;

    public float slowness = 10f; // slow motion khi ta thua

    public void EndGame() {
        StartCoroutine(RestartLevel());
        // Debug.Log("End");
    }

    IEnumerator RestartLevel() {

        Time.timeScale = 1f / slowness; // khien time chay se giam tan toi 0.1 frame/s
        Time.fixedDeltaTime = Time.fixedDeltaTime / slowness; // de xu ly hinh anh duoc muot hon

        yield return new WaitForSeconds(2f / slowness);
        // luu y la khi xai timeScale se anh huong den waitForSeconds() 
        // vi vay phai chia cho so sloness de chay dung so second 

        Time.timeScale = 1f; // reset time ve bt
        Time.fixedDeltaTime = Time.fixedDeltaTime * slowness; // tra lai fixdeltaTime ban dau

        // SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    public void exitgame() {
        // Tắt game
        Application.Quit();
    }

    public void openCredit() {
        CreditUI.SetActive(true);
    }

    public void closeCredit() {
        CreditUI.SetActive(false);
    }

    public void startGame() {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
    }

    public void returnToMenu() {
        Time.timeScale = 1f;
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1);
    }

}

Tiếp các bạn hãy tạo tiếp 1 Script đặt tên là BlockSpawner và mở nó lên rồi code như sau:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BlockSpawner : MonoBehaviour {
    public Transform[] spawnPoints;

    public GameObject blockPrefab;

    public float TimeSpawnBetweenWave = 1f; // đỗ trễ giữa những lần sinh block

    private float timeToSpawn = 2f; // thời gian cần để block tiếp tục sinh ra

    void Update() {
        if (Time.time >= timeToSpawn) {
            spawnBlock();
            timeToSpawn = Time.time + TimeSpawnBetweenWave;
        }

    }

    void spawnBlock() {
        int randomIndex = Random.Range(0, spawnPoints.Length);
        for (int i = 0; i < spawnPoints.Length; i++) {
            if (randomIndex != i) {
                Instantiate(blockPrefab, spawnPoints[i].position, Quaternion.identity);
            }
        }
    }
}

Thêm code di chuyển vào trong đối tượng Player

Các bạn chọn Add Component -> Rigidbody 2D

Component Rigidbody 2D mới thêm, bạn hãy chọn Body type -> Kinematic

Tiếp đến chúng ta thêm Script Player vào trong object Player

Các bạn hãy tự thay đổi thông số này sao cho phù hợp.

Tiếp đến các bạn chọn add component -> box collider 2D

Các có thể bấm nút play để thử chạy demo điều khiển Player trước  

Thêm trường vào bên trong Block

Click chọn Block -> Add component -> rigidbody 2D

Click chọn Block -> Add component -> Box Collider 2D

Tiếp chúng ta tạo 1 script BlockDelete và code như sau:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BlockDelete : MonoBehaviour {

    public float gravitySpeedRateAdd = 10f;
    public float deleteAt = -10f;

    void Start() {
        GetComponent<Rigidbody2D>().gravityScale += Time.timeSinceLevelLoad / gravitySpeedRateAdd;
        //Debug.Log(GetComponent<Rigidbody2D>().gravityScale);
    }

    void Update() {
        if (transform.position.y < deleteAt) {
            Destroy(gameObject);
        }
    }
}

Sau đó các bạn hãy click chọn Object Block sau đó kéo thả BlockDelete vào bảng phải bên dưới như hình

Tiếp đến ta click chọn BlockSpawner -> kéo thả Script BlockSpawner vừa tạo vào

Sau đó hãy kéo các đối tượng vào trong Object như hình

Như vậy là giờ game của chúng ta đã hoàn thành giờ chúng ta chỉ cần thêm 1 cái nút để quay trở lại trang menu là xong.

Bằng cách click chuột phải -> UI -> button. Các bạn hãy tự set ví trị cho phù hợp.

Cuối cùng chúng ta chèn code vào trong button vừa tạo

như vậy là xong. các bạn có thể bấm nút play để trải nghiệm game trước khi build 

Build Setting

Các bạn vào File -> build setting -> add Open Scenes

Sau đó hãy chọn platform muốn build

Tiếp theo hãy chọn Player setting ở đây sẽ chỉnh 1 số thông số

ở đây các bạn có thể set icon cho project của mình nữa, nó có 1 số tính năng khá hay nếu các bạn hứng thú có thể tự trải nghiệm

Nhự vậy là xong giờ bạn chỉ việc click nút build để build project.

Tổng kết:

Như vậy là các đã hoàn thành 1 game hoàn chỉnh. Hi vọng qua bài này các bạn đã có thể nắm sơ cách để làm việc với unity. Chúc các bạn thành công.