1. Giới thiệu

    Game đào vàng là một game rất được ưa chuộng ở Việt Nam , game thuộc thể loại game 2D trong game bạn phải điều chỉnh mỏ neo để kéo lên được càng nhiểu vàng càng tốt . Trong hướng dẫn này ta sẽ làm một màn hình chơi đơn giản trong game. Đây là link file apk demo cho Android : https://www.dropbox.com/s/zhc7bxgv9ubgc5k/DaoVang.apk?dl=0

    Đây là link code https://github.com/ngocdu/DaoVang

  2. Các bước làm game

    • Tạo một project unity2D

    11-300x282.png

Tiếp theo ta tạo một màn chơi đặt tên là GamePlay Trong màn hình game ta thêm vào một sprite2D làm ảnh nền sau đó chỉnh thông số scale của ảnh cho nó full màn hình.

21-300x152.png

Trên màn hình game của chúng ta sẽ có các đối tượng sau :

  • người đào vàng là một ảnh 2D
  • các cục vàng lớn bé , kim cương … là các ảnh 2D
  • Hai đoạn text để hiển thị thời gian và điểm số . Ta sẽ thêm vào các ảnh và text trên theo giao diện như dưới đây .

4-300x165.png

Tiếp theo ta sẽ tạo ra cái mỏ neo và sợi dây . Ta thêm vào một sprite 2D để làm sợi dây và thêm vào nó thành phần LineRenderer . Mỏ neo là một sprite 2D và là đối tượng con của sợi dây .

5-300x290.png

Để vẽ sợi dây ý tưởng là ta sẽ vẽ một đường từ gốc sợi dây tới cái mỏ neo . Trong script của sợi dây ta viết hàm update như sau để cho hai đầu của sợi dây luôn ở một điểm gốc và đầu kia là vị trí của mỏ neo .

void Update () {
    gameObject.GetComponent<LineRenderer>().SetPosition(0, transform.position);
    gameObject.GetComponent<LineRenderer>().SetPosition(1, luoiCau.position);
}

Để cho mỏ neo giao động giống con lắc ý tưởng là ta sẽ cho sợi dây quay một góc từ -angleMax tới angleMax chẳng hạn thì mỏ neo sẽ di chuyển theo vì nó là con của sợi dây . Trong script của sợi dây ta viết hàm sau. speed là tốc độ quay còn angleMax là góc quay.

void FixedUpdate() {
    transform.rotation = Quaternion.Euler(0, 0,Mathf.Sin(Time.time * speed) * angleMax);
}

Để khi chạm vào màn hình thì mỏ neo di chuyển theo hướng tứ gốc sợi dây tới mỏ neo ta viết script cho đối tượng mỏ neo như sau : ta xác định velocity là vector hướng di chuyển của mỏ neo .

void checkTouchScene() {
    bool istouch = Input.GetMouseButtonDown(0);
    if(istouch) {
        velocity = new Vector2(transform.position.x - target.position.x, transform.position.y - target.position.y);
        velocity.Normalize();
    }
 }

sau khi xác định được vector vận tốc thì áp dụng nó vào đối tượng vật lý của mỏ neo

void FixedUpdate() {
    rigidbody2D.velocity = velocity * speed;
}

Nếu mỏ neo di chuyển ra ngoài tầm nhìn của camera thì ta cho nó di chuyển ngược lại bằng cách đổi chiều vector vận tốc

void checkMoveOutCameraView() {
    if(!gameObject.renderer.isVisible) {
        velocity = -velocity;
    }
}

Bước tiếp theo ta sẽ xác định va chạm giửa mỏ neo và các cục vàng, kim cương . Để làm điều này ta thêm vào các đối tượng đó thành phần Boxcollider2D

6-300x154.png

Trong hàm OnEnterCollider2D của các đối tượng cục vàng hay kim cương ta viết ( đây là hàm bắt sự kiện khi các đối tượng collider khác chạm vào nó ) Ta xét xem đối tượng va chạm là mỏ neo thì ta đổi chiều di chuyển của mỏ neo và giảm vận tốc kéo lên.

void OnTriggerEnter2D(Collider2D other) {
    if(other.gameObject.name == "luoiCau") {
        isMoveFollow = true;
        GameObject.Find("dayCau").GetComponent<DayCauScript>().typeAction = TypeAction.KeoCau;
        GameObject.Find("luoiCau").GetComponent<LuoiCauScript>().velocity = -GameObject.Find("luoiCau").GetComponent<LuoiCauScript>().velocity;
        GameObject.Find("luoiCau").GetComponent<LuoiCauScript>().speed -= this.speed;
    }
}

Đồng thời ta sẽ cho cục vàng di chuyển theo mỏ neo .Đến khi kéo lên thì ta xoá nó đi đồng thời cộng thêm điểm .

void moveFllowTarget(Transform target) {
        if(isMoveFollow)
        {
                Quaternion tg = Quaternion.Euler(target.parent.transform.rotation.x,
                                                 target.parent.transform.rotation.y,
                                                 90 + target.parent.transform.rotation.z);
                transform.rotation = Quaternion.Slerp(transform.rotation, tg, 0.5f);
                transform.position = new Vector3(target.position.x,
                                                 target.position.y - gameObject.GetComponent<Collider2D>().collider2D.bounds.size.y / 2,
                                                 transform.position.z);
            if(GameObject.Find("dayCau").GetComponent<DayCauScript>().typeAction == TypeAction.Nghi) {
                GameObject.Find("GamePlay").GetComponent<GamePlayScript>().score += this.score;
                Destroy(gameObject);
            }
        }
}

Để cập nhật điểm hiển thị và thời gian

void Update () {
timeText.text = time.ToString();
scoreText.text = score.ToString();
}

Kiểm tra nếu thời gian hết thì kết thúc game

public IEnumerator UpdateTime ()
{
    bool add = true;
    while(add){
        yield return new WaitForSeconds (1);
        if(time > 0) {
            time --;
        }
        if(time <= 0 && !endgame) {
            endGame();
        }
    }
}

Trên đây là các bước cơ bản để làm game , để xem chi tiết bạn có thể vào link github đưa ở trên để xem và tải project về chạy thử.