Мой первый хеллоу ворлд на Юнити.
Вы — шар, который катается по полю и давит другие рандомно спавянщиеся шары.
Исходники:
Создан в 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, но там совсем скучно, так что добавил кучу разных фич.
“Вражеские” шары периодически спавнятся в случайном месте указанных областей.
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);
}
}
У них есть анимация появления, раздавливания (со звуком), и пульсация в простое.
При раздавливании шара добавляется одно очко и увеличивается размер игрока.
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);
}
}