Làm trò chơi phi dao bằng unity(#1 / 2)

0
382

Knife Hit Part 1 Featured 2

Cách làm trò chơi  Knife Hit với Unity (phần #1/2)

Có rất nhiều trò chơi di động đơn giản trên mạng rất phổ biến. Trò phi dao Knife Hit từ Estoty, được xuất bản bởi Ketchapp cũng không ngoại lệ. Thực sự, cơ chế trò chơi đơn giản hơn thế nào?

Cơ chế đằng sau trò chơi không quan trọng, điều duy nhất thực sự quan trọng là nếu trò chơi là thú vị để chơi! Đó là những gì ngăn cách các trò chơi thành công từ những trò chơi trên nghĩa địa trò chơi trên thiết bị di động.

Cách tốt nhất để học phát triển trò chơi là nghiên cứu và nhân rộng những thành công. Đây là những gì hướng dẫn này là về. Bạn sẽ tìm hiểu làm thế nào để làm ra trò chơi cực kỳ thú vị   Knife Hit này!

Trong phần đầu tiên(#1/2)này, bạn sẽ tìm hiểu cách tạo một khúc gỗ chuyển động xoay có tên là Log xoay và cách phi vào nó bằng một con dao duy nhất. Phần thứ hai(#2/2) sẽ phát triển thêm với việc sinh ra nhiều dao hơn, tạo ra một trò chơi theo trình tự có bắt đầu và kết thúc, làm việc với giao diện người dùng, tạo hiệu ứng trò chơi (hạt!) Và hơn thế nữa, vì vậy hãy chú ý theo dõi điều đó!

Còn đây là video hướng dẫn cụ thể nhé:

Tài nguyên bạn có thể muốn tải xuống

Hướng dẫn Unity này sử dụng các tài sản assets sprite tùy chỉnh mà bạn được tự do sử dụng nếu bạn muốn theo cùng với các sprites chính xác. Bạn có thể tự tạo ra các hình ảnh đồ họa theo cách riêng của bạn cũng không vấn đề gì. Tôi đã sử dụng phần mềm đồ họa vector mã nguồn mở được gọi là Inkscape.https://inkscape.org/en/

Bạn có thể tải xuống các nội dung này từ liên kết này.https://resocoder.com/wp-content/uploads/2018/08/knife-hit-sprites.zip

Bây giờ chúng ta sẽ bắt tay vào việc trong phần #1/2 này nhé:

Tạo một dự án Unity mới

Chúng ta sẽ mở một dự án (project) mới với lựa chọn Temple là 2D như sau:



Thay đổi giao diện

Tạo một thư mục mới bên dưới thư mục Assets và đặt tên nó là Art. Kéo tất cả các sprites được cung cấp (hoặc của riêng bạn) vào trong đó. Sau đó, bạn lựa chọn tất cả các sprites và thiết lập Pixels Per Unit là 300.

Tiếp theo, để đảm bảo bạn có tỷ lệ khung hình chính xác của máy ảnh cho trò chơi dành cho thiết bị di động (9:16), bạn nên điều chỉnh tỷ lệ cỡ ảnh trong tab trò chơi(game tab). Bạn cũng có thể chuyển sang nền tảng xây dựng di động (Android / iOS) và ở đó bạn sẽ tự động có tỷ lệ 9:16. Vì hướng dẫn này không giải quyết việc xuất bản trò chơi của bạn, bạn cũng có thể rời khỏi nền tảng xây dựng trên PC / Mac / Linux. Vẻ đẹp của Unity là bạn có thể xuất game này sang điện thoại di động theo nghĩa đen chỉ bằng một cú nhấp chuột.

Cuối cùng, thay đổi màu nền của máy ảnh thành màu xanh đậm. Bạn cũng có thể thêm hình nền tuyệt đẹp cho camera ảnh nếu bạn muốn. Trong hướng dẫn này tôi sử dụng mã màu nền là  # 021C32.

Tạo đối log đang quay(xoay tròn)
Nhấp chuột phải vào hierarchy (hệ thống phân cấp)và tạo một đối tượng trò chơi trống. Đặt tên đối tượng này là  LogMotor. Căn giữa vị trí của nó trên tất cả trừ trục Y sẽ được đặt thành 2. Thêm thành phần mới Wheel Joint 2D vào nó.

Một Rigidbody 2D  cũng sẽ được tạo ra tự động khi mà ta tạo ra Wheel Joint 2D . Thiết lập “Body type của nó thành loại kinematic để nó  không bị ảnh hưởng bởi các yếu tố vật lý.

Bây giờ chúng ta có LogMotor, kéo sprite log từ thư mục Art vào LogMotor. Điều này sẽ tạo ra một đối tượng trò chơi mới như là một đối tượng con của đối tượng LogMotor gọi là Log. Căn chỉnh vào vị trí giữa trong Transform cho đối tượng mới này.

Đối tượng trò chơi Log đã  có một thành phần Sprite Renderer. Hãy thêm hai thành phần khác là Rigidbody 2D và Circle Collider 2D cho đối tượng Log này.

Hãy chắc chắn rằng bạn đã thiết lập Linear Drag,Angular Drag,Gravity Scale của đối tượng này về giá trị 0 nhé. Phát hiện Va chạm  Collision Detection về “continue”(Liên tục xác định va chạm). Radius của Circle Collider phải là 0,75 để lại một số chỗ cho các dao mới xuất hiện khi chúng bị cắm lên trên log.


Hãy tóm tắt lại một chút. Bạn có một đối tượng Log là con của LogMotor. Trên Log này là một Rigidbody 2D cái mà Wheel Joint 2D trên LogMotor sẽ sử dụng để xoay log bằng cách sử dụng một JointMotor2D mà chúng ta sẽ tạo ra trong một kịch bản dưới đây.

Có một bước cuối cùng cho điều này là có thể. Bạn cần kết nối Rigidbody của Log với Wheel Joint của LogMotor. Unity làm cho nó thực sự đơn giản. Đơn giản chỉ cần chọn LogMotor trong hệ thống phân cấp Hierarchy và kéo đối tượng con được gọi là Log vào trường Wheel Joint 2D’s Connected Rigid Body như trong hình bên dưới.

Làm kịch bản xoay Log
Bây giờ chúng ta có nền tảng tại chỗ, đó là thời gian để bắt đầu viết mã. Để sắp xếp mọi thứ, hãy tạo một thư mục Scripts dưới mục Assets và tạo một tập lệnh C # mới trên đó. Đặt tên cho
nó là LogRotation và mở nó trong Visual Studio hoặc IDE khác mà bạn chọn. Sau đó bạn sẽ đính kèm tập lệnh này vào đối tượng trò chơi LogMotor.

Dưới đây là tập lệnh LogRotation đầy đủ với các chú thích đầy đủ để giải thích.

using System.Collections;
using UnityEngine;
public class LogRotation : MonoBehaviour {
    [System.Serializable] //this will allow us to edit it in the editor
    //a custom class representing a single rotation “element” of the log’s rotation pattern
    private class RotationElement
    {
        //to get rid of an obnoxious warning about these fields not being initialized
        #pragma warning disable 0649
        public float Speed;
        public float Duration;
        #pragma warning restore 0649
    }
    [SerializeField] //attribute making private fields editable in the Unity Editor
    //the aforemention full rotation pattern of the log
    private RotationElement[] rotationPattern;
    //this will be set to the Wheel Joint 2D from the LogMotor object
    private WheelJoint2D wheelJoint;
    //something has to actually apply a force to the log through the Wheel Joint 2D
    private JointMotor2D motor;
    private void Awake()
    {
        //setting fields
        wheelJoint = GetComponent<WheelJoint2D>();
        motor = new JointMotor2D();
        //starting an infinitely looping coroutine defined below right when this script loads (awakes)
        StartCoroutine(“PlayRotationPattern”);
    }
    private IEnumerator PlayRotationPattern()
    {
        int rotationIndex = 0;
        //infinite coroutine loop
        while (true)
        {
            //working with physics, executing as if this was running in a FixedUpdate method
            yield return new WaitForFixedUpdate();
            motor.motorSpeed = rotationPattern[rotationIndex].Speed;
     &nb
sp;      
//hard coded 10000, feel free to experiment with other torques if you wish
            motor.maxMotorTorque = 10000;
            //set the updated motor to be the motor “sitting” on the Wheel Joint 2D
            wheelJoint.motor = motor;
            //let the motor do its thing for the specified duration
            yield return new WaitForSecondsRealtime(rotationPattern[rotationIndex].Duration);
            rotationIndex++;
            //infinite loop through the rotationPattern
            rotationIndex = rotationIndex < rotationPattern.Length ? rotationIndex : 0;
        }
    }
}

Một khi bạn có kịch bản LogRotation này được viết và hiểu, hãy kéo nó vào đối tượng LogMotor trong trình soạn thảo. Sau đó điền vào các giá trị của mảng rotationPattern như bạn muốn. Điều tốt nhất về phương pháp này là bạn có thể tùy chỉnh nó rất dễ dàng và thậm chí tạo ra các giá trị ngẫu nhiên cho các cấp độ mới. RotatePattern được sử dụng trong hướng dẫn này trông giống như sau:


Làm dao
Bây giờ bạn đã có đối tượng Log quay, đã đến lúc phải phi nó bằng một con dao! Trong hướng dẫn này, bạn sẽ tạo một con dao duy nhất và trong phần tiếp theo (và cuối cùng), bạn sẽ làm cho chúng sinh ra một số lần nhất định và cũng tạo ra giao diện người dùng đi kèm.

Để tạo một con dao, kéo Knife Sprite (dao) từ thư mục Art vào Sence. Đặt vị trí của nó thành X = 0, Y = -3.5, Z = 0. Thêm thành phần Rigidbody 2D và đặt Tỷ lệ trọng số (gravity Scale )thành 0 (chúng ta không muốn nó rơi xuống ngay khi trò chơi bắt đầu). Ngoài ra thêm một Box Collider 2D với kích thước sau:

Box Collider cần rộng hơn một chút so với sprite vì phát hiện va chạm không đáng tin cậy của Unity. Nếu không thì dao có thể chồng chéo nên nhau đây là điều  không nên .

Kịch bản cho dao KnifeScript
KnifeScript này sẽ được gắn vào mọi đối tượng trò chơi Knife . Mã C# như dưới đây

using UnityEngine;
public class KnifeScript : MonoBehaviour {
    [SerializeField]
    private Vector2 throwForce;
    //knife shouldn’t be controlled by the player when it’s inactive
    //(i.e. it already hit the log / another knife)
    private bool isActive = true;
    //for controlling physics
    private Rigidbody2D rb;
    //the collider attached to Knife
    private BoxCollider2D knifeCollider;
    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        knifeCollider = GetComponent<BoxCollider2D>();
    }
    void Update ()
{
        //this method of detecting input also works for touch
if (Input.GetMouseButtonDown(0) && isActive)
        {
            //”throwing” the knife
  &n
bsp;         
rb.AddForce(throwForce, ForceMode2D.Impulse);
            //once the knife isn’t stationary, we can apply gravity (it will not automatically fall down)
            rb.gravityScale = 1;
            //TODO: Decrement number of available knives
        }
}
    private void OnCollisionEnter2D(Collision2D collision)
    {
        //we don’t even want to detect collisions when the knife isn’t active
        if (!isActive)
            return;
        //if the knife happens to be active (1st collision), deactivate it
        isActive = false;
        //collision with a log
        if (collision.collider.tag == “Log”)
        {
            //stop the knife
            rb.velocity = new Vector2(0, 0);
            //this will automatically inherit rotation of the new parent (log)
            rb.bodyType = RigidbodyType2D.Kinematic;
            transform.SetParent(collision.collider.transform);
            //move the collider away from the blade which is stuck in the log
            knifeCollider.offset = new Vector2(knifeCollider.offset.x, 0.4f);
            knifeCollider.size = new Vector2(knifeCollider.size.x, 1.2f);
            //TODO: Spawn another knife
        }
        //collision with another knife
        else if (collision.collider.tag == “Knife”)
        {
            //start rapidly moving downwards
            rb.velocity = new Vector2(rb.velocity.x, 2);
            //TODO: Game Over
        }
    }
}

Hãy làm rõ. Đoạn mã này  hoạt động trên trường Knife Collider

...
knifeCollider.offset = new Vector2(knifeCollider.offset.x, 0.4f);
knifeCollider.size = new Vector2(knifeCollider.size.x, 1.2f);
...

sẽ làm cho Box Collider 2D trông như thế này khi con dao chạm vào log (đường viền màu xanh lá cây):

Bạn có thấy lưỡi dao bị cắm trong Log không có hộp va chạm xung quanh nó không? Điều này thực sự quan trọng. Nếu không thì dao có thể nghĩ rằng chúng va chạm với nhau khi người chơi phi chúng thật gần nhau vì khúc gỗ tròn.

Một điều nữa là kịch bản sử dụng các thẻ(tags) để kiểm tra đối tượng khác mà con dao đang va chạm là gì. Bạn cần thiết lập các thẻ này để mã này hoạt động.

Chọn đối tượng Log từ hệ thống phân cấp(Hierarchy). Dưới tên có một danh sách thả xuống được đánh dấu là Tags(Thẻ). Hãy tạo các thẻ mới có tên Log and Knife (Tôi đã có chúng trên các bức ảnh, bạn không có).

Một khi bạn có các thẻ này, hãy đặt chúng trên các đối tượng trò chơi tương ứng của chúng (Log and Knife).

Bây giờ bạn đã thiết lập mọi thứ một cách chính xác, làm cho con dao thực sự làm điều gì đó thật dễ dàng! Đơn giản chỉ cần kéo KnifeScript vào đối tượng Knife và điền vào throwForce.


Cuối cùng, hãy đặt các thành phần sau đây trên các thành phần của đối tượng Log. Chúng ta cần đóng băng vị trí của Log bởi vì Knife sẽ thực sự di chuyển nó khi nó chạm. Thứ tự trong lớp của Trình kết xuất Sprite (Sprite Render) sẽ
đảm bảo rằng Log được hiển thị ở phía trước Dao, chứ không phải phía sau.

Điều duy nhất còn lại để bạn làm bây giờ là thử nghiệm nó!

Phần kết luận
Trong phần đầu tiên này, bạn đã học được cách tạo ra một bản sao Knife Hit semi-functional. Cơ chế trò chơi cơ bản được triển khai đầy đủ. Phần tiếp theo sẽ hướng dẫn bạn cách làm cho nó đầy đủ chức năng bằng cách tạo ra một bộ đếm dao, sinh sản dao, tạo ra một trình tự trò chơi Game over, làm việc với giao diện người dùng, tạo hiệu ứng trò chơi (hạt!) Và hơn thế nữa. Hãy nhớ theo dõi nó. Hẹn gặp lại các bạn trong bài tiếp theo!

LEAVE A REPLY

Please enter your comment!
Please enter your name here