Баннер записи 'Начало девблога спустя неделю Apollo Game Jam или как успеть сделать неуспеваемое'

Начало девблога спустя неделю Apollo Game Jam или как успеть сделать неуспеваемое

Идея игры:

Тема у Apollo Game Jam была выбрана "конец неизбежен". Однако я не просто ориентируюсь на тему геймджема, но ещё и на специфику организации, которая проводит этот джем. Сама организация занимается паблишингом мобильных игр, то есть их публикацией в мобильные магазины и монетизацией проектов. Исходя из этого было решено создать игру, которую можно легко монетизировать, встроить туда рекламу, микро транзакции и прочую подобную дичь. Т.к. игра должна удерживать игрока как можно дольше, я принял решение сделать аркадный рогалик с прокачкой и скинами (если я не совсем правильно определил жанр поправьте в комментах после прочтения). Сама суть игры довольно близка к rider (отчасти им и вдохновился), игрок начинает забег, он играет за космический корабль, который улетает от взрыва на космической станции, кораблю необходимо преодолевать препятствия на пути и собирать разные предметы (пока не решил какие конкретно). В случае если игрок врежется в препятствие или его догонит взрыв, он проиграет и сможет начать новый забег, или улучшить корабль (про улучшения и их связь с геймплеем распишу в следующих блогах, сейчас нет полного понимая).

Геймплей:

Управление кораблём осуществляется с помощью движения пальцем по экрану, при нажатии корабль ускоряется (до максимальной скорости), при сдвижении пальца вправо от модельки корабля она сдвигается вправо, при сдвижении влево - идёт влево, при отпускании пальца (отсутствие нажатия) корабль замедляется и движется по иг

Основную механику полёта и процедурного генерирования уровней я уже создал.

На картинке можно увидеть, что я работаю в стадии прототипа, у меня сделан игрок (фиолетовый квадрат), процедурно генерируемые препятствия (на картинке только один серый квадрат, далее распишу про них больше), динамический задний фон (белые квадратики, в будущем будут звёздами , их я сделал с помощью партиклов)

Сейчас у меня препятствия генерируются только из 3 вариантов, в будущем я добавлю больше разных уровней.
Счёт наверху картинки считается с помощью формулы скорости умноженной на время с этой скоростью.

При столкновении с препятствием у меня сейчас появляется экран смерти с кнопкой рестарта, главное меню с улучшениями пока не сделал, оно находится пока на этапе идеи. Также при уничтожении корабля он распадается на 9 квадратиков, которые двигаются по траекториям, имитируя развалившийся корабль, в будущем скорее всего это будет переделано.

Для тех, кому интересно как устроен разлёт осколков, вот код:

Код
using UnityEngine;

public class ShipShatter : MonoBehaviour
{
    public Color shardColor = Color.cyan;

    public void Shatter()
    {
        SpriteRenderer mainSprite = GetComponent< SpriteRenderer>();
        if (mainSprite != null) mainSprite.enabled = false;

        int gridSize = 3;
        float shipSize = 1f;
        float shardSize = shipSize / gridSize;

        for (int x = 0; x < gridSize; x++)
        {
            for (int y = 0; y < gridSize; y++)
            {
                CreateShard(x, y, gridSize, shardSize);
            }
        }
    }

    void CreateShard(int x, int y, int gridSize, float size)
    {
        GameObject shard = new GameObject("Shard");

        float offsetX = (x - (gridSize - 1) / 2f) * size;
        float offsetY = (y - (gridSize - 1) / 2f) * size;
        shard.transform.position = transform.position + new Vector3(offsetX, offsetY, 0);

        SpriteRenderer sr = shard.AddComponent< SpriteRenderer>();
        sr.sprite = GetComponent< SpriteRenderer>().sprite;
        sr.color = shardColor;
        sr.transform.localScale = new Vector3(size, size, 1);

        ShardMover mover = shard.AddComponent< ShardMover>();
        mover.velocity = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f)).normalized * Random.Range(3f, 8f);
        mover.angularVelocity = Random.Range(-360f, 360f);
    }
}

public class ShardMover : MonoBehaviour
{
    public Vector2 velocity;
    public float angularVelocity;
    private float lifeTime = 1.5f;

    void Update()
    {
        transform.Translate(velocity * Time.unscaledDeltaTime);
        transform.Rotate(0, 0, angularVelocity * Time.unscaledDeltaTime);

        lifeTime -= Time.unscaledDeltaTime;
        if (lifeTime <= 0) Destroy(gameObject);
    }
}

Заключение:

На этом заканчивается материал, сделанный мной за 2 дня джема. Спасибо за прочтение!

P.S. Я разрабатываю игру в одиночку, т.к. не хотел подводить других людей на начальном этапе из-за недели отсутствия. Но у меня абсолютно нет навыков дизайнера и если есть человек, которому интересно разрабатывать игру вместе со мной (или сделать для игры дизайн), то пишите, обсудим всё в частном порядке.

Комментарии (1)

Войдите, чтобы написать комментарий

Войти
Large Spinner
10