An open API service indexing awesome lists of open source software.

https://github.com/janprovaznik/gravitank

C# Unity flash-like game for 2 people
https://github.com/janprovaznik/gravitank

game tank-game

Last synced: 7 months ago
JSON representation

C# Unity flash-like game for 2 people

Awesome Lists containing this project

README

          

# GraviTank (EN)
- Programming 2 course project
- July 2021
- Unity engine used: Unity 2020.3.13f1

## Overview
Game for 2 players in Unity. Available at [GraviTank](https://simmer.io/@JanPro/gravitank) I thought how to replicate fun flash games from my childhood, influences include: [Tanks by 2dplay.com](https://archive.org/details/tanks_flashgame), [Worms](https://en.wikipedia.org/wiki/Worms_(series))).
The distinctive feature is fighting on a round planet with gravity.

## Platform
Can be built with Unity for any platform.

## Structure
Markup: **Unity terms**, _My objects_. It wouldn't be useful to explain all Unity terms here, so I refer to [documentation](https://docs.unity3d.com/Manual/index.html).

A game in Unity consists of **Scene**s that contain **GameObject**s with **Component**s, I tried to put as many properties as possible in **Prefab**s, but some I only specified for each object (control keys). Almost everything is calculated in floats, because the game is "continuous".
### Scenes
#### WelcomeScene
Contains a listing of controls, a button to start the game, and textboxes for player names.
#### GameScene
This is where the game takes place.
Includes _Planet_, 2 _Players_, **Camera**.
The game ends when one of the players has no lives.

#### EndScene
Contains Camera, text of who won, and restart/end buttons.

### Prefabs
All **Prefabs** except _Planet_ have the _GravityToPlanet_ script.

#### Player
Has child **GameObjects**: _Head, Barrel, HealthSlider, ShotSlider_ and a bunch of components that determine its display, physics and behavior. Important scripts are _Health, Shooting, Aiming, Movement_, **Collider**s and **Rigidbody2D**.

#### Planet
Has **Rigidbody2D** and **Collider**, which contains **Material** with a modified _LowFriction_ friction constant.

#### Shot
Has **Rigidbody2D and Collider**, which is set to be **Trigger**, so that the collision triggers an OnTriggerEnter() event that is served in a _ShotDamage_ script, which _Shot_ also changes color according to the _damage_ it causes.

#### Meteor
Similar to _Shot_, but _damage_ is constant. It is generated randomly in space.

### Scripts
Scripts represent a set of behaviors of a given **Prefab** or **Scene**, so for example **Prefab** _Player_ has multiple scripts.

#### GravityToPlanet
The **GameObjects** that have this script are attracted to the _Planet_ specified in the GUI as a parameter. The attraction is handled by applying a force to **Rigidbody2D**.

#### Aiming
When keys are pressed, _Barrel_ rotates relative to _Head_, which are subobjects of _Player_. It limits the angle of the barrel.

#### Health
Subtracts lives, displays to the _HealthSlider_ and ends the game.

#### Movement
-_Player's_ movement, uses the **Rigidbody2D** component to apply force. Since the tank is a **Dynamic Rigidbody**, we let the game engine calculate location and velocity from the forces acting on it. It limits the speed so the tank doesn't fly off the planet.

#### Shooting
Controls firing and the delay between shots. Also displays the status to _PowerSlider_. Shot power is first randomly generated by pressing the shooting key, then continuously increased/decreased by holding. Releasing the firing key creates an instance of _Shot_ in _FirePoint_, which is given a force based on the shot force, the angle of which is calculated based on the position of _FirePoint_ relative to _Barrel_.

#### ShotDamage
Calculates _damage_ based on flight time and shot power. This displays the color of the shot, which is **Gradient** from white to orange.
Handles the **OnTriggerEnter2D** event, which will destroy the _Shot_ and possibly deal _damage_ to the _Player_.

#### Meteor
Processes event **OnTriggerEnter2D** to destroy _Meteor_ and possibly deal _damage_ to _Player_.
If it is flying too fast due to gravity, it will slow it down.

#### MeteorGeneration
Generates _Meteors_ at random locations with a frequency dependent on game time.

#### GUI scripts
Trivial.

## Conclusion
I hope someone enjoys the game and possibly uses the concept to develop something more advanced :)

# GraviTank (CZ)
- Zápočtový program
- NPRG031 Programování 2
- Červenec 2021
- Použitá verze enginu: Unity 2020.3.13f1

## Zadání a úvod
Je to hra pro dva hráče v enginu Unity. Účelem hry je zábava. Nápad vznikl vzpomínáním na flashové hry, které jsem hrál v letech základní školy na internetu se sestrou. Nejužší inspirací jsou [Tanks od 2dplay.com](https://archive.org/details/tanks_flashgame), později mi došlo, že je hra podobná také [Worms](https://cs.wikipedia.org/wiki/Worms_(hern%C3%AD_s%C3%A9rie)). Hlavní "ozvláštňující myšlenka" je souboj na kruhové planetě s gravitací.
Velkou výhodou i nevýhodou Unity je, že spousta práce se děje v hezkém GUI, tím pádem není nutné psát tolik kódu, ale zato se lze snáze ztratit ve vztazích mezi objekty.

## Uživatelský návod
Build je díky Unity možný pro vše co má QWERT(YZ) klávesnici (Windows, Linux, Mac, WebGL). Přikládám [odkaz na WebGL](https://simmer.io/@JanPro/gravitank).

Ovládání je vysvětleno v úvodní scéně. Konkrétní mechaniky se nejlépe pochopí hraním. Cíl hry je snížit životy nepřítele na nulu. Střela ubírá životy úměrně síle výstřelu a času letu (aby se hráči snažili dělat co největší oblouky). Náraz dvou střel do sebe je obě zničí. Občas létají meteory, aby se hráči nemohli sousředit jen na míření, ale museli někdy i uhýbat.

## Struktura
Značení: **Termíny Unity**, _Moje objekty_. Nebylo by užitečné všechny termíny Unity zde vysvětlovat, takže odkazuji na [dokumentaci](https://docs.unity3d.com/Manual/index.html).

Hra v Unity se skládá ze **Scene**s, které obsahují **GameObject**y s **Component**ami, Snažil jsem se co nejvíce vlastností umístit do **Prefab**ů, ale některé jsem specifikoval jen individuálně (klávesy ovládání). Skoro vše se počítá ve floatech, protože je hra "spojitá".
### Scény
#### WelcomeScene
Obsahuje vypsané ovládání, tlačítko na začátek hry a textboxy na jména hráčů.
#### GameScene
Zde probíhá hra.
Obsahuje _Planetu_, 2 _Playery_, **Kameru**.
Hra skončí až jeden z hráčů nemá životy.

#### EndScene
Obsahuje Kameru, text kdo vyhrál a tlačítka k restartu/konci.

### Prefaby
Všechny **Prefaby** kromě _Planety_ mají skript _GravityToPlanet_.

#### Player
Má dceřinné **GameObjecty**: _Head, Barrel, HealthSlider, ShotSlider_ a spoustu komponent, které určují jeho zobrazení, fyziku a chování. Důležité jsou skripty _Health, Shooting, Aiming, Movement_, **Collider**y a **Rigidbody2D**.

#### Planet
Má **Rigidbody2D** a **Collider**, který obsahuje **Material** s upravenou konstantou tření _LowFriction_.

#### Shot
Má **Rigidbody2D a Collider**, který má nastaveno, že je **Trigger**, takže kolize vyvolá event OnTriggerEnter(), který je obsloužen v skriptu _ShotDamage_, který _Shot_ také mění barvu podle _damage_ jaký způsobí.

#### Meteor
Podobné _Shot_, ale _damage_ je konstantní. Generuje se náhodně v prostoru.

### Skripty
Skripty představují ucelený soubor chování daného **Prefabu** či **scény**, proto např. **Prefab** _Player_ má více skriptů.

#### GravityToPlanet
**GameObjecty**, které maji tento skript jsou přitahovány k _Planetě_, specifikované v GUI jako parametr. Přitahování je řešeno působením síly na **Rigidbody2D**.

#### Aiming
Při stisku kláves rotuje _Barrel_ vůči _Head_, což jsou podobjekty _Player_. Omezuje úhel hlavně.

#### Health
Odečítá životy, zobrazuje do _HealthSlider_ a ukončuje hru.

#### Movement
-Pohyb _Playera_, využívá komponentu **Rigidbody2D** pro udělení síly. Protože tank je **Dynamic Rigidbody**, necháme engine spočítat umístění a rychlost ze sil, které na něj působí. Omezuje rychlost, aby tank neodletěl z planety.

#### Shooting
Řídí střelbu a prodlevu mezi střelami. Také zobrazuje stav do _PowerSlider_. Síla výstřelu se stiskem střílecí klávesy nejprve náhodně vygeneruje, pak se držením průběžně zvyšuje/snižuje. Puštěním střílecí klávesy se vytvoří v _FirePoint_ instance _Shot_, které je podle síly výstřelu udělena síla, jejíž úhel se spočte podle polohy _FirePoint_ vůči _Barrel_.

#### ShotDamage
Počítá _damage_ podle času letu a síly výstřelu. Toto zobrazí barvou střely, což je **Gradient** od bílé do oranžové.
Zpracuje event **OnTriggerEnter2D**, kterým se _Shot_ zničí a případně udělí _damage_ do _Player_.

#### Meteor
Zpracuje event **OnTriggerEnter2D**, kterým se _Meteor_ zničí a případně udělí _damage_ do _Player_.
Pokud letí moc rychle kvůli gravitaci, tak ho zpomalí.

#### MeteorGeneration
Vyrábí _Meteory_ v náhodných místech s frekvencí závislou na hracím čase.

#### GUI skripty
Triviální.

## Závěr
Tvorbu jsem si užil a myslím, že jsem lépe připraven účastnit se v budoucnu nějakého Game Jamu. Balanc fyzikálních konstant, aby byla hra zábavná by jistě šel dále optimalizovat. Někdy jsem váhal v rozhodnoutích o úrovni abstrakce, aby kód byl znovuvyužitelný, ale zároveň čitelný.

#### Co by šlo udělat dál
Možnost změny ovládání.
Více herních map/scén.
Změna fyzikálních vlastností za běhu.
Grafika, animace.
Lepší tvary tanků.
Umělá inteligence.
Testování.