Menu
CoddyTech

Các hàng đông hơn

Bài học 12 trên 21 trong khóa học Trò chơi Unity: đường đua trên trời của Coddy.

Một hàng chỉ có một chướng ngại vật thì dễ: hai làn còn lại luôn trống. Về sau trong lượt chơi, mỗi hàng nên có hai hoặc ba chướng ngại vật. made đã đếm số chướng ngại vật, nên có thể dùng biến này để đặt số chướng ngại vật tối đa trong một hàng:

int busy = Mathf.Min(3, 1 + made / 12);
int count = Random.Range(1, busy + 1);

Hai chướng ngại vật không được nằm cùng một làn. Hãy giữ các làn trống trong một danh sách và xóa từng làn khỏi danh sách sau khi dùng. Ba bức tường liên tiếp sẽ chặn hết đường đi, nên khi có hai bức tường, hãy chọn rào chắn hoặc thanh chắn thay thế.

List<int> lanes = new List<int> { -1, 0, 1 };
int pick = Random.Range(0, lanes.Count);
int lane = lanes[pick];
lanes.RemoveAt(pick);
challenge icon

Thử thách

Trung bình

Điền hai hoặc ba chướng ngại vật vào các hàng phía sau.

  1. Trong Fill, tính busy và count như trên.
  2. Đặt count chướng ngại vật, mỗi chướng ngại vật ở một làn được lấy ra khỏi lanes.
  3. Đếm số bức tường. Khi kind == 2 và đã có hai bức tường, hãy chọn Random.Range(0, 2) thay thế.

Nhấn Chơi và tiếp tục chạy: các hàng phía sau có hai hoặc ba chướng ngại vật. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 16f;
    public float jumpHeight = 1.6f;
    public float gravity = -40f;
    public float slideTime = 0.7f;

    public int lane;

    private CharacterController controller;
    private GameManager game;
    private float fallSpeed;
    private float slide;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        game = FindFirstObjectByType<GameManager>();
    }

    void Update()
    {
        if (!game.over)
        {
            if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
            if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
            bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
            if (jump && controller.isGrounded)
            {
                fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
                StopSlide();
            }
            if ((Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow)) && controller.isGrounded)
            {
                slide = slideTime;
                Resize(0.5f);
            }
        }

        if (slide > 0f)
        {
            slide -= Time.deltaTime;
            if (slide <= 0f) StopSlide();
        }

        if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
        fallSpeed += gravity * Time.deltaTime;

        float targetX = lane * laneWidth;
        float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
        Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
        controller.Move(move);
    }

    void StopSlide()
    {
        if (transform.localScale.y < 1f) Resize(1f);
        slide = 0f;
    }

    void Resize(float height)
    {
        controller.enabled = false;
        transform.position += Vector3.up * (height - transform.localScale.y);
        transform.localScale = new Vector3(1f, height, 1f);
        controller.enabled = true;
    }

    void OnTriggerEnter(Collider other)
    {
        if (game.over) return;
        if (other.CompareTag("Obstacle"))
        {
            game.GameOver();
        }
    }
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Trò chơi Unity: đường đua trên trời

Tự luyện tập: Playground Unity