Menu
CoddyTech

Daur Ulang Jalan

Pelajaran 7 dari 20 dalam kursus Game Unity: Sky Lanes di Coddy.

Tujuh potongan membentuk jalan sepanjang 140 unit. Dengan kecepatan 10 unit per detik, jalan itu habis dalam 14 detik. Membuat potongan baru setiap kali dibutuhkan dan menghancurkan potongan lama bisa dilakukan, tetapi ada cara yang lebih hemat: potongan yang sudah melewati pelari dipindahkan ke depan untuk digunakan kembali.

Potongan sepenuhnya berada di belakang saat titik tengahnya melewati -chunkLength. Ada tujuh potongan dalam satu baris, jadi memindahkannya maju sejauh tujuh kali panjangnya akan menempatkannya tepat setelah potongan terakhir:

if (chunk.position.z < -chunkLength)
{
    chunk.position += Vector3.forward * chunkLength * chunks.Count;
}

Menggunakan kembali objek alih-alih menghancurkannya dan membuat objek baru disebut pooling. Tujuh potongan membentuk jalan tanpa akhir.

challenge icon

Tantangan

Mudah
  1. Di Road.Update, setelah sebuah bagian bergerak, pindahkan ke depan saat sudah sepenuhnya berada di belakang, seperti di atas.

Coba sendiri

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;
    }
}

Semua pelajaran di Game Unity: Sky Lanes

Latihan sendiri: Playground Unity