صفوف أكثر ازدحامًا
الدرس 12 من 20 في دورة لعبة Unity: مسارات السماء على Coddy.
من السهل وضع عائق واحد في الصف: فالمساران الآخران يكونان خاليين دائمًا. لاحقًا أثناء الجولة، ينبغي أن يحتوي الصف على عائقين أو ثلاثة. يحصي made القطع بالفعل، لذا يمكنه تحديد عدد العوائق التي قد يحتويها الصف:
int busy = Mathf.Min(3, 1 + made / 12);
int count = Random.Range(1, busy + 1);يجب ألا يشترك عائقان في المسار نفسه. احتفظ بالمسارات الخالية في قائمة، وأزل كل مسار منها مرة واحدة عند استخدامه. كما أن وضع ثلاثة جدران في صف واحد سيجعل المرور مستحيلًا، لذا عند وجود جدارين اختر حاجزًا أو عارضة بدلًا من ذلك.
List<int> lanes = new List<int> { -1, 0, 1 };
int pick = Random.Range(0, lanes.Count);
int lane = lanes[pick];
lanes.RemoveAt(pick);التحدي
متوسط- في
Fill، احسبbusyوcountكما سبق. - ضع
countمن العوائق، كلًّا منها في مسار أُزيل منlanes. - احسب الجدران؛ عندما يكون
kind == 2ويكون هناك جداران بالفعل، اخترRandom.Range(0, 2)بدلًا من ذلك.
جرّب بنفسك
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();
}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس لعبة Unity: مسارات السماء
تدرّب بنفسك: Playground لـ Unity