Saturday, October 11, 2025

Plinkgo

 Ứng dụng trò chơi bạn mô tả rất giống với trò chơi Plinko nổi tiếng, một trò chơi thả bóng dựa trên vật lý. Dưới đây là hướng dẫn cơ bản để bạn có thể bắt đầu xây dựng trò chơi này bằng Unity (nên chọn dự án 2D để đơn giản).

I. Chuẩn bị trong Unity (2D)

1. Tạo Dự án Mới

Mở Unity Hub và tạo một dự án mới, chọn 2D (Core).

2. Thiết lập Camera

 * Chọn Main Camera trong cửa sổ Hierarchy.

 * Đặt Projection là Orthographic (mặc định với dự án 2D).

 * Điều chỉnh Size để thấy toàn bộ khu vực trò chơi.

 * Đặt Background thành một màu phù hợp.

3. Thiết lập Vật lý (Physics)

Vì đây là trò chơi dựa trên vật lý, bạn cần sử dụng Physics 2D của Unity.

 * Đảm bảo Gravity (Trọng lực) trong Edit -> Project Settings -> Physics 2D là -9.81 (mặc định) hoặc một giá trị âm khác để quả bóng rơi xuống.

 * Tạo một Physics Material 2D mới trong thư mục Assets (nhấp chuột phải Create -> 2D -> Physics Material 2D).

 * Đặt Friction (Ma sát) bằng 0 (hoặc rất nhỏ, ví dụ 0.05) và Bounciness (Độ nảy) khoảng 0.7 đến 0.9. Điều này giúp bóng nảy chân thực hơn.

II. Xây dựng Màn hình Chơi

1. Tạo "Quả Bóng" Cản (Pegs/Balls)

Các quả bóng cản này cần là các vật thể tĩnh, giúp quả bóng người chơi va chạm và đổi hướng.

 * Trong Hierarchy, nhấp chuột phải 2D Object -> Sprites -> Circle. Đổi tên thành Peg.

 * Thêm các Component sau vào Peg:

   * Circle Collider 2D: Điều chỉnh để bao quanh hình ảnh quả bóng.

   * Rigidbody 2D:

     * Đặt Body Type thành Static (vì chúng ta không muốn chúng di chuyển).

   * Kéo Physics Material 2D đã tạo ở trên vào ô Material của Circle Collider 2D.

 * Nhân bản Peg này và sắp xếp thành các hàng ngang như mô tả của bạn (hình tam giác xen kẽ, khoảng cách đều).

   * Hàng thứ n sẽ nằm ở giữa các quả bóng của hàng thứ n-1.

2. Tạo "Quả Bóng" Người Chơi (Player Ball)

Đây là quả bóng mà người chơi sẽ thả.

 * Tạo một Sprite Circle khác, đặt tên là PlayerBall.

 * Thêm các Component sau:

   * Circle Collider 2D: Điều chỉnh kích thước và kéo Physics Material 2D vào.

   * Rigidbody 2D:

     * Đặt Body Type thành Dynamic (vì nó cần di chuyển và chịu tác động của vật lý).

     * Tích chọn Simulated.

3. Tạo "Bẫy" Ghi Điểm (Score Zones)

Các bẫy này là các khu vực ở dưới cùng của màn hình.

 * Tạo một Empty Object đặt tên là ScoreZones để chứa các bẫy.

 * Tạo các GameObject con trong đó (ví dụ: ScoreZone_Plus10, ScoreZone_Minus5, ScoreZone_Death).

 * Thêm Component Box Collider 2D vào mỗi bẫy.

   * Tích chọn Is Trigger (quan trọng! Điều này cho phép bóng đi qua và kích hoạt mã kiểm tra va chạm, thay vì chặn bóng).

 * Tạo một Script C# cho các bẫy (ví dụ: ScoreZone.cs).

III. Lập trình (Scripting)

1. Script cho Quả Bóng Chơi (PlayerBall.cs)

Tạo một script mới, đính kèm vào PlayerBall. Script này sẽ xử lý việc thả bóng và các va chạm.

using UnityEngine;


public class PlayerBall : MonoBehaviour

{

    // Để có thể kéo thả Game Controller vào Inspector

    public GameController gameController;


    void OnCollisionEnter2D(Collision2D collision)

    {

        // Xử lý va chạm với các vật cản (Pegs) nếu cần.

        // Ví dụ: tăng nhẹ độ nảy hoặc thêm âm thanh.

    }


    // Xử lý khi đi vào khu vực Trigger (Bẫy)

    void OnTriggerEnter2D(Collider2D other)

    {

        // Kiểm tra xem vật thể đi vào có phải là Bẫy Ghi Điểm hay không

        ScoreZone zone = other.GetComponent<ScoreZone>();

        if (zone != null)

        {

            // Báo cho Game Controller biết bóng đã vào bẫy

            gameController.BallLanded(zone.scoreValue);


            // Xóa quả bóng này hoặc đưa nó về vị trí xuất phát

            Destroy(gameObject);

        }

    }

}


2. Script cho Bẫy Ghi Điểm (ScoreZone.cs)

Tạo script này và đính kèm vào các đối tượng bẫy.

using UnityEngine;


public class ScoreZone : MonoBehaviour

{

    // Điểm cộng, trừ hoặc 0 (Ví dụ: 10, -5, 0)

    public int scoreValue = 10; 

}


3. Script cho Bộ Điều Khiển Trò Chơi (GameController.cs)

Tạo một Empty Object trong Hierarchy, đặt tên là GameController và đính kèm script này.

using UnityEngine;

using TMPro; // Cần dùng nếu hiển thị TextMeshPro


public class GameController : MonoBehaviour

{

    public GameObject playerBallPrefab; // Kéo PlayerBall vào đây

    public Transform spawnPoint; // Vị trí thả bóng

    public TextMeshProUGUI scoreText; // Nơi hiển thị điểm

    

    private int currentScore = 0;


    void Start()

    {

        UpdateScoreText();

    }


    void Update()

    {

        // Cho phép người chơi thả bóng khi nhấp chuột trái

        if (Input.GetMouseButtonDown(0))

        {

            DropBall();

        }

    }


    void DropBall()

    {

        // Tạo một quả bóng mới tại vị trí spawnPoint

        GameObject newBall = Instantiate(playerBallPrefab, spawnPoint.position, Quaternion.identity);

        

        // Đặt ngẫu nhiên vị trí thả bóng trên cùng một chút

        float randomX = Random.Range(-2f, 2f); // Điều chỉnh phạm vi X

        newBall.transform.position = new Vector3(randomX, spawnPoint.position.y, spawnPoint.position.z);


        // Gán GameController cho PlayerBall vừa tạo

        newBall.GetComponent<PlayerBall>().gameController = this;

    }


    // Hàm được gọi từ PlayerBall khi bóng rơi vào bẫy

    public void BallLanded(int value)

    {

        currentScore += value;

        UpdateScoreText();

        

        // Xử lý "chết" hoặc kết thúc trò chơi nếu điểm quá thấp/bóng vào bẫy tử

        if (value <= -100) // Ví dụ cho "bẫy chết"

        {

            Debug.Log("Game Over!");

            // Thêm logic hiển thị màn hình Game Over ở đây

        }

    }


    void UpdateScoreText()

    {

        if (scoreText != null)

        {

            scoreText.text = "Score: " + currentScore.ToString();

        }

    }

}


IV. Hoàn thiện

 * UI (Giao diện người dùng): Thêm Canvas và một Text (nên dùng TextMeshPro) để hiển thị Điểm số. Kéo đối tượng Text này vào ô Score Text trong script GameController.

 * Prefab: Kéo PlayerBall vào thư mục Assets để tạo Prefab, sau đó xóa PlayerBall khỏi Hierarchy. Kéo Prefab này vào ô Player Ball Prefab trong script GameController.

 * Spawn Point: Tạo một Empty Object nhỏ, đặt tên là SpawnPoint, di chuyển nó lên trên cùng, nơi bóng sẽ được thả, sau đó kéo nó vào ô Spawn Point trong script GameController.

 * Kiểm tra và Điều chỉnh: Nhấn Play để kiểm tra. Điều chỉnh Bounciness và Friction của vật liệu vật lý, cũng như Gravity cho đến khi chuyển động của bóng trông vừa ý.


No comments:

Post a Comment

Affliate

 Đây là một lĩnh vực tiềm năng và có nhiều người đã thành công. Để xây dựng một website làm affiliate hiệu quả với Lazada và Shopee, bạn cần...

Labels

Hosting Giá rẻ

Popular Posts