Münzen
Lektion 13 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.
Münzen geben dem Spieler einen Grund, die Spur zu wechseln, wenn nichts im Weg ist. Auf jedem Streckenabschnitt wird nach den Hindernissen eine Reihe aus vier Münzen in einer Spur platziert, bei 4, 7, 10 und 13 entlang des Abschnitts und bei y 1.
Eine Münze dreht sich selbstständig, mit ihrem eigenen Skript:
void Update()
{
transform.Rotate(0f, 0f, spinSpeed * Time.deltaTime);
}Das Münz-Prefab liegt auf der Seite, sodass seine eigene z-Achse nach oben zeigt: Eine Drehung um z lässt sie sich wie eine Münze auf einem Tisch drehen.
Das Einsammeln ist Aufgabe des Runner, im selben OnTriggerEnter: Eine Münze fügt über game.AddCoin() eine Münze hinzu und wird zerstört.
Aufgabe
Einfach- Füge in
Coinpublic float spinSpeed = 180f;und das obige Update hinzu. - Füge in
RoadcoinPrefabhinzu und platziere am Ende vonFill4 Münzen in einer zufälligen Spur bei z4f + i * 3f. - Füge in
GameManagerpublic TMP_Text coinText;,public int coins;undpublic void AddCoin()hinzu (eine weitere Münze, dannShowScore()). ShowScore setzt außerdemcoinText.text = "Coins: " + coins;. - Füge in
Runner.OnTriggerEnterelse if (other.CompareTag("Coin"))hinzu: Füge die Münze hinzu und zerstöre sie.
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 GameManager game;
private float fallSpeed;
private float slide;
void Start()
{
controller = GetComponent<CharacterController>();
game = FindFirstObjectByType<GameManager>();
}
void Update()
{
if (!game.over)
{
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;
}
void OnTriggerEnter(Collider other)
{
if (game.over) return;
if (other.CompareTag("Obstacle"))
{
game.GameOver();
}
}
}
Alle Lektionen in Unity-Spiel: Himmelsbahnen
Übe selbstständig: Unity-Playground