Rintangan
Pelajaran 9 dari 20 dalam kursus Game Unity: Sky Lanes di Coddy.
Sekarang jalan membutuhkan sesuatu untuk dihindari. Setiap bagian mendapat rintangan di tengah, di jalur acak. Sebuah method melakukannya, Fill, yang dipanggil untuk setiap bagian baru di Start dan sekali lagi setiap kali sebuah bagian kembali ke depan.
Dua bagian pertama tetap kosong untuk memberi pemain waktu sejenak: Road menghitung bagian yang telah diisinya di made.
void Fill(Transform chunk)
{
made++;
if (made <= safeChunks) return;
int lane = Random.Range(-1, 2);
Place(chunk, barrierPrefab, lane, 0.5f, 0f);
}Random.Range(-1, 2) menghasilkan -1, 0, atau 1: untuk bilangan bulat, angka kedua tidak pernah dipilih.
Bagian yang didaur ulang masih membawa rintangan lamanya. Clear menghancurkan setiap anak yang memiliki tag. Lantai, garis putus-putus, dan tepi tidak memiliki tag, jadi semuanya tetap:
void Clear(Transform chunk)
{
foreach (Transform child in chunk)
{
if (!child.CompareTag("Untagged")) Destroy(child.gameObject);
}
}Tantangan
Mudah- Di
Road, tambahkanpublic GameObject barrierPrefab;,public int safeChunks = 2;danprivate int made;. - Tulis
Place(chunk, prefab, lane, y, z): fungsi ini membuat prefab padachunk.position + new Vector3(lane * laneWidth, y, z)denganprefab.transform.rotation, sebagai anak dari potongan jalan. - Tulis
FilldanClearseperti di atas. - Panggil
Fill(chunk)untuk setiap potongan di Start, danClear(chunk); Fill(chunk);saat sebuah potongan bergerak ke depan.
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