Drei Bälle
Lektion 17 von 19 im Kurs Unity-Spiel: Brick Breaker von Coddy.
Ein Multiball-Power-up teilt den Ball: Zwei Kopien fliegen von seiner aktuellen Position weg. Instantiate kopiert ein Szenenobjekt genauso wie ein Prefab, aber übernommen wird nur, was der Inspector speichern würde: öffentliche Felder und Felder mit [SerializeField], etwa speed und paddle. Ein privates Feld wie launched beginnt mit dem Wert false und die Geschwindigkeit mit null, daher muss eine Kopie gestartet werden, sonst bleibt sie am Schläger.
Ball copy = Instantiate(source, source.transform.position, Quaternion.identity);
copy.Launch(new Vector3(0.2f, 1f, 0f));Der GameManager behält jeden Ball, der gerade im Spiel ist, in einer List<Ball>, damit er sie später finden kann.
Aufgabe
SchwerFange ein Multiball-Power-up, und der Ball teilt sich in drei.
- Füge in
GameManagerList<Ball> balls = new List<Ball>();hinzu (mitusing System.Collections.Generic;); Start() fügt zuerstballhinzu. - Schreibe
public void SplitBall(): zwei Kopien vonballs[0]an dessen Position, die in Richtung(-0.6f, 1f, 0f)und(0.6f, 1f, 0f)gestartet werden und beide zu balls hinzugefügt werden. - Ein Multiball ruft in
PowerUpGameManager.Instance.SplitBall()auf.
Drücke „Spielen“ und fange ein pinkes Power-up: Drei Bälle fliegen. Drücke dann „Prüfen“.
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;
}
}
Alle Lektionen in Unity-Spiel: Brick Breaker
Übe selbstständig: Unity-Playground