BallGame --- простая игра на Unity

Мой первый хеллоу ворлд на Юнити.

Вы — шар, который катается по полю и давит другие рандомно спавянщиеся шары. :kolobokrolling:

Исходники:

Создан в Unity 2017.3, работает в 2018.4, 2019.3, скорее всего и в других версиях.

Тут выложены сборки для Windows, Mac OS (не проверял), Linux.

WebGL (прямо в браузере): https://alexp11223.github.io/BallGame/


Основан на этом туториале https://learn.unity.com/tutorial/introduction-to-roll-a-ball, но там совсем скучно, так что добавил кучу разных фич. :partyparrot:

“Вражеские” шары периодически спавнятся в случайном месте указанных областей.

public class SpawnArea : MonoBehaviour
{
    public void Spawn(GameObject enemyToSpawn)
    {
        var pos = new Vector3(Random.Range(transform.position.x - transform.localScale.x / 2, transform.position.x + transform.localScale.x / 2),
            transform.position.y,
            Random.Range(transform.position.z - transform.localScale.z / 2, transform.position.z + transform.localScale.z / 2));

        Instantiate(enemyToSpawn, pos, transform.rotation);
    }
}
public class EnemyManager : MonoBehaviour
{
    public GameObject EnemyToSpawn;

    public float SpawnDelay = 2f;
    
    public SpawnArea[] SpawnAreas;

    public int InitialEnemiesCount = 3;

    void Start()
    {
        for (int i = 0; i < InitialEnemiesCount; i++)
        {
            Spawn();
        }
        
        InvokeRepeating(nameof(Spawn), SpawnDelay, SpawnDelay);
    }

    void Spawn()
    {
        var spawnArea = SpawnAreas[Random.Range(0, SpawnAreas.Length)];

        spawnArea.Spawn(EnemyToSpawn);
    }
}

У них есть анимация появления, раздавливания (со звуком), и пульсация в простое.

2020-02-07_18-13-05

При раздавливании шара добавляется одно очко и увеличивается размер игрока.

public class Enemy : MonoBehaviour
{
    private Animator _anim;
    private bool _isDead = false;

    private GameManager _gameManager;

    public AudioSource SplatSound;
    public AudioSource SquelchSound;

    public bool IsDead
    {
        get { return _isDead; }
        private set
        {
            if (_isDead == value)
            {
                return;
            }

            _isDead = value;
            _anim.SetBool(nameof(IsDead), IsDead);
        }
    }
    
    void Start ()
    {
        _gameManager = FindObjectOfType<GameManager>();

        _anim = GetComponentInParent<Animator>();
    }

    void OnTriggerEnter(Collider collider)
    {
        if (IsDead)
        {
            SquelchSound.Play();
        }
        else
        {
            _gameManager.HandleKill();

            SplatSound.Play();
        }

        IsDead = true;
    }
}
public class GameManager : MonoBehaviour
{
    ...

    public void HandleKill()
    {
        _score++;

        Player.transform.localScale += new Vector3(PlayerSizeIncrement, PlayerSizeIncrement, PlayerSizeIncrement);
}

У шара-игрока есть звук при ударе о поверхности (стены, пол).

public class Player : MonoBehaviour
{
    ...

    void OnCollisionEnter(Collision collision)
    {
        if (collision.relativeVelocity.magnitude > 2)
        {
            hitSound.Play();
        }
    }
}

Можно спрыгнуть вниз, тогда заспавнится поле с кучей шаров, по которым можно прыгать (у материала поверхности внизу bounciness == 1).

public class FallDetector : MonoBehaviour
{
    private bool _isFallDetected = false;

    public SpawnArea TrampolineSpawnArea;

    public int EnemiesCount = 1000;

    public GameObject EnemyToSpawn;

    public float SpawnDelay = 2f;

    void OnTriggerEnter(Collider collider)
    {
        if (!_isFallDetected && collider.CompareTag("Player"))
        {
            _isFallDetected = true;

            for (int i = 0; i < EnemiesCount; i++)
            {
                TrampolineSpawnArea.Spawn(EnemyToSpawn);
            }

            InvokeRepeating(nameof(Spawn), SpawnDelay, SpawnDelay);
        }
    }

    void Spawn()
    {
        TrampolineSpawnArea.Spawn(EnemyToSpawn);
    }
}

Он просто по таймеру 60 сек независимо от остального.

Не, просто спавнится 1к без всяких пулов )
Немного зависает в этот момент, при запуске из Юнити вообще сек на 5, но в обычных сборках вроде не так заметно. :man_shrugging:

Может если растолстел :kolobokkaeef:

С ним совсем просто:

1 лайк