Menu
CoddyTech

Rintangan

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

Sekarang jalan membutuhkan sesuatu untuk dihindari. Setiap bagian mendapat rintangan di tengah, di jalur acak. Sebuah method melakukannya, Fill, yang dipanggil untuk setiap bagian baru di Start dan sekali lagi setiap kali sebuah bagian kembali ke depan.

Dua bagian pertama tetap kosong untuk memberi pemain waktu sejenak: Road menghitung bagian yang telah diisinya di made.

void Fill(Transform chunk)
{
    made++;
    if (made <= safeChunks) return;

    int lane = Random.Range(-1, 2);
    Place(chunk, barrierPrefab, lane, 0.5f, 0f);
}

Random.Range(-1, 2) menghasilkan -1, 0, atau 1: untuk bilangan bulat, angka kedua tidak pernah dipilih.

Bagian yang didaur ulang masih membawa rintangan lamanya. Clear menghancurkan setiap anak yang memiliki tag. Lantai, garis putus-putus, dan tepi tidak memiliki tag, jadi semuanya tetap:

void Clear(Transform chunk)
{
    foreach (Transform child in chunk)
    {
        if (!child.CompareTag("Untagged")) Destroy(child.gameObject);
    }
}
challenge icon

Tantangan

Mudah
  1. Di Road, tambahkan public GameObject barrierPrefab;, public int safeChunks = 2; dan private int made;.
  2. Tulis Place(chunk, prefab, lane, y, z): fungsi ini membuat prefab pada chunk.position + new Vector3(lane * laneWidth, y, z) dengan prefab.transform.rotation, sebagai anak dari potongan jalan.
  3. Tulis Fill dan Clear seperti di atas.
  4. Panggil Fill(chunk) untuk setiap potongan di Start, dan Clear(chunk); Fill(chunk); saat sebuah potongan bergerak ke depan.

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