Recycle die Straße
Lektion 7 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.
Sieben Abschnitte ergeben 140 Einheiten Straße. Bei 10 Einheiten pro Sekunde ist die Straße nach 14 Sekunden aufgebraucht. Jedes Mal, wenn ein neuer Abschnitt benötigt wird, einen zu erstellen und alte zu zerstören, würde funktionieren, aber es gibt einen günstigeren Weg: Ein Abschnitt, der hinter dem Läufer vorbeigezogen ist, wird nach vorne versetzt und wiederverwendet.
Ein Abschnitt befindet sich vollständig dahinter, sobald seine Mitte hinter -chunkLength liegt. Sieben Abschnitte hintereinander, also wird er um sieben Abschnittslängen nach vorne versetzt und landet direkt hinter dem letzten:
if (chunk.position.z < -chunkLength)
{
chunk.position += Vector3.forward * chunkLength * chunks.Count;
}Objekte wiederzuverwenden, anstatt sie zu zerstören und neue zu erstellen, nennt man Pooling. Sieben Abschnitte ergeben eine endlose Straße.
Aufgabe
Einfach- Bewege in
Road.Updateein Teilstück nach vorne, sobald es vollständig dahinter liegt, wie oben beschrieben.
Probier es selbst
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;
}
}
Alle Lektionen in Unity-Spiel: Himmelsbahnen
Übe selbstständig: Unity-Playground