143 lines
4.8 KiB
Markdown
143 lines
4.8 KiB
Markdown
# OGG
|
|
|
|
A janky boomer shooter built in Unity. Cruelty Squad aesthetics, boomer shooter mechanics. Deliberately ugly.
|
|
|
|
---
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
Assets/
|
|
Scripts/ — all game code
|
|
Items/ — ItemDefinition ScriptableObjects
|
|
Models/ — 3D assets
|
|
Prefabs/ — weapon and enemy prefabs
|
|
Scenes/ — game scenes
|
|
```
|
|
|
|
---
|
|
|
|
## Systems
|
|
|
|
### Player
|
|
|
|
**`FirstPersonController.cs`**
|
|
Standard FPS controller. WASD + mouse look, sprint with Left Shift, jump with Space. Mouse look and movement are automatically frozen when the inventory or dialogue is open.
|
|
|
|
**`Player.cs`**
|
|
Tracks health and stamina. Stamina drains while sprinting and regenerates at rest. Exposes `HealthFraction` and `StaminaFraction` for the HUD.
|
|
|
|
---
|
|
|
|
### Combat
|
|
|
|
**`SimpleGun.cs`** / **`WeaponManager.cs`** / **`WeaponViewmodel.cs`**
|
|
Weapon firing, switching, and first-person viewmodel rendering. Weapons are defined as prefabs with an `ItemDefinition` ScriptableObject. A custom editor tool automates prefab generation and includes a live positioning workflow for viewmodel placement.
|
|
|
|
**`WeaponBob.cs`**
|
|
Applies positional bob to the viewmodel while moving.
|
|
|
|
**`EnemyHealth.cs`** / **`EnemyHeadHitbox.cs`**
|
|
Enemies take damage from gunfire. Headshots via a dedicated hitbox component are one-shot kills; body shots require multiple hits.
|
|
|
|
**`CameraShake.cs`**
|
|
Triggered on fire and on taking damage.
|
|
|
|
---
|
|
|
|
### Enemies
|
|
|
|
**`HumanoidEnemy.cs`**
|
|
Procedurally generated humanoid enemies with three types:
|
|
|
|
| Type | Role |
|
|
|---|---|
|
|
| Grunt | Balanced melee + ranged |
|
|
| Runner | Fast melee rusher |
|
|
| Brute | Slow, heavy, high damage |
|
|
|
|
Enemies chase, attack in melee range, and shoot at range. AI uses Unity's `CharacterController` with custom state logic (idle → chase → attack).
|
|
|
|
**`EnemySpawner.cs`**
|
|
Spawns enemies into the scene.
|
|
|
|
---
|
|
|
|
### Inventory
|
|
|
|
**`Inventory.cs`**
|
|
Grid-based inventory opened with Tab. Supports weapons and equippable non-weapon items. Right-click context menu for equipping/dropping. Pauses mouse look when open.
|
|
|
|
**`ItemDefinition.cs`**
|
|
ScriptableObject defining an item: name, icon, type, weapon prefab reference, and equippable stats.
|
|
|
|
**`PickupItem.cs`**
|
|
Attach to any world object to make it a pickup. Spins and bobs in the world. Supports full `ItemDefinition` or a simple name fallback.
|
|
|
|
**`StaminaBoostPickup.cs`** / **`BootsEffect.cs`**
|
|
"Bunny Hop Boots" equippable item. Grants a passive stamina boost rather than Quake-style bunny hopping — more accessible, still rewarding.
|
|
|
|
---
|
|
|
|
### HUD
|
|
|
|
**`PlayerHUD.cs`**
|
|
Draws health and stamina bars in the bottom-left corner using Unity's immediate-mode GUI (`OnGUI`). Bars smooth-interpolate, pulse red at critical values, and have 25% segment tick marks. Includes a colour-coded speedometer (green → yellow → red).
|
|
|
|
**`RadarHUD.cs`**
|
|
Circular mini-map in the top-left corner. Rotates with the player so "up" always equals forward.
|
|
|
|
| Blip | Colour | Shape |
|
|
|---|---|---|
|
|
| Player | White | Round |
|
|
| Enemy (`HumanoidEnemy`) | Red (pulsing) | Round |
|
|
| NPC (`DialogueNPC`) | Green | Round |
|
|
| Pickup (`PickupItem`) | Yellow | Square |
|
|
|
|
Enemies beyond radar range are clamped to the disc edge. Scene is re-scanned every 0.25 seconds.
|
|
|
|
**`SimpleCrosshair.cs`**
|
|
Minimal crosshair overlay.
|
|
|
|
---
|
|
|
|
### Dialogue
|
|
|
|
**`DialogueNPC.cs`**
|
|
Attach to any world object (NPC, terminal, sign, etc.) to make it interactable. When the player looks at it within range, a floating `[E] Talk` prompt appears in world space. Press E to open the dialogue box.
|
|
|
|
Configurable per object:
|
|
- `interactRange` — how close the player needs to be
|
|
- `interactAngle` — how directly they need to be looking
|
|
- `lines[]` — array of speaker/page blocks (fill in the Inspector)
|
|
|
|
**`DialogueManager.cs`** *(singleton)*
|
|
Renders the dialogue box at the bottom of the screen. Typewriter text effect, page dot indicators, speaker name bar. Unlocks the cursor while open and re-locks it on close.
|
|
|
|
Controls while dialogue is open:
|
|
|
|
| Key | Action |
|
|
|---|---|
|
|
| E / Space / Enter | Advance page (or skip typewriter) |
|
|
| Escape | Close immediately |
|
|
|
|
Rich text tags (`<b>`, `<color=red>`, `<i>`) work in dialogue body text.
|
|
|
|
**`DialogueLine.cs`**
|
|
Serializable data class. One `DialogueLine` = one speaker with an array of text pages. Multiple `DialogueLine` entries per NPC chain speakers together.
|
|
|
|
---
|
|
|
|
## Setup Cheatsheet
|
|
|
|
| What | Component | Where to attach |
|
|
|---|---|---|
|
|
| Player movement | `FirstPersonController` | Player GameObject |
|
|
| Health / stamina | `Player` | Player GameObject |
|
|
| HUD bars + speedo | `PlayerHUD` | Player GameObject |
|
|
| Mini-map radar | `RadarHUD` | Player GameObject |
|
|
| Dialogue system | `DialogueManager` | Any persistent GameObject (e.g. a "Managers" empty) |
|
|
| Make something talkable | `DialogueNPC` | The NPC / object |
|
|
| Make something a pickup | `PickupItem` | The pickup object |
|
|
| Make something an enemy | `HumanoidEnemy` + `EnemyHealth` | Enemy GameObject |
|