Yolu Oluştur
Coddy'nin Unity Oyunu: Gökyüzü Şeritleri kursunda ders 5 / 20.
Şimdiye kadar koşucu, Ground adlı düz bir bloğun üzerinde duruyordu. Buradan itibaren Road betiği yolu oluşturur ve blok ortadan kalkar.
Yol, art arda dizilmiş, her biri 20 birim uzunluğunda parçalardan oluşur. Bir parça, Chunk adlı boş bir GameObject'tir ve o parçadaki her şey onun alt öğesidir: zemin, şeritler arasındaki kesikli çizgiler ve iki kenar. Parçayı hareket ettirmek, içindeki her şeyi de hareket ettirir.
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);Instantiate işlevinin son argümanı üst öğedir. Zemin yarım birim kalınlığındadır; bu nedenle orta noktası, y 0'daki yol yüzeyinin çeyrek birim altındadır.
Her şerit çizgisi, her 5 birimde bir yerleştirilmiş, uzunluğu 3 birim olan dört kesikli çizgiden oluşur; x konumları -laneWidth / 2f ve laneWidth / 2f değerlerindedir. Kenarlar x -4.1 ve 4.1, y 0.05 konumundadır.
Görev
KolayRoadiçinde prefab alanlarınıfloorPrefab,stripePrefabveedgePrefab(tümüpublic GameObject) olarak vechunkCount = 7,chunkLength = 20f,laneWidth = 2.5fdeğerlerini ekle. Inspector prefab’ları doldurur.StartiçindechunkCountadet parça oluştur;iparçasını z konumundai * chunkLengtholacak şekilde yerleştir ve her parçaya zeminini ekle.- Her parçada, d değeri 0’dan 3’e kadar değişirken, z konumu
-7.5f + d * 5fve y konumu 0.01 olan iki çizgiyi, her şerit çizgisine bir tane gelecek şekilde yerleştir. - İki kenar parçasını yerleştir.
Kendin dene
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;
}
}
Unity Oyunu: Gökyüzü Şeritleri bölümündeki tüm dersler
Kendi başına pratik yap: Unity playground