Guide 11 — MythoClash
Fozaan Sheikh
What you're building
You are Hero. You battle monsters drawn from many mythologies, earn Drachma, and unlock levels. You may skip a fight — but skipping raises the chance the next monster is worse, and you only get three skips.
That fight-or-skip gamble is your design, and it's the whole reason your game isn't just a boss rush. This guide builds it exactly as you pitched it.
You already have pixel art for the hero, a hydra, an Ammit-style crocodile, a wolf, and a serpent, plus a loading-screen banner. Build against those from the start.
Time: about three hours.
1. Before you start
- Finish Guide 0.
- Read Guide B §B1 (player), §B2 (managers), §B4 (enemies).
- Read Guide 10 §5 — you need the dialogue panel for intros and lore. It's optional but recommended.
2. Scripts you'll use
Core — Guide B
PlayerController2D · PlayerAnimatorBridge · Health · DamageOnContact · CameraTargetAssigner · SceneLoader · GameManager · AudioManager · HUDController
Combat (Tier 2)
Team · Hurtbox · Hitbox · Knockback · MeleeAttack · Projectile · ProjectileShooter · BossController
Progression (Tier 4)
ChoiceFlagManager · LevelData · LevelSet · LevelProgress · LevelSelectButton · LevelSelectMenu
Saving (Tier 7)
SaveData · SaveSystem
Your signature mechanics (Tier 8)
MonsterEntry · ExperienceWallet · EncounterManager
3. Decide your currency plan first
You have two systems that could both mean "Drachma," and you must pick one. Two things meaning the same currency is a bug factory.
| Option | How it works | Best for |
|---|---|---|
ExperienceWallet (recommended) | A simple running total. EncounterManager adds to it on every kill. You read CanAfford / Spend from your level-select buttons. | Your game — it matches your pitch's rule that Drachma can't be taken away by monsters |
ItemType + LevelProgress | Drachma is a collectible; LevelData.unlockCost spends it | Games where currency is picked up in the world |
This guide uses ExperienceWallet. Your pitch says "Drachma cannot be taken from you, but you can gain more as you fight more opponents" — that's exactly what the wallet does.
4. Build the arena
Your game is one-on-one fights, not platforming levels, so the arena is simple.
- A flat floor on Layer →
Groundwith a collider. - Walls at both edges so nobody falls off.
- Two empty GameObjects:
PlayerStart(left) andMonsterSpawn(right). - Camera: because the arena is one screen, use a static camera. Main Camera, Orthographic, Size ~5, positioned to frame the whole arena. Don't add
CameraTargetAssigner— a camera chasing a fighter in a fixed arena is distracting.
5. Build Hero
Guide B §B1 with your hero sprite:
| Component | Setting | Value |
|---|---|---|
Health | Max Health | 6 |
| Invulnerability Time | 0.8 | |
PlayerController2D | Move Speed | 7 |
| Jump Force | 13 |
Add Knockback (Stun 0.2, Resistance 0).
Children:
Hurtbox— trigger collider, Hurtbox (Team = Player), layerHurtboxAttackHitbox— trigger collider in front, Hitbox (Target Team Enemy, Damage 1, Knockback 8), layerHitbox, GameObject unticked
Add MeleeAttack: Hitbox → AttackHitbox, Windup 0.08, Active 0.12, Recovery 0.2, Animator Trigger Attack.
6. Create the monster roster
This is the heart of your content. Right-click in Project → Create → GAME1303 → Monster Entry, once per monster.
Example: the Hydra
| Field | Value |
|---|---|
| Monster Name | Hydra |
| Pantheon | Greek |
| Lore Text | "Cut one head and two answer. Lerna's curse still breathes." |
| Portrait | your hydra sprite |
| Monster Prefab | see below |
| Difficulty Tier | 3 |
| Max Health | 14 |
| Experience Reward | 25 |
| Roar Sound | a hiss, if you have one |
Suggested starting roster
| Monster | Pantheon | Tier | Health | Reward |
|---|---|---|---|---|
| Wolf | Norse | 1 | 6 | 10 |
| Serpent | Greek | 2 | 9 | 16 |
| Ammit | Egyptian | 3 | 12 | 22 |
| Hydra | Greek | 3 | 14 | 25 |
| (add more) | 4–5 | 18+ | 35+ |
Spread the tiers. The skip mechanic only works if there's something worse to draw. A roster where everything is tier 3 makes skipping meaningless.
Each monster needs a prefab
- Empty GameObject, Tag →
Enemy, your monster sprite. - Rigidbody2D (Freeze Rotation Z) + Capsule Collider 2D.
- Health — Max Health is overwritten by the
MonsterEntryat spawn, but set Invulnerability 0 and Destroy On Death ✗. - Knockback — Resistance 1 for big monsters, 0 for small ones.
- Child
Hurtbox— Team = Enemy, layerHurtbox. - Child
BodyHitbox— Target Team Player, Damage 1, Repeat Delay 1, layerHitbox, enabled. - For monsters that attack: add BossController with phases (Guide 7 §9 is the full recipe), or just
EnemyChasefor a simpler charging monster.
Every monster prefab needs
Healthand aHurtboxor it can't be defeated.EncounterManagerwires the death event automatically — you don't do that part.
7. Set up the encounter loop
- Empty GameObject
EncounterManager+ the component.
| Field | Value |
|---|---|
| Roster | drag in all your MonsterEntry assets |
| Filter By Pantheon | Greek (or leave blank for all) |
| Avoid Immediate Repeats | ✓ |
| Spawn Point | drag MonsterSpawn |
| Player Start | drag PlayerStart |
| Base Tier | 1 |
| Tier Per Skip | 0.8 |
| Max Skips | 3 |
| Tier Per Encounter | 0.15 |
| Encounters Per World | 12 |
| Auto Start | ✓ |
| Delay Between Encounters | 1.5 |
- Empty GameObject
Wallet+ ExperienceWallet, Persist Across Scenes ✓, Starting Amount 0. - Add a
ChoiceFlagManagerand aSaveSystemto the scene.
How the draw works
The threat tier is:
Base Tier + (skips used × 0.8) + (fights cleared × 0.15)
Monsters are then weighted by how close their tier is to that number — so a high threat makes tough monsters likely without making weak ones impossible. Three skips takes you from tier 1 to roughly tier 3.4, which is a real difference.
Tier Per Encounter 0.15 means the game also creeps up as you clear fights, so a twelve-fight world ends harder than it started even if you never skip.
8. Build the fight/skip UI
This is where your design becomes visible. Don't skimp here.
- Canvas → Panel named
EncounterPanel, centred. - Inside it:
| Object | Type | Shows |
|---|---|---|
MonsterPortrait | Image | the monster you're about to face |
MonsterName | TMP Text | its name |
PantheonText | TMP Text | which mythology |
LoreText | TMP Text | the flavour line |
FightButton | Button | |
SkipButton | Button | |
SkipsRemaining | TMP Text | Skips: 3 |
ThreatText | TMP Text | Threat: 1 |
- A separate always-visible HUD:
DrachmaText(Drachma: 0), a health bar, andProgressText(3 / 12).
Make the risk visible
OnThreatLevelChanged exists specifically so the player can see the gamble. A skip that silently makes things worse isn't a decision — it's a trap. Show the threat number, and make it change colour as it climbs (green → amber → red). If the player can see "Threat: 1 → 2" happen when they skip, skipping becomes a real choice.
Same for SkipsRemaining. Three skips is a resource; treat it like one.
9. Wire it up
| On this object | Event | Drag in | Choose |
|---|---|---|---|
FightButton | On Click | EncounterManager | EncounterManager.ChooseFight |
SkipButton | On Click | EncounterManager | EncounterManager.ChooseSkip |
EncounterManager | On Monster Presented | EncounterPanel | GameObject.SetActive ✓ |
EncounterManager | On Fight Started | EncounterPanel | GameObject.SetActive ✗ |
EncounterManager | On Monster Defeated | AudioManager | PlaySFX (string) → victory |
EncounterManager | On Out Of Skips | AudioManager | PlaySFX (string) → denied |
EncounterManager | On World Cleared | GameManager | GameManager.LevelComplete |
Player → Health | On Health Changed | HUD | HUDController.UpdateHealth (Dynamic) |
Wallet → ExperienceWallet | On Total Changed | (see note) |
Rows 3 and 4 are the loop. The panel appears when a monster is presented and hides when the fight starts. Without them the UI covers your fight.
Row 9 note:
OnTotalChangedsends anint, and TMP'stextwants astring— they don't connect directly. Simplest fix: show Drachma as a row of coin icons you enable, or ask your instructor for the one-line text helper. Same situation Chris has in Guide 5.The portrait, name, lore and threat texts have the same issue — they need a small display script. Ask for it as one script that takes a
MonsterEntryand fills all four fields. That's about eight lines and it's the single most useful custom script in your project.
10. Level select and worlds
Each world is one pantheon. Once one arena works, this is asset creation.
- Per world, create a LevelSet (right-click → Create → GAME1303 → Level Set):
- Set Id
greek, Display NameGreek - Levels: three
LevelDataassets
- Set Id
- Each LevelData:
- Level Id
greek_1(never rename this — it's the save key) - Scene Name → your arena scene
- Unlocked From Start ✓ for the first
- Unlock Cost for later ones — but see the note below
- Level Id
- Level select scene: Canvas + Panel with a Grid Layout Group,
LevelSelectMenuon it, yourLevelSelectButtonprefab assigned.
The currency catch
LevelData.unlockCost spends an ItemType through CollectionTracker — not your ExperienceWallet. Since you chose the wallet, set Unlock Cost to 0 on all your LevelData and gate levels by Requires Cleared instead (clear greek_1 to open greek_2).
If you want Drachma to actually buy levels, ask for a small script that checks ExperienceWallet.CanAfford on the button. Four lines. Otherwise, "clear to unlock" is a perfectly good progression and it's zero extra work.
11. First playtest
Build one arena with three monsters in the roster (tiers 1, 2 and 3).
- The encounter panel appears with a monster shown.
- Fight spawns the monster and the panel hides.
- You can hurt it and it can hurt you.
- Killing it awards Drachma — check the wallet total goes up.
- The next monster is presented after the delay.
- Skip works, and the skips counter drops 3 → 2 → 1.
- The threat number climbs when you skip.
- After three skips, skipping is refused (
OnOutOfSkipsfires). - Tougher monsters appear more often at high threat. Skip three times and watch what you draw.
- After 12 fights, the world clears.
Step 9 is your whole design. If skipping doesn't visibly change what you face, spread your roster's tiers wider.
12. Then add
- More monsters. This is your content, and it's pure asset creation.
- A second pantheon — a
LevelSetwithFilter By Pantheonset toNorse. - Boss phases on your bigger monsters (Guide 7 §9).
- Dialogue using Guide 10 §5's panel — lore before a fight, a line when you skip.
- The loading-screen banner you already made, as a scene between worlds.
- Save — you already have
SaveSystem; tick Save Flags so cleared monsters persist.
13. Design notes for your game specifically
Show the gamble or it isn't one. This is the single most important note in your guide. OnThreatLevelChanged fires every time the threat moves. If the player can see "Threat: 1" become "Threat: 2" the instant they skip, they're making a decision. If they can't, they're rolling dice blind and the mechanic reads as unfair randomness.
Your roster needs a real spread of tiers. Skipping is only tempting if there's something you'd rather not face, and only risky if there's something worse. Aim for at least one monster at each tier from 1 to 5. Two tier-3 monsters and nothing else means skipping does nothing.
Three skips is a good number — don't raise it. You said so in your pitch and you were right. More than three and a player can skip past every hard fight; fewer and it's not a resource worth thinking about. Twelve fights and three skips means you can dodge a quarter of the game, which is exactly enough to feel like a choice.
Multiple pantheons is your best differentiator. Hades and God of War each commit to one mythology. Yours doesn't, which means a player can meet Fenrir and the Hydra in the same run. Lean into that in the lore text — a line acknowledging the strangeness of these creatures sharing a world is worth writing.
Drachma that can't be taken away is a kind design. It means a bad fight costs you health but never progress. Combined with unlimited retries, your game asks for persistence rather than perfection, and that's a friendlier difficulty curve than the games you cited.
14. Common problems
| What you see | What's wrong |
|---|---|
| No monster is presented | Roster empty, or Filter By Pantheon doesn't match any entry's Pantheon string |
| Same monster every time | Only one matches your filter, or Avoid Immediate Repeats unticked |
| Monster spawns but can't be hurt | Prefab has no Hurtbox, or teams are the same, or wrong layers |
| Monster can't be killed | Prefab has no Health component |
| Panel stays up during the fight | OnFightStarted → SetActive(false) not wired |
| Panel never reappears | OnMonsterPresented → SetActive(true) not wired |
| Skipping doesn't change difficulty | Tier Per Skip too low, or roster tiers too similar |
| Skip works forever | Max Skips is 0 (meaning unlimited in effect) — set it to 3 |
| Drachma never increases | Experience Reward is 0 on your MonsterEntry assets |
| Drachma resets between scenes | Wallet Persist Across Scenes unticked |
| Level select shows nothing | LevelSet has no levels, or Button Prefab unassigned |
| Cleared levels forget | LevelData.levelId was renamed after playtesting |