Menu
CoddyTech

Pindahkan Jalan

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

Dalam game lari tanpa akhir, pemain tetap di tempat dan dunia bergerak mendekatinya. Kamera dan pemain juga bisa terus bergerak maju, tetapi angkanya akan terus membesar tanpa batas. Dengan menggerakkan jalan, semuanya tetap mendekati nol.

Kecepatan berlaku untuk seluruh game, jadi nilainya disimpan di GameManager. Road menemukannya sekali di Start dan membaca kecepatannya setiap frame:

float step = game.speed * Time.deltaTime;
foreach (Transform chunk in chunks)
{
    chunk.position += Vector3.back * step;
}

Vector3.back adalah (0, 0, -1), ke arah kamera. Agar bisa memindahkan potongan-potongan itu nanti, Road harus menyimpannya dalam List<Transform>.

challenge icon

Tantangan

Mudah
  1. Di GameManager, tambahkan public float startSpeed = 10f; dan public float speed;, lalu tetapkan speed = startSpeed di Start.
  2. Di Road, tambahkan private List<Transform> chunks = new List<Transform>(); (dengan using System.Collections.Generic;) dan private GameManager game;.
  3. Di Start, tetapkan game = FindFirstObjectByType<GameManager>(); dan tambahkan setiap bagian baru ke chunks.
  4. Tulis Update 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