Menu
CoddyTech

Meluncur

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

Beberapa rintangan tergantung terlalu tinggi untuk dilompati, jadi pelari meluncur melewatinya. Saat meluncur, tinggi pelari menjadi setengah untuk sesaat.

Mengecilkan objek juga mengecilkan CharacterController-nya, tetapi objek mengecil dari bagian tengah, sehingga kaki akan melayang setengah unit di atas jalan. Turunkan pelari sejauh setengah unit yang sama. Controller harus dinonaktifkan saat kamu memindahkannya secara manual, atau pemanggilan Move berikutnya akan membatalkan perubahan itu:

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

Sebuah pengatur waktu, slide, menghitung mundur durasi meluncur. Saat waktunya habis, pelari berdiri kembali dengan StopSlide:

void StopSlide()
{
    if (transform.localScale.y < 1f) Resize(1f);
    slide = 0f;
}
challenge icon

Tantangan

Mudah
  1. Tambahkan public float slideTime = 0.7f; dan private float slide;.
  2. Tambahkan Resize dan StopSlide seperti di atas.
  3. Saat S atau panah bawah ditekan ketika pelari berada di tanah, atur slide = slideTime dan panggil Resize(0.5f).
  4. Pada setiap frame, jika slide > 0f, kurangi nilainya dengan Time.deltaTime, lalu panggil StopSlide() saat nilainya mencapai 0.
  5. Lompatan mengakhiri slide: panggil StopSlide() saat pelari melompat.

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 int lane;

    private CharacterController controller;
    private float fallSpeed;

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

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

Semua pelajaran di Game Unity: Sky Lanes

Latihan sendiri: Playground Unity