Baue die Straße
Lektion 5 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.
Bisher stand der Läufer auf einem einfachen Block namens Ground. Ab hier erstellt das Skript Road die Straße, und der Block ist verschwunden.
Die Straße besteht aus Stücken, die 20 Einheiten lang sind und hintereinander angeordnet werden. Ein Stück ist ein leeres GameObject namens Chunk, und alles auf diesem Stück ist sein untergeordnetes Objekt: der Boden, die Striche zwischen den Fahrspuren und die beiden Ränder. Wenn das Stück bewegt wird, bewegt sich alles darauf mit.
Transform chunk = new GameObject("Chunk").transform;
chunk.position = new Vector3(0f, 0f, i * chunkLength);
Instantiate(floorPrefab, chunk.position + new Vector3(0f, -0.25f, 0f), Quaternion.identity, chunk);Das letzte Argument von Instantiate ist das übergeordnete Objekt. Der Boden ist eine halbe Einheit dick, sodass seine Mitte ein Viertel unter der Straßenoberfläche bei y 0 liegt.
Jede Fahrspurmarkierung besteht aus vier Strichen mit einer Länge von 3, jeweils im Abstand von 5 Einheiten, bei x -laneWidth / 2f und laneWidth / 2f. Die Ränder liegen bei x -4.1 und 4.1, y 0.05.
Aufgabe
Einfach- Füge in
Roaddie Prefab-FelderfloorPrefab,stripePrefabundedgePrefab(allepublic GameObject) sowiechunkCount = 7,chunkLength = 20fundlaneWidth = 2.5fhinzu. Der Inspector füllt die Prefabs aus. - Erzeuge in
StartchunkCountTeile, wobei Teilibei zi * chunkLengthliegt und jeweils einen Boden hat. - Platziere auf jedem Teil für d von 0 bis 3 zwei Striche bei z
-7.5f + d * 5fund y 0.01, je einen auf jeder Fahrstreifenlinie. - Platziere die beiden Ränder.
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