Multiball
Lektion 15 von 16 im Kurs Unity-Spiel: Brick Breaker von Coddy.
Ein Multiball-Power-up teilt den Ball: Zwei Kopien fliegen von seiner aktuellen Position aus los. Instantiate kopiert ein Szenenobjekt wie ein Prefab, aber übernommen wird nur, was der Inspector speichern würde: öffentliche Felder und [SerializeField]-Felder wie speed und paddle. Ein privates Feld wie launched erhält seinen Standardwert, false, und die Geschwindigkeit des Rigidbody beginnt bei null. Eine Kopie muss also angewiesen werden, was sie tun soll, sonst fährt sie auf dem Paddle mit.
Wenn mehrere Bälle im Spiel sind, verwaltet der GameManager sie in einer List<Ball>, und ein verlorener Ball kostet nur dann ein Leben, wenn er der letzte ist. Schleime, die sich teilen, funktionieren genauso:
List<Slime> slimes = new List<Slime>();
public void Split(Slime slime)
{
Slime half = Instantiate(slime, slime.transform.position, Quaternion.identity);
half.Hop(Vector3.left); // Die privaten Felder der Kopie werden neu initialisiert: Weise ihr an, was sie tun soll
slimes.Add(half);
}
public void SlimeDied(Slime slime)
{
slimes.Remove(slime);
Destroy(slime.gameObject);
if (slimes.Count == 0) Debug.Log("Room cleared");
}Der erste Ball in der Liste kann eine Kopie sein, da der ursprüngliche Ball verloren gehen kann, während die Kopien weiterfliegen. Code, der den Ball benötigt, verwendet daher die Liste und nicht das Ball-Feld aus der Szene.
Aufgabe
Schwer- Füge in
GameManagerusing System.Collections.Generic;undList<Ball> balls = new List<Ball>();hinzu.Start()fügt zuerstballzur Liste hinzu. - Schreibe
public void SplitBall(): Erzeuge zwei Kopien vonballs[0]an dessen Position. Eine wird in Richtungnew Vector3(-0.6f, 1f, 0f)und die andere in Richtungnew Vector3(0.6f, 1f, 0f)gestartet. Füge beide zur Liste hinzu. - Ändere
BallLost: Solange sich mehr als ein Ball in der Liste befindet, wird der verlorene Ball aus der Liste entfernt und zerstört, ohne dass ein Leben verloren geht. Wenn ein Level abgeschlossen ist, setzeballs[0]stattballauf das Paddel zurück. - In
PowerUpruft ein Multiball beim FangenGameManager.Instance.SplitBall()auf.
Drücke Play, fange ein rosa Power-up und klicke dann auf Check.
Probier es selbst
using UnityEngine;
using UnityEngine.SceneManagement;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Brick brickPrefab;
public Transform wall;
public string[] levels;
public float spacingX = 1.75f;
public float spacingY = 0.75f;
public float topY = 6f;
public Ball ball;
public int lives = 3;
public TMP_Text scoreText;
public TMP_Text livesText;
public GameObject gameOverPanel;
public GameObject[] powerUps;
public float dropChance = 0.15f;
int score;
int level;
int bricksLeft;
void Awake()
{
Instance = this;
}
void Start()
{
BuildLevel(0);
ShowHud();
}
void BuildLevel(int index)
{
level = index;
string[] rows = levels[index].Split('/');
for (int row = 0; row < rows.Length; row++)
{
string line = rows[row];
float left = -(line.Length - 1) * spacingX / 2f;
for (int col = 0; col < line.Length; col++)
{
char c = line[col];
if (c == '.') continue;
Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
brick.SetHits(c - '0');
bricksLeft++;
}
}
}
public void BrickBroken(Brick brick)
{
score += brick.points;
bricksLeft--;
ShowHud();
if (Random.value < dropChance)
{
GameObject prefab = powerUps[Random.Range(0, powerUps.Length)];
Instantiate(prefab, brick.transform.position, Quaternion.identity);
}
if (bricksLeft == 0)
{
ball.ResetToPaddle();
BuildLevel((level + 1) % levels.Length);
}
}
public void BallLost(Ball lost)
{
lives--;
ShowHud();
if (lives == 0)
{
gameOverPanel.SetActive(true);
lost.gameObject.SetActive(false);
}
else lost.ResetToPaddle();
}
public void PlayAgain()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
void ShowHud()
{
scoreText.text = "Score: " + score;
livesText.text = "Lives: " + lives;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.