Bewege die Straße
Lektion 6 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.
In einem Runner bleibt der Spieler an Ort und Stelle, während die Welt auf ihn zukommt. Die Kamera und den Spieler für immer nach vorne zu bewegen, würde auch funktionieren, aber die Zahlen würden unbegrenzt wachsen; wenn man die Straße bewegt, bleibt alles nahe null.
Die Geschwindigkeit gilt für das ganze Spiel und befindet sich daher in GameManager. Die Straße findet sie einmal in Start und liest ihre Geschwindigkeit in jedem Frame aus:
float step = game.speed * Time.deltaTime;
foreach (Transform chunk in chunks)
{
chunk.position += Vector3.back * step;
}Vector3.back ist (0, 0, -1): zur Kamera hin. Damit die Straße die Teile später bewegen kann, muss sie sie in einer List<Transform> speichern.
Aufgabe
Einfach- Füge in
GameManagerpublic float startSpeed = 10f;undpublic float speed;hinzu und setze in Startspeed = startSpeed. - Füge in
Roadprivate List<Transform> chunks = new List<Transform>();(mitusing System.Collections.Generic;) undprivate GameManager game;hinzu. - Setze in Start
game = FindFirstObjectByType<GameManager>();und füge jedes neue Teil zuchunkshinzu. - Schreibe
Updatewie oben.
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