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>.
Tantangan
Mudah- Di
GameManager, tambahkanpublic float startSpeed = 10f;danpublic float speed;, lalu tetapkanspeed = startSpeeddi Start. - Di
Road, tambahkanprivate List<Transform> chunks = new List<Transform>();(denganusing System.Collections.Generic;) danprivate GameManager game;. - Di Start, tetapkan
game = FindFirstObjectByType<GameManager>();dan tambahkan setiap bagian baru kechunks. - Tulis
Updateseperti 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