Daha Yoğun Satırlar
Coddy'nin Unity Oyunu: Gökyüzü Şeritleri kursunda ders 12 / 20.
Bir engelin olduğu bir sırada diğer iki şerit boştur. Koşu ilerledikçe sıralarda iki ya da üç engel bulunmalıdır. made parça sayısını zaten sayar, bu yüzden bir sıranın ne kadar dolu olabileceğini belirleyebilir:
int busy = Mathf.Min(3, 1 + made / 12);
int count = Random.Range(1, busy + 1);İki engel aynı şeritte bulunmamalıdır. Boş şeritleri bir listede tut ve her şeridi kullandıktan sonra listeden çıkar. Ayrıca art arda üç duvar geçiş yolu bırakmaz; bu yüzden iki duvar olduğunda bunun yerine bir bariyer ya da çubuk seç.
List<int> lanes = new List<int> { -1, 0, 1 };
int pick = Random.Range(0, lanes.Count);
int lane = lanes[pick];
lanes.RemoveAt(pick);Görev
OrtaFilliçinde, yukarıdaki gibibusyvecountdeğerlerini hesapla.countkadar engeli, her birinilaneslistesinden çıkarılan bir şeride yerleştir.- Duvarları say;
kind == 2olduğunda ve zaten iki duvar varsa, bunun yerineRandom.Range(0, 2)seç.
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 GameManager game;
private float fallSpeed;
private float slide;
void Start()
{
controller = GetComponent<CharacterController>();
game = FindFirstObjectByType<GameManager>();
}
void Update()
{
if (!game.over)
{
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;
}
void OnTriggerEnter(Collider other)
{
if (game.over) return;
if (other.CompareTag("Obstacle"))
{
game.GameOver();
}
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Unity Oyunu: Gökyüzü Şeritleri bölümündeki tüm dersler
Kendi başına pratik yap: Unity playground