Найти в Дзене
KNL Games

Листинг кода к видео "Создание двухмерной игры в Unity"

🔥 Весь Код для Вашей Первой 2D Игры в Unity! Листинг из Видеоурока. Вы только что прошли наш видеоурок по созданию двухмерной игры в Unity и хотите получить доступ ко всему коду? Отлично! Здесь вы найдете полный листинг скриптов, которые мы использовали в видео, чтобы вы могли легко повторить процесс, экспериментировать или использовать их в своих собственных проектах. Этот набор кода покрывает основные аспекты создания 2D игры: (Внимание! Весь код представлен ниже. Рекомендуется копировать его в соответствующие файлы .cs в вашем Unity проекте. Перед использованием убедитесь, что у вас созданы все необходимые игровые объекты, компоненты и префабы, как показано в видео.) 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, Scr
Оглавление

🔥 Весь Код для Вашей Первой 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