Потерять мяч
Урок 8 из 16 курса Игра в Unity: арканоид на Coddy.
Мяч, пролетевший мимо ракетки, потерян. Под ракеткой в сцене теперь есть DeathZone: объект с коллайдером типа Box Collider, у которого включён параметр Is Trigger, и тегом DeathZone. Триггер ничего не останавливает; он отправляет сообщение OnTriggerEnter(Collider other), когда в него входит объект с компонентом Rigidbody. Мяч сообщает о потере GameManager, который управляет жизнями и решает, что делать дальше.
Шарик, упавший в воду, появляется снова в точке появления:
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Water")) Respawn();
}
void Respawn()
{
rb.linearVelocity = Vector3.zero;
transform.position = spawnPoint.position;
}Мячу нужно меньше, чем шарику. Его Update() и так каждый кадр помещает его на ракетку, пока launched равно false, поэтому для сброса достаточно сбросить этот флаг и остановить мяч: на следующем кадре он вернётся на ракетку, а затем снова запустится нажатием Space.
Задание
Средне- В
Ballнапишитеpublic void ResetToPaddle(): мяч больше не запущен и перестаёт двигаться. - Добавьте
OnTriggerEnterвBall: когда мяч входит в объект с тегомDeathZone, вызовитеGameManager.Instance.BallLost(this). - В
GameManagerдобавьтеpublic int lives = 3иpublic void BallLost(Ball lost): на одну жизнь меньше, а потерянный мяч возвращается на платформу.
Игра пока не завершена, поэтому счётчик жизней пока может опуститься ниже 0.
Нажмите Play, намеренно пропустите мяч, снова запустите его, затем нажмите Check.
Попробуйте сами
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Brick brickPrefab;
public Transform wall;
public int rows = 5;
public int columns = 9;
public float spacingX = 1.75f;
public float spacingY = 0.75f;
public float topY = 6f;
public int[] rowHits = { 2, 1, 1, 1, 1 };
int score;
void Awake()
{
Instance = this;
}
void Start()
{
BuildWall();
}
void BuildWall()
{
float left = -(columns - 1) * spacingX / 2f;
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < columns; col++)
{
Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
brick.SetHits(rowHits[row]);
}
}
}
public void BrickBroken(Brick brick)
{
score += brick.points;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.