מחזרו את הדרך
שיעור 7 מתוך 20 בקורס משחק Unity: נתיבי שמיים של Coddy.
שבעה חלקים הם 140 יחידות של כביש. במהירות של 10 יחידות בשנייה, הכביש נגמר אחרי 14 שניות. יצירת חלק חדש בכל פעם שצריך אחד והשמדת החלקים הישנים יעבדו, אבל יש דרך חסכונית יותר: מעבירים חלק שעבר מאחורי הרץ אל החזית ומשתמשים בו שוב.
חלק נמצא כולו מאחור ברגע שהאמצע שלו עובר את -chunkLength. מכיוון שיש שבעה חלקים ברצף, הזזה שלו קדימה בשבעה אורכים מציבה אותו בדיוק אחרי החלק האחרון:
if (chunk.position.z < -chunkLength)
{
chunk.position += Vector3.forward * chunkLength * chunks.Count;
}שימוש חוזר באובייקטים במקום להשמיד אותם וליצור חדשים נקרא איגום. שבעה חלקים יוצרים כביש אינסופי.
אתגר
קל- ב־
Road.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: נתיבי שמיים
תרגלו בעצמכם: Unity אונליין