Bangun Jalan
Pelajaran 5 dari 20 dalam kursus Game Unity: Sky Lanes di Coddy.
Sampai sekarang, pelari berdiri di atas balok polos bernama Ground. Mulai dari sini, skrip Road membangun jalan, dan balok itu pun tidak ada lagi.
Jalan dibuat dari potongan-potongan sepanjang 20 unit, disusun berurutan. Satu potongan adalah GameObject kosong bernama Chunk, dan semua yang ada di potongan itu menjadi anaknya: lantai, garis putus-putus di antara jalur, dan kedua tepinya. Memindahkan potongan itu akan memindahkan semuanya.
Transform chunk = new GameObject("Chunk").transform;
chunk.position = new Vector3(0f, 0f, i * chunkLength);
Instantiate(floorPrefab, chunk.position + new Vector3(0f, -0.25f, 0f), Quaternion.identity, chunk);Argumen terakhir Instantiate adalah induknya. Lantai memiliki ketebalan setengah unit, jadi bagian tengahnya berada seperempat unit di bawah permukaan jalan pada y 0.
Setiap garis jalur terdiri dari empat garis putus-putus, masing-masing sepanjang 3, dengan jarak 5 unit, pada x -laneWidth / 2f dan laneWidth / 2f. Tepi jalan berada pada x -4.1 dan 4.1, y 0.05.
Tantangan
Mudah- Di dalam
Road, tambahkan field prefabfloorPrefab,stripePrefab, danedgePrefab(semuanyapublic GameObject), sertachunkCount = 7,chunkLength = 20f,laneWidth = 2.5f. Inspector mengisi prefab tersebut. - Di dalam
Start, buatchunkCountpotongan, dengan potonganiberada di zi * chunkLength, masing-masing dengan lantainya. - Pada setiap potongan, untuk d dari 0 sampai 3, letakkan dua garis putus-putus pada z
-7.5f + d * 5f, y 0.01, satu di setiap garis jalur. - Letakkan kedua tepi jalan.
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