حرّك الطريق
الدرس 6 من 20 في دورة لعبة Unity: مسارات السماء على Coddy.
في لعبة الركض، يبقى اللاعب في مكانه ويأتيه العالم. يمكن أيضًا تحريك الكاميرا واللاعب إلى الأمام إلى ما لا نهاية، لكن الأرقام ستكبر بلا نهاية؛ أما تحريك الطريق فيُبقي كل شيء قريبًا من الصفر.
تعود السرعة إلى اللعبة بأكملها، لذا فهي موجودة في GameManager. يعثر الطريق عليها مرة واحدة في Start ويقرأ سرعته في كل إطار:
float step = game.speed * Time.deltaTime;
foreach (Transform chunk in chunks)
{
chunk.position += Vector3.back * step;
}تعني Vector3.back (0, 0, -1): باتجاه الكاميرا. لتحريك القطع لاحقًا، يجب أن يتذكرها الطريق في List<Transform>.
التحدي
سهل- في
GameManagerأضفpublic float startSpeed = 10f;وpublic float speed;، واجعلspeed = startSpeedفي Start. - في
Roadأضفprivate List<Transform> chunks = new List<Transform>();(معusing System.Collections.Generic;) وprivate GameManager game;. - في Start عيّن
game = FindFirstObjectByType<GameManager>();وأضف كل قطعة جديدة إلىchunks. - اكتب
Updateكما ورد أعلاه.
جرّب بنفسك
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: مسارات السماء
تدرّب بنفسك: Playground لـ Unity