Menu
CoddyTech

Bangun Jalan

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

Sampai sekarang, pelari berdiri di atas balok polos bernama Ground. Mulai dari sini, skrip Road membangun jalan, dan balok itu pun tidak ada lagi.

Jalan dibuat dari potongan-potongan sepanjang 20 unit, disusun berurutan. Satu potongan adalah GameObject kosong bernama Chunk, dan semua yang ada di potongan itu menjadi anaknya: lantai, garis putus-putus di antara jalur, dan kedua tepinya. Memindahkan potongan itu akan memindahkan semuanya.

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

Argumen terakhir Instantiate adalah induknya. Lantai memiliki ketebalan setengah unit, jadi bagian tengahnya berada seperempat unit di bawah permukaan jalan pada y 0.

Setiap garis jalur terdiri dari empat garis putus-putus, masing-masing sepanjang 3, dengan jarak 5 unit, pada x -laneWidth / 2f dan laneWidth / 2f. Tepi jalan berada pada x -4.1 dan 4.1, y 0.05.

challenge icon

Tantangan

Mudah
  1. Di dalam Road, tambahkan field prefab floorPrefab, stripePrefab, dan edgePrefab (semuanya public GameObject), serta chunkCount = 7, chunkLength = 20f, laneWidth = 2.5f. Inspector mengisi prefab tersebut.
  2. Di dalam Start, buat chunkCount potongan, dengan potongan i berada di z i * chunkLength, masing-masing dengan lantainya.
  3. Pada setiap potongan, untuk d dari 0 sampai 3, letakkan dua garis putus-putus pada z -7.5f + d * 5f, y 0.01, satu di setiap garis jalur.
  4. Letakkan kedua tepi jalan.

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