🔥 Весь Код для Вашей Первой 2D Игры в Unity! Листинг из Видеоурока.
Описание:
Вы только что прошли наш видеоурок по созданию двухмерной игры в Unity и хотите получить доступ ко всему коду? Отлично! Здесь вы найдете полный листинг скриптов, которые мы использовали в видео, чтобы вы могли легко повторить процесс, экспериментировать или использовать их в своих собственных проектах.
Этот набор кода покрывает основные аспекты создания 2D игры:
- Управление ракетками
- UI элементы
- И многое другое!
Листинг Кода:
(Внимание! Весь код представлен ниже. Рекомендуется копировать его в соответствующие файлы .cs в вашем Unity проекте. Перед использованием убедитесь, что у вас созданы все необходимые игровые объекты, компоненты и префабы, как показано в видео.)
1. Скрипт Логика игры (GameManager.cs)
using UnityEngine;
public class GameManager : MonoBehaviour
{
public Pad pad;
public Ball ball;
public static Vector2 bottomLeft;
public static Vector2 topRight;
private void Start()
{
bottomLeft = Camera.main.ScreenToWorldPoint(new Vector2(0,0));
topRight = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, Screen.height));
Instantiate(ball);
Pad padVar1 = Instantiate(pad) as Pad;
Pad padVar2 = Instantiate(pad) as Pad;
padVar1.Init(true);
padVar2.Init(false);
}
}
2. Скрипт Ракеток (Pad.cs)
using UnityEngine;
public class Pad : MonoBehaviour
{
[SerializeField]
private float speed;
private float height;
private string inpt;
public bool isRightPad;
void Start()
{
height = transform.localScale.y;
}
public void Init(bool isRight)
{
isRightPad = isRight;
Vector2 pos = Vector2.zero;
if (isRight)
{
pos = new Vector2(GameManager.topRight.x, 0);
pos -= Vector2.right * transform.localScale.x;
inpt = "PadRight";
}
else
{
pos = new Vector2(GameManager.bottomLeft.x, 0);
pos += Vector2.right * transform.localScale.x;
inpt = "PadLeft";
}
transform.position = pos;
transform.name = inpt;
}
void Update()
{
float move = Input.GetAxis(inpt) * Time.deltaTime * speed;
if (transform.position.y < GameManager.bottomLeft.y + height / 2 && move < 0)
{
move = 0;
}
if(transform.position.y > GameManager.topRight.y - height / 2 && move > 0)
{
move = 0;
}
transform.Translate(move * Vector2.up);
}
}
3. Скрипт Мячика (Ball.cs)
using UnityEngine;
public class Ball : MonoBehaviour
{
[SerializeField]
private float speed = 5f; // Установим начальную скорость
private float radius;
private Vector2 direction;
// Ссылка на GameManager для доступа к границам поля
private GameManager gameManager;
private void Awake()
{
// Находим GameManager в сцене
gameManager = FindObjectOfType<GameManager>();
if (gameManager == null)
{
Debug.LogError("GameManager not found in the scene!");
enabled = false; // Отключаем скрипт, если GameManager не найден
return;
}
}
private void Start()
{
// Инициализация направления. Можно сделать случайным.
// direction = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f)).normalized;
// Если хотим стартовать всегда в одном направлении, например, вправо
direction = new Vector2(1f, Random.Range(-0.5f, 0.5f)).normalized; // Начальное направление немного вверх/вниз
radius = transform.localScale.x / 2f; // Убедимся, что делим на 2f для float
}
private void Update()
{
// Двигаем мяч
transform.Translate(direction * speed * Time.deltaTime);
// Проверка столкновения с верхним и нижним краями
if (transform.position.y <GameManager.bottomLeft.y + radius && direction.y < 0)
{
// Если мяч ниже нижнего края и движется вниз, отскочить вверх
direction.y = -direction.y;
// Слегка корректируем позицию, чтобы мяч не застревал
transform.position = new Vector3(transform.position.x, GameManager.bottomLeft.y + radius, transform.position.z);
}
else if (transform.position.y > GameManager.topRight.y - radius && direction.y > 0)
{
// Если мяч выше верхнего края и движется вверх, отскочить вниз
direction.y = -direction.y;
// Слегка корректируем позицию
transform.position = new Vector3(transform.position.x, GameManager.topRight.y - radius, transform.position.z);
}
// Проверка столкновения с левым и правым краями (гол)
if (transform.position.x < GameManager.bottomLeft.x + radius)
{
// Мяч ушел за левую границу -> правый игрок победил
Debug.Log("Правый игрок победил!");
ResetBall(); // Сброс мяча для новой игры
}
else if (transform.position.x > GameManager.topRight.x - radius)
{
// Мяч ушел за правую границу -> левый игрок победил
Debug.Log("Левый игрок победил!");
ResetBall(); // Сброс мяча для новой игры
}
}
private void OnTriggerEnter2D(Collider2D other)
{
// Проверяем, что объект является ракеткой (Pad)
if (other.CompareTag("Pad"))
{
Pad pad = other.GetComponent<Pad>();
if (pad != null)
{
bool isRightPad = pad.isRightPad;
// Логика отражения от ракетки
if (isRightPad && direction.x > 0) // Если это правая ракетка и мяч летит вправо
{
direction.x = -direction.x; // Меняем направление по X
// Дополнительная логика для угла отскока:
// Можно учесть, где именно мяч попал в ракетку.
// Например, если попал выше центра, отскок будет вверх, ниже центра - вниз.
// float hitPoint = (transform.position.y - other.transform.position.y) / pad.GetComponent<Collider2D>().bounds.size.y;
// direction.y = hitPoint * Mathf.Abs(direction.x) * 2; // Примерная зависимость угла от точки удара
// direction = direction.normalized; // Нормализуем, чтобы сохранить скорость
}
else if (!isRightPad && direction.x < 0) // Если это левая ракетка и мяч летит влево (ИСПРАВЛЕНО: = на ==)
{
direction.x = -direction.x; // Меняем направление по X
// Дополнительная логика для угла отскока (аналогично правой ракетке)
// float hitPoint = (transform.position.y - other.transform.position.y) / pad.GetComponent<Collider2D>().bounds.size.y;
// direction.y = hitPoint * Mathf.Abs(direction.x) * 2;
// direction = direction.normalized;
}
// Увеличиваем скорость при каждом ударе об ракетку (опционально)
// speed *= 1.05f;
}
}
}
// Функция для сброса мяча в центр после гола
private void ResetBall()
{
transform.position = Vector3.zero; // Возвращаем мяч в центр
// Сбрасываем направление, можно сделать случайным или всегда в одном направлении
direction = new Vector2(1f, Random.Range(-0.5f, 0.5f)).normalized;
speed = 5f; // Сбрасываем скорость к начальной (если она менялась)
// Можно добавить задержку перед началом игры или вызвать событие для Game Manager
// Invoke("ResumeGame", 1f); // Пример задержки
}
// Пример функции, которую можно вызвать после ResetBall()
// private void ResumeGame() { /* логика возобновления игры */ }
}
Надеемся, этот листинг кода поможет вам в дальнейшей разработке! Если у вас возникнут вопросы, не стесняйтесь задавать их в комментариях к видео или на нашем форуме. Удачи в создании вашей игры!
Хештеги: #Unity #GameDev #UnityTutorial #C# #Code #UnityCode #2DGame #GameProgramming #UnityAssets #GameDevelopment #UnityTips #ЛистингКода #Unity2D #IndieDev