Menu
CoddyTech

Tạo con đường

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

Cho đến nay, nhân vật chạy đứng trên một khối phẳng tên là Ground. Từ đây, tập lệnh Road tạo con đường, và khối đó biến mất.

Con đường gồm các đoạn dài 20 đơn vị, đặt nối tiếp nhau. Mỗi đoạn là một GameObject trống tên Chunk, và mọi thứ trên đoạn đó đều là phần tử con của nó: mặt đường, các vạch đứt giữa các làn đường và hai mép đường. Di chuyển đoạn này sẽ di chuyển tất cả.

Transform chunk = new GameObject("Chunk").transform;
chunk.position = new Vector3(0f, 0f, i * chunkLength);
Instantiate(floorPrefab, chunk.position + new Vector3(0f, -0.25f, 0f), Quaternion.identity, chunk);

Đối số cuối cùng của Instantiate là đối tượng cha. Mặt đường dày nửa đơn vị, vì vậy tâm của nó nằm thấp hơn mặt đường một phần tư đơn vị, tại y 0.

Mỗi vạch làn đường gồm bốn vạch đứt, mỗi vạch dài 3 đơn vị và cách nhau 5 đơn vị, tại x -laneWidth / 2f và laneWidth / 2f. Hai mép đường nằm tại x -4.1 và 4.1, y 0.05.

challenge icon

Thử thách

Dễ

Dựng con đường.

  1. Trong Road, thêm public GameObject floorPrefab, stripePrefab, edgePrefab;, chunkCount = 7, chunkLength = 20f, laneWidth = 2.5f.
  2. Trong Start, tạo chunkCount GameObject rỗng có tên Chunk tại z i * chunkLength, mỗi đối tượng có mặt đường.
  3. Trên mỗi đoạn, với d từ 0 đến 3, tạo một vạch đứt trên mỗi vạch phân làn tại z -7.5f + d * 5f, y 0.01.
  4. Sau đó, tạo lề đường tại x -4.1 và 4.1, y 0.05.

Nhấn Chơi: bạn sẽ thấy con đường gồm bảy đoạn với các vạch phân làn đứt né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 float fallSpeed;
    private float slide;

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

    void Update()
    {
        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;
    }
}

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