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;
}Tantangan
Mudah- Tambahkan
public float slideTime = 0.7f;danprivate float slide;. - Tambahkan
ResizedanStopSlideseperti di atas. - Saat S atau panah bawah ditekan ketika pelari berada di tanah, atur
slide = slideTimedan panggilResize(0.5f). - Pada setiap frame, jika
slide > 0f, kurangi nilainya denganTime.deltaTime, lalu panggilStopSlide()saat nilainya mencapai 0. - 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