Skip to content

An ambitious solo FPS project with two demo levels, featuring a deep implementation of core mechanics: Save/Load, 15+ AI types, and a data-driven weapon system.

Notifications You must be signed in to change notification settings

finerace/Ancelight

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

English English Version icon

Ancelight Logo

ะŸั€ะธะฒะตั‚! ะญั‚ะพ "Ancelight" โ€” ะผะพะน ัั‚ะฐั€ั‹ะน ะฟั€ะพะตะบั‚, ะฒ ะบะพั‚ะพั€ะพะผ ั ั ะฝัƒะปั ั€ะตะฐะปะธะทะพะฒะฐะป ะฒัะต ะผะตั…ะฐะฝะธะบะธ ะบะปะฐััะธั‡ะตัะบะพะณะพ FPS-ัˆัƒั‚ะตั€ะฐ.

Download Build

Gameplay Video LinkedIn Telegram


Gameplay Demo Save-Load System


TL;DR

  • ๐Ÿƒโ€โ™‚๏ธ ะŸั€ะพะดะฒะธะฝัƒั‚ะฐั ัะธัั‚ะตะผะฐ ะฟะตั€ะตะดะฒะธะถะตะฝะธั: ะ˜ะณั€ะพะบ ะฝะต ะฟั€ะพัั‚ะพ ั…ะพะดะธั‚ ะธ ะฟั€ั‹ะณะฐะตั‚. ะ ะตะฐะปะธะทะพะฒะฐะฝั‹ ะบะปัŽั‡ะตะฒั‹ะต "action-FPS" ะผะตั…ะฐะฝะธะบะธ: ะบั€ัŽะบ-ะบะพัˆะบะฐ (PlayerHookService) ั ัะพะฑัั‚ะฒะตะฝะฝะพะน ั„ะธะทะธะบะพะน ะฝะฐ SpringJoint ะธ ั€ะฐัั…ะพะดะพะผ ั€ะตััƒั€ัะฐ, ะฐ ั‚ะฐะบะถะต ัะธัั‚ะตะผะฐ ั€ั‹ะฒะบะพะฒ (dashes) (PlayerDashsService), ะพะณั€ะฐะฝะธั‡ะตะฝะฝะฐั ะบะพะปะธั‡ะตัั‚ะฒะพะผ ะทะฐั€ัะดะพะฒ ะธ ะฒั€ะตะผะตะฝะตะผ ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั.
  • ๐Ÿ’พ ะŸะพะปะฝะฐั ัะธัั‚ะตะผะฐ ัะพั…ั€ะฐะฝะตะฝะธะน: ะ ะตะฐะปะธะทะพะฒะฐะฝะฐ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ัะพั…ั€ะฐะฝะธั‚ัŒ ะธ ะทะฐะณั€ัƒะทะธั‚ัŒ ะธะณั€ัƒ ะฒ ะปัŽะฑะพะน ะผะพะผะตะฝั‚. ะกะธัั‚ะตะผะฐ ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ ะธ ะฒะพััั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ ัะพัั‚ะพัะฝะธะต ะฒัะตั… ะดะธะฝะฐะผะธั‡ะตัะบะธั… ะพะฑัŠะตะบั‚ะพะฒ: ะพั‚ ะปะตั‚ัั‰ะธั… ะฟัƒะปัŒ ะธ ะฒั€ะฐะณะพะฒ (ะฒะบะปัŽั‡ะฐั ะธั… ั‚ะตะบัƒั‰ัƒัŽ ั„ะฐะทัƒ ะฐั‚ะฐะบะธ) ะดะพ ะฟะพะปะพะถะตะฝะธั ะดะฒะตั€ะตะน ะธ ัะพัั‚ะพัะฝะธั ั‚ั€ะธะณะณะตั€ะพะฒ.
  • ๐Ÿ“ˆ ะกะธัั‚ะตะผะฐ ะฟั€ะพะบะฐั‡ะบะธ ะธ ะบะฐัั‚ะพะผะธะทะฐั†ะธะธ ะบะพัั‚ัŽะผะฐ: ะ’ ะธะณั€ัƒ ะฒัั‚ั€ะพะตะฝะฐ ะฟะพะปะฝะพั†ะตะฝะฝะฐั ัะธัั‚ะตะผะฐ ะฟะตั€ะผะฐะฝะตะฝั‚ะฝั‹ั… ัƒะปัƒั‡ัˆะตะฝะธะน. ะ˜ะณั€ะพะบ ัะพะฑะธั€ะฐะตั‚ ัะฟะตั†ะธะฐะปัŒะฝั‹ะต ะฟั€ะตะดะผะตั‚ั‹ (EnchancedSuitPointItem) ะดะปั ะฟะพะปัƒั‡ะตะฝะธั ะพั‡ะบะพะฒ ะฟั€ะพะบะฐั‡ะบะธ, ะบะพั‚ะพั€ั‹ะต ะทะฐั‚ะตะผ ะฒะบะปะฐะดั‹ะฒะฐะตั‚ ะฒ ัƒะปัƒั‡ัˆะตะฝะธะต ัะฒะพะธั… ัะฟะพัะพะฑะฝะพัั‚ะตะน (ัƒะฒะตะปะธั‡ะตะฝะธะต ั‡ะธัะปะฐ ั€ั‹ะฒะบะพะฒ, ัƒัะธะปะตะฝะธะต ะทะฐั‰ะธั‚ะฝะพะณะพ ะฒะทั€ั‹ะฒะฐ, ัƒะปัƒั‡ัˆะตะฝะธะต ะบั€ัŽะบะฐ-ะบะพัˆะบะธ).
  • ๐Ÿค– ะขะฐะบั‚ะธั‡ะตัะบะธะน ะ˜ะ˜ ั ะบะพะผะฐะฝะดะฝั‹ะผ ะฒะทะฐะธะผะพะดะตะนัั‚ะฒะธะตะผ: ะกะพะทะดะฐะฝะพ ะฑะพะปะตะต 15 ัƒะฝะธะบะฐะปัŒะฝั‹ั… ั‚ะธะฟะพะฒ ะฒั€ะฐะณะพะฒ. ะ‘ะปะฐะณะพะดะฐั€ั ัะธัั‚ะตะผะต "ั‚ั€ะตะฒะพะณะธ" (EnemysAiManager), ะทะฐะผะตั‚ะธะฒัˆะธะน ะธะณั€ะพะบะฐ ะฟั€ะพั‚ะธะฒะฝะธะบ ะผะพะถะตั‚ ะฟั€ะตะดัƒะฟั€ะตะดะธั‚ัŒ ัะพัŽะทะฝะธะบะพะฒ ะฒ ั€ะฐะดะธัƒัะต, ะทะฐัั‚ะฐะฒะปัั ะฒััŽ ะณั€ัƒะฟะฟัƒ ะฐั‚ะฐะบะพะฒะฐั‚ัŒ ัะบะพะพั€ะดะธะฝะธั€ะพะฒะฐะฝะฝะพ. ะะตะบะพั‚ะพั€ั‹ะต ะฒั€ะฐะณะธ ัƒะผะตัŽั‚ ัั‚ั€ะตะปัั‚ัŒ ะฝะฐ ัƒะฟั€ะตะถะดะตะฝะธะต.
  • ๐Ÿ”ซ Data-driven ัะธัั‚ะตะผะฐ ะพั€ัƒะถะธั: ะั€ัะตะฝะฐะป ะธะท 10+ ะฒะธะดะพะฒ ะพั€ัƒะถะธั ะฟะพะปะฝะพัั‚ัŒัŽ ะฝะฐัั‚ั€ะฐะธะฒะฐะตั‚ัั ั‡ะตั€ะตะท ScriptableObject. ะ ะตะฐะปะธะทะพะฒะฐะฝั‹ ั€ะฐะทะปะธั‡ะฝั‹ะต ั€ะตะถะธะผั‹ ัั‚ั€ะตะปัŒะฑั‹ (ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน, ะทะฐั€ัะดะบะฐ, ะดั€ะพะฑะพะฒะธะบ, ะปะฐะทะตั€), ัะธัั‚ะตะผะฐ ะฑะพะตะฟั€ะธะฟะฐัะพะฒ ะธ ะบะฐัั‚ะพะผะฝะฐั ะฟั€ะพั†ะตะดัƒั€ะฝะฐั ะพั‚ะดะฐั‡ะฐ (PlayerWeaponRecoil).
  • ๐ŸŽจ ะŸั€ะพะดะฒะธะฝัƒั‚ะฐั ั€ะฐะฑะพั‚ะฐ ั ัˆะตะนะดะตั€ะฐะผะธ: ะะฐะฟะธัะฐะฝั‹ ั ะฝัƒะปั ะบะพะผะฟะปะตะบัะฝั‹ะต ัˆะตะนะดะตั€ั‹ ะดะปั ะฒะธะทัƒะฐะปัŒะฝั‹ั… ัั„ั„ะตะบั‚ะพะฒ, ะฒะบะปัŽั‡ะฐั ัะฝะตั€ะณะตั‚ะธั‡ะตัะบะธะน ั‰ะธั‚ ั ัั„ั„ะตะบั‚ะพะผ ะธัะบะฐะถะตะฝะธั, ะดะธะฝะฐะผะธั‡ะตัะบัƒัŽ ะฒะพะดัƒ, ะฐ ั‚ะฐะบะถะต ะฐะฝะธะผะธั€ะพะฒะฐะฝะฝั‹ะต UI-ัˆะตะนะดะตั€ั‹ ั ะฟะตั€ะตะปะธะฒะฐัŽั‰ะธะผะธัั ะปะธะฝะธัะผะธ.
  • ๐Ÿ–Œ๏ธ ะกะพะทะดะฐะฝะธะต ะฐััะตั‚ะพะฒ ั ะฝัƒะปั: ะ—ะฝะฐั‡ะธั‚ะตะปัŒะฝะฐั ั‡ะฐัั‚ัŒ ะธะณั€ะพะฒั‹ั… ะฐััะตั‚ะพะฒ, ะฒะบะปัŽั‡ะฐั 3D-ะผะพะดะตะปะธ, ั‚ะตะบัั‚ัƒั€ั‹, ะธะบะพะฝะบะธ ะธ ัะปะตะผะตะฝั‚ั‹ UI, ะฑั‹ะปะฐ ัะพะทะดะฐะฝะฐ ัะฐะผะพัั‚ะพัั‚ะตะปัŒะฝะพ, ั‡ั‚ะพ ะดะตะผะพะฝัั‚ั€ะธั€ัƒะตั‚ ะบะพะผะฟะปะตะบัะฝั‹ะน ะฟะพะดั…ะพะด ะบ ั€ะฐะทั€ะฐะฑะพั‚ะบะต ะธ ะฟะพะฝะธะผะฐะฝะธะต ะฒัะตะณะพ ะฟะฐะนะฟะปะฐะนะฝะฐ ัะพะทะดะฐะฝะธั ะบะพะฝั‚ะตะฝั‚ะฐ.
  • ๐ŸŽฏ ะ”ะธะฝะฐะผะธั‡ะตัะบะฐั ัะธัั‚ะตะผะฐ ะทะฐะดะฐะฝะธะน: ะะฐ ัƒั€ะพะฒะฝัั… ั€ะฐะฑะพั‚ะฐะตั‚ ัะธัั‚ะตะผะฐ ะทะฐะดะฐั‡ (LevelTaskService), ะบะพั‚ะพั€ะฐั ัั‚ะฐะฒะธั‚ ะฟะตั€ะตะด ะธะณั€ะพะบะพะผ ั†ะตะปะธ (ะฝะฐะฟั€ะธะผะตั€, "ัƒะฝะธั‡ั‚ะพะถะธั‚ัŒ ะฒัะตั… ะฒั€ะฐะณะพะฒ ะฒ ะทะพะฝะต") ะธ ะพั‚ัะปะตะถะธะฒะฐะตั‚ ะธั… ะฒั‹ะฟะพะปะฝะตะฝะธะต, ะฝะฐะฟั€ะฐะฒะปัั ะณะตะนะผะฟะปะตะน.

Gameplay Demo Save-Load System


๐Ÿ’ก ะž ะฟั€ะพะตะบั‚ะต

Ancelight โ€” ัั‚ะพ ะดะธะฝะฐะผะธั‡ะฝั‹ะน FPS-ัˆัƒั‚ะตั€, ัะพะทะดะฐะฝะฝั‹ะน ะบะฐะบ ะฟะพะปะธะณะพะฝ ะดะปั ะพั‚ั€ะฐะฑะพั‚ะบะธ ะธ ั€ะตะฐะปะธะทะฐั†ะธะธ ัะปะพะถะฝั‹ั… ะธะณั€ะพะฒั‹ั… ัะธัั‚ะตะผ ั ะฝัƒะปั. ะžัะฝะพะฒะฝะพะน ั„ะพะบัƒั ะฑั‹ะป ัะดะตะปะฐะฝ ะฝะต ะฝะฐ ะฒะธะทัƒะฐะปัŒะฝะพะน ัะพัั‚ะฐะฒะปััŽั‰ะตะน, ะฐ ะฝะฐ ะณะปัƒะฑะพะบะพะน ะฟั€ะพั€ะฐะฑะพั‚ะบะต "ะฟะพะดะบะฐะฟะพั‚ะฝั‹ั…" ะผะตั…ะฐะฝะธะบ: AI, ัะธัั‚ะตะผะฐ ัะพั…ั€ะฐะฝะตะฝะธะน, ั„ะธะทะธะบะฐ ะธ ัƒะฟั€ะฐะฒะปะตะฝะธะต ั€ะตััƒั€ัะฐะผะธ.

Note

ะŸะพะดั€ะพะฑะฝะตะต ะพ ะฟั€ะพะตะบั‚ะต...
  • ๐ŸŽฎ ะ˜ะณั€ะพะฒะพะน ะฟั€ะพั†ะตัั: ะšะปะฐััะธั‡ะตัะบะธะน ัˆัƒั‚ะตั€ ั ั€ะฐะทะฝะพะพะฑั€ะฐะทะฝั‹ะผะธ ะฒั€ะฐะณะฐะผะธ, ะบะฐะถะดั‹ะน ะธะท ะบะพั‚ะพั€ั‹ั… ะพะฑะปะฐะดะฐะตั‚ ัƒะฝะธะบะฐะปัŒะฝั‹ะผ ะฟะพะฒะตะดะตะฝะธะตะผ. ะ˜ะณั€ะพะบ ะผะพะถะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ั€ะฐะทะปะธั‡ะฝะพะต ะพั€ัƒะถะธะต, ะฟะตั€ะบะธ ะธ ัะฟะตั†ะธะฐะปัŒะฝั‹ะต ัะฟะพัะพะฑะฝะพัั‚ะธ ะดะปั ะฟั€ะพั…ะพะถะดะตะฝะธั ัƒั€ะพะฒะฝะตะน.

  • ๐ŸŽฏ ะฆะตะปัŒ ะฟั€ะพะตะบั‚ะฐ: ะ ะฐะทั€ะฐะฑะพั‚ะฐั‚ัŒ ะธ ะพั€ะณะฐะฝะธะทะพะฒะฐั‚ัŒ ะฒ ะตะดะธะฝั‹ะน, ั€ะฐะฑะพั‚ะพัะฟะพัะพะฑะฝั‹ะน ะผะตั…ะฐะฝะธะทะผ ะผะฝะพะถะตัั‚ะฒะพ ัะปะพะถะฝั‹ั… ะธ ะฒะทะฐะธะผะพัะฒัะทะฐะฝะฝั‹ั… ะธะณั€ะพะฒั‹ั… ัะธัั‚ะตะผ: ะพั‚ ะฟั€ะพะดะฒะธะฝัƒั‚ะพะณะพ AI ะฟั€ะพั‚ะธะฒะฝะธะบะพะฒ ะธ ะพะฑัˆะธั€ะฝะพะณะพ ะฐั€ัะตะฝะฐะปะฐ ะพั€ัƒะถะธั ะดะพ ะฟะพะปะฝะพะน ัะธัั‚ะตะผั‹ ัะพั…ั€ะฐะฝะตะฝะธะน ะธ ะบะฐัั‚ะพะผะฝะพะน ั„ะธะทะธะบะธ. ะžัะฝะพะฒะฝะพะน ะทะฐะดะฐั‡ะตะน ะฑั‹ะปะพ ัะพะทะดะฐะฝะธะต ัั‚ะฐะฑะธะปัŒะฝะพะน ะธ ั„ัƒะฝะบั†ะธะพะฝะฐะปัŒะฝะพะน ะพัะฝะพะฒั‹, ัะฟะพัะพะฑะฝะพะน ะฟะพะดะดะตั€ะถะธะฒะฐั‚ัŒ ะฒะตััŒ ัั‚ะพั‚ ะบะพะผะฟะปะตะบั ะผะตั…ะฐะฝะธะบ.


๐Ÿ› ๏ธ ะ ะตะฐะปะธะทะพะฒะฐะฝะฝั‹ะต ะบะปัŽั‡ะตะฒั‹ะต ัะธัั‚ะตะผั‹

ะŸั€ะพะตะบั‚ ะฟะพัั‚ั€ะพะตะฝ ะฝะฐ ะฝะตัะบะพะปัŒะบะธั… ั„ัƒะฝะดะฐะผะตะฝั‚ะฐะปัŒะฝั‹ั… ัะธัั‚ะตะผะฐั…, ะฝะฐะฟะธัะฐะฝะฝั‹ั… ั ะฝัƒะปั ะดะปั ะพะฑะตัะฟะตั‡ะตะฝะธั ะฟะพะปะฝะพะณะพ ะบะพะฝั‚ั€ะพะปั ะฝะฐะด ะฟะพะฒะตะดะตะฝะธะตะผ ะธะณั€ั‹. ะšะฐะถะดะฐั ัะธัั‚ะตะผะฐ ะฟั€ะพะตะบั‚ะธั€ะพะฒะฐะปะฐััŒ ั ัƒะฟะพั€ะพะผ ะฝะฐ ั„ัƒะฝะบั†ะธะพะฝะฐะปัŒะฝะพัั‚ัŒ ะธ ั€ะตัˆะตะฝะธะต ะบะพะฝะบั€ะตั‚ะฝั‹ั… ะณะตะนะผะฟะปะตะนะฝั‹ั… ะทะฐะดะฐั‡.

Note

ะŸะพะบะฐะทะฐั‚ัŒ ะฟะพะปะฝั‹ะน ัะฟะธัะพะบ ัะธัั‚ะตะผ...

I. ะกะธัั‚ะตะผั‹ ะ˜ะณั€ะพะบะฐ (Player Core Systems)

  • ๐Ÿƒโ€โ™‚๏ธ ะŸั€ะพะดะฒะธะฝัƒั‚ะฐั ัะธัั‚ะตะผะฐ ะฟะตั€ะตะดะฒะธะถะตะฝะธั (Mobility Suite)

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: PlayerMovement.cs, PlayerDashsService.cs, PlayerHookService.cs.
    • ะกัƒั‚ัŒ: ะŸะพะผะธะผะพ ัั‚ะฐะฝะดะฐั€ั‚ะฝะพะณะพ ะฟะตั€ะตะดะฒะธะถะตะฝะธั (ั…ะพะดัŒะฑะฐ, ะฟั€ะธัะตะดะฐะฝะธะต, ะฟั€ั‹ะถะพะบ), ัะธัั‚ะตะผะฐ ะฒะบะปัŽั‡ะฐะตั‚ ะดะฒะต ะบะปัŽั‡ะตะฒั‹ะต action-ะผะตั…ะฐะฝะธะบะธ:
      • ะšั€ัŽะบ-ะบะพัˆะบะฐ: ะ ะตะฐะปะธะทะพะฒะฐะฝ ะฝะฐ SpringJoint ะดะปั ัะพะทะดะฐะฝะธั ั„ะธะทะธั‡ะตัะบะธ ะบะพั€ั€ะตะบั‚ะฝะพะณะพ ะพั‰ัƒั‰ะตะฝะธั ะฟั€ะธั‚ัะณะธะฒะฐะฝะธั. ะ˜ะผะตะตั‚ ะพะณั€ะฐะฝะธั‡ะตะฝะฝั‹ะน ั€ะตััƒั€ั (Hook Strength), ะบะพั‚ะพั€ั‹ะน ั‚ั€ะฐั‚ะธั‚ัั ะฒะพ ะฒั€ะตะผั ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั ะธ ั€ะตะณะตะฝะตั€ะธั€ัƒะตั‚ัั ัะพ ะฒั€ะตะผะตะฝะตะผ.
      • ะ ั‹ะฒะบะธ (Dashes): ะ˜ะณั€ะพะบ ะธะผะตะตั‚ ะฝะตัะบะพะปัŒะบะพ ะทะฐั€ัะดะพะฒ ั€ั‹ะฒะบะฐ, ะบะพั‚ะพั€ั‹ะต ะฟะพะทะฒะพะปััŽั‚ ะผะณะฝะพะฒะตะฝะฝะพ ัƒะบะปะพะฝัั‚ัŒัั ะพั‚ ะฐั‚ะฐะบ. ะ—ะฐั€ัะดั‹ ะฒะพััั‚ะฐะฝะฐะฒะปะธะฒะฐัŽั‚ัั ะฟะพ ะพะดะฝะพะผัƒ ั ะพะฟั€ะตะดะตะปะตะฝะฝะพะน ะทะฐะดะตั€ะถะบะพะน.
  • ๐Ÿ”ซ ะกะธัั‚ะตะผะฐ ะพั€ัƒะถะธั ะธ ัะฟะพัะพะฑะฝะพัั‚ะตะน

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: PlayerWeaponsManager.cs, WeaponData.cs, PlayerWeaponRecoil.cs, PlayerImmediatelyProtectionService.cs.
    • ะกัƒั‚ัŒ: ะŸะพะปะฝะพัั‚ัŒัŽ data-driven ัะธัั‚ะตะผะฐ, ะณะดะต ะฒัะต ะพั€ัƒะถะธะต (ะฑะพะปะตะต 10 ะฒะธะดะพะฒ) ะฝะฐัั‚ั€ะฐะธะฒะฐะตั‚ัั ั‡ะตั€ะตะท ScriptableObject. ะŸะพะดะดะตั€ะถะธะฒะฐะตั‚ ั€ะฐะทะปะธั‡ะฝั‹ะต ั€ะตะถะธะผั‹ ัั‚ั€ะตะปัŒะฑั‹ (ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน, ะทะฐั€ัะดะบะฐ, ะดั€ะพะฑะพะฒะธะบ, ะปะฐะทะตั€), ะธะผะตะตั‚ ะบะฐัั‚ะพะผะฝัƒัŽ ัะธัั‚ะตะผัƒ ะพั‚ะดะฐั‡ะธ ะธ ะธะฝั‚ะตะณั€ะธั€ะพะฒะฐะฝะฐ ั ัะธัั‚ะตะผะพะน ะฑะพะตะฟั€ะธะฟะฐัะพะฒ. ะขะฐะบะถะต ะฒะบะปัŽั‡ะฐะตั‚ ะทะฐั‰ะธั‚ะฝัƒัŽ ัะฟะพัะพะฑะฝะพัั‚ัŒ โ€” ะผะพั‰ะฝั‹ะน ะฝะฐะฟั€ะฐะฒะปะตะฝะฝั‹ะน ะฒะทั€ั‹ะฒ (Magnetic Shock), ั€ะฐะฑะพั‚ะฐัŽั‰ะธะน ะฟะพ ะฟั€ะธะฝั†ะธะฟัƒ "ัƒะปัŒั‚ะธะผะตะนั‚ะฐ" ั ะดะพะปะณะพะน ะฟะตั€ะตะทะฐั€ัะดะบะพะน.
  • ๐Ÿ“ˆ ะกะธัั‚ะตะผะฐ ะทะดะพั€ะพะฒัŒั ะธ ะฟั€ะพะบะฐั‡ะบะธ ะบะพัั‚ัŽะผะฐ

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: PlayerMainService.cs (ะบะฐะบ ั…ะฐะฑ), ImprovementItem.cs, DashImprovementItem.cs (ะฟั€ะธะผะตั€ั‹).
    • ะกัƒั‚ัŒ: ะšะพะผะฟะปะตะบัะฝะฐั ัะธัั‚ะตะผะฐ, ัƒะฟั€ะฐะฒะปััŽั‰ะฐั ะทะดะพั€ะพะฒัŒะตะผ, ะฑั€ะพะฝะตะน ะธ ัะพะฟั€ะพั‚ะธะฒะปะตะฝะธะตะผ ัƒั€ะพะฝัƒ. ะ’ะบะปัŽั‡ะฐะตั‚ ะฒ ัะตะฑั ะผะตั…ะฐะฝะธะบัƒ ะฟะตั€ะผะฐะฝะตะฝั‚ะฝั‹ั… ัƒะปัƒั‡ัˆะตะฝะธะน: ะธะณั€ะพะบ ะฝะฐั…ะพะดะธั‚ ะฝะฐ ัƒั€ะพะฒะฝัั… ัะฟะตั†ะธะฐะปัŒะฝั‹ะต ะฟั€ะตะดะผะตั‚ั‹, ะดะฐัŽั‰ะธะต "ะพั‡ะบะธ ะฟั€ะพะบะฐั‡ะบะธ", ะบะพั‚ะพั€ั‹ะต ะผะพะถะฝะพ ะฟะพั‚ั€ะฐั‚ะธั‚ัŒ ะฒ ัะฟะตั†ะธะฐะปัŒะฝะพะผ ะผะตะฝัŽ ะฝะฐ ะฐะฟะณั€ะตะนะด ัะฟะพัะพะฑะฝะพัั‚ะตะน (ัƒะฒะตะปะธั‡ะตะฝะธะต ั‡ะธัะปะฐ ั€ั‹ะฒะบะพะฒ, ัƒัะธะปะตะฝะธะต ะทะฐั‰ะธั‚ะฝะพะณะพ ะฒะทั€ั‹ะฒะฐ ะธ ั‚.ะด.).

II. AI ะธ ะ˜ะณั€ะพะฒั‹ะต ะกั†ะตะฝะฐั€ะธะธ

  • ๐Ÿค– ะขะฐะบั‚ะธั‡ะตัะบะธะน ะ˜ะ˜ ั ะบะพะผะฐะฝะดะฝั‹ะผ ะฒะทะฐะธะผะพะดะตะนัั‚ะฒะธะตะผ

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: DefaultBot.cs (ะฑะฐะทะพะฒั‹ะน ะบะปะฐัั), EnemysAiManager.cs, FlyingDroneBot.cs, TeleporterBot.cs ะธ ะดั€.
    • ะกัƒั‚ัŒ: ะžัะฝะพะฒะฐ ะฟะพะฒะตะดะตะฝะธั ะฒั€ะฐะณะพะฒ (ะฑะพะปะตะต 15 ั‚ะธะฟะพะฒ). AI ะฟะพัั‚ั€ะพะตะฝ ะฝะฐ ะฑะฐะทะต ะบะพะฝะตั‡ะฝะพะณะพ ะฐะฒั‚ะพะผะฐั‚ะฐ (FSM), ั€ะตะฐะปะธะทะพะฒะฐะฝะฝะพะณะพ ะฝะฐ ะบะพั€ัƒั‚ะธะฝะฐั…. ะšะฐะถะดั‹ะน ั‚ะธะฟ ะฒั€ะฐะณะฐ ะฝะฐัะปะตะดัƒะตั‚ัั ะพั‚ DefaultBot ะธ ะธะผะตะตั‚ ัƒะฝะธะบะฐะปัŒะฝัƒัŽ ะปะพะณะธะบัƒ ะฐั‚ะฐะบะธ ะธ ะฟะตั€ะตะดะฒะธะถะตะฝะธั.
    • ะšะพะผะฐะฝะดะฝะฐั ั€ะฐะฑะพั‚ะฐ: EnemysAiManager ะพั‚ัะปะตะถะธะฒะฐะตั‚ ะฒัะตั… "ัƒะผะฝั‹ั…" ะฑะพั‚ะพะฒ ะฝะฐ ัั†ะตะฝะต. ะ•ัะปะธ ะพะดะธะฝ ะธะท ะฝะธั… ะทะฐะผะตั‡ะฐะตั‚ ะธะณั€ะพะบะฐ, ะพะฝ ะผะพะถะตั‚ "ะฟะพะดะฝัั‚ัŒ ั‚ั€ะตะฒะพะณัƒ", ะธ ะฒัะต ะฑะพั‚ั‹ ะฒ ั€ะฐะดะธัƒัะต ั‚ะฐะบะถะต ัั‚ะฐะฝัƒั‚ ะฐะณั€ะตััะธะฒะฝั‹ะผะธ ะธ ะฟะพะปัƒั‡ะฐั‚ ะฟะพัะปะตะดะฝะตะต ะธะทะฒะตัั‚ะฝะพะต ะผะตัั‚ะพะฟะพะปะพะถะตะฝะธะต ะธะณั€ะพะบะฐ.
    • ะกั‚ั€ะตะปัŒะฑะฐ ะฝะฐ ัƒะฟั€ะตะถะดะตะฝะธะต: ะะตะบะพั‚ะพั€ั‹ะต ะฒั€ะฐะณะธ ะธัะฟะพะปัŒะทัƒัŽั‚ ะผะตั‚ะพะด CalculateSmartTargetPos, ะบะพั‚ะพั€ั‹ะน ั€ะฐััั‡ะธั‚ั‹ะฒะฐะตั‚ ะฑัƒะดัƒั‰ัƒัŽ ะฟะพะทะธั†ะธัŽ ะธะณั€ะพะบะฐ ะฝะฐ ะพัะฝะพะฒะต ะตะณะพ ั‚ะตะบัƒั‰ะตะน ัะบะพั€ะพัั‚ะธ ะธ ัะบะพั€ะพัั‚ะธ ะฟะพะปะตั‚ะฐ ัะฝะฐั€ัะดะฐ.
  • ๐ŸŽฌ ะกะธัั‚ะตะผะฐ ัะฟะฐะฒะฝะฐ ะฒั€ะฐะณะพะฒ ะฟะพ ัั†ะตะฝะฐั€ะธัะผ

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะน ะบะปะฐัั: LevelSpawnScenario.cs.
    • ะกัƒั‚ัŒ: ะœะพั‰ะฝั‹ะน ะธะฝัั‚ั€ัƒะผะตะฝั‚ ะดะปั ะปะตะฒะตะป-ะดะธะทะฐะนะฝะฐ, ะฟะพะทะฒะพะปััŽั‰ะธะน ัะพะทะดะฐะฒะฐั‚ัŒ ัะปะพะถะฝั‹ะต ัั†ะตะฝะฐั€ะธะธ ะฟะพัะฒะปะตะฝะธั ะฒั€ะฐะณะพะฒ. ะŸะพะดะดะตั€ะถะธะฒะฐะตั‚ ะฒะพะปะฝั‹, ะทะฐะดะตั€ะถะบะธ ะผะตะถะดัƒ ะฝะธะผะธ, ะฟะพะฒั‚ะพั€ะตะฝะธั, ะดะฒะธะถะตะฝะธะต ะฒั€ะฐะณะพะฒ ะบ ัƒะบะฐะทะฐะฝะฝั‹ะผ ั‚ะพั‡ะบะฐะผ (WayPoint) ะธ ะฐะบั‚ะธะฒะฐั†ะธัŽ UnityEvent'ะพะฒ ะฟะพัะปะต ะทะฐั‡ะธัั‚ะบะธ ะฒัะตั… ะฒั€ะฐะณะพะฒ ะฒ ัั†ะตะฝะฐั€ะธะธ.

III. ะั€ั…ะธั‚ะตะบั‚ัƒั€ะฝั‹ะต ะธ ะ‘ะฐะทะพะฒั‹ะต ะกะธัั‚ะตะผั‹

  • ๐Ÿ’พ ะŸะพะปะฝะฐั ัะธัั‚ะตะผะฐ ัะพั…ั€ะฐะฝะตะฝะธะน

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: LevelSaveLoadSystem.cs, LevelSaveData.cs, FixedJsonUtilityFunc.cs.
    • ะกัƒั‚ัŒ: ะŸะพะทะฒะพะปัะตั‚ ัะตั€ะธะฐะปะธะทะพะฒะฐั‚ัŒ ะธ ะดะตัะตั€ะธะฐะปะธะทะพะฒะฐั‚ัŒ ัะพัั‚ะพัะฝะธะต ะฒัะตะน ะธะณั€ะพะฒะพะน ัั†ะตะฝั‹ ะฒ ะปัŽะฑะพะน ะผะพะผะตะฝั‚ ะฒั€ะตะผะตะฝะธ. ะกะพั…ั€ะฐะฝัะตั‚ ัะพัั‚ะพัะฝะธะต ะธะณั€ะพะบะฐ, ะบะฐะถะดะพะณะพ ะฒั€ะฐะณะฐ, ะปะตั‚ัั‰ะตะณะพ ัะฝะฐั€ัะดะฐ, ะฟั€ะตะดะผะตั‚ะฐ ะธ ั‚ั€ะธะณะณะตั€ะฐ.
      ๐Ÿง  ะžัะพะฑะตะฝะฝะพัั‚ะธ ั€ะตะฐะปะธะทะฐั†ะธะธ...
      ะ”ะปั ัะตั€ะธะฐะปะธะทะฐั†ะธะธ ะฝะตัะตั€ะธะฐะปะธะทัƒะตะผั‹ั… ะฟะพ-ัƒะผะพะปั‡ะฐะฝะธัŽ ั‚ะธะฟะพะฒ Unity (`Dictionary`, `Rigidbody`, `Transform`) ะฑั‹ะป ะฝะฐะฟะธัะฐะฝ ะบะฐัั‚ะพะผะฝั‹ะน ะบะปะฐัั-ั…ะตะปะฟะตั€ `FixedJsonUtilityFunc`, ะบะพั‚ะพั€ั‹ะน ะบะพะฝะฒะตั€ั‚ะธั€ัƒะตั‚ ะธั… ะฒ "ะฟะพะฝัั‚ะฝั‹ะต" ะดะปั `JsonUtility` ั„ะพั€ะผะฐั‚ั‹ ะธ ะพะฑั€ะฐั‚ะฝะพ. ะญั‚ะพ ะดะตะผะพะฝัั‚ั€ะธั€ัƒะตั‚ ัะฟะพัะพะฑะฝะพัั‚ัŒ ะพะฑั…ะพะดะธั‚ัŒ ะพะณั€ะฐะฝะธั‡ะตะฝะธั ัั‚ะฐะฝะดะฐั€ั‚ะฝั‹ั… ะธะฝัั‚ั€ัƒะผะตะฝั‚ะพะฒ.
  • ๐ŸŽถ ะัƒะดะธะพ-ัะธัั‚ะตะผะฐ ั ะฟัƒะปะพะผ ะพะฑัŠะตะบั‚ะพะฒ

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะน ะบะปะฐัั: AudioPoolService.cs.
    • ะกัƒั‚ัŒ: ะ”ะปั ะฒะพัะฟั€ะพะธะทะฒะตะดะตะฝะธั ะทะฒัƒะบะพะฒั‹ั… ัั„ั„ะตะบั‚ะพะฒ ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฟัƒะป ะพะฑัŠะตะบั‚ะพะฒ AudioSource ั ะฟะพะดะดะตั€ะถะบะพะน ะฟั€ะธะพั€ะธั‚ะตั‚ะพะฒ. ะญั‚ะพ ะฟะพะทะฒะพะปัะตั‚ ะธะทะฑะตะถะฐั‚ัŒ ะฟะพัั‚ะพัะฝะฝะพะณะพ ัะพะทะดะฐะฝะธั/ัƒะฝะธั‡ั‚ะพะถะตะฝะธั ะพะฑัŠะตะบั‚ะพะฒ, ั‡ั‚ะพ ะทะฝะฐั‡ะธั‚ะตะปัŒะฝะพ ัะฝะธะถะฐะตั‚ ะบะพะปะธั‡ะตัั‚ะฒะพ ัะฑะพั€ะพะบ ะผัƒัะพั€ะฐ (GC) ะฒะพ ะฒั€ะตะผั ะฐะบั‚ะธะฒะฝะพะณะพ ะณะตะนะผะฟะปะตั.
  • ๐Ÿ“ฆ ะกะธัั‚ะตะผะฐ ะฟั€ะตะดะผะตั‚ะพะฒ ะธ ะฟะพะดะฑะธั€ะฐะตะผั‹ั… ะพะฑัŠะตะบั‚ะพะฒ (Pickups)

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: OrdinaryPlayerItem.cs (ะฑะฐะทะพะฒั‹ะน ะบะปะฐัั), WeaponGetItem.cs, PlayerAmmoItem.cs, PlasmaGetItem.cs.
    • ะกัƒั‚ัŒ: ะŸะพะปะธะผะพั€ั„ะฝะฐั ัะธัั‚ะตะผะฐ, ะณะดะต ะฑะฐะทะพะฒั‹ะน ะบะปะฐัั OrdinaryPlayerItem ะพะฟั€ะตะดะตะปัะตั‚ ะพะฑั‰ัƒัŽ ะปะพะณะธะบัƒ ะฟะพะดะฑะพั€ะฐ, ะฐ ะดะพั‡ะตั€ะฝะธะต ะบะปะฐััั‹ ั€ะตะฐะปะธะทัƒัŽั‚ ะบะพะฝะบั€ะตั‚ะฝะพะต ะฟะพะฒะตะดะตะฝะธะต: ะฒั‹ะดะฐั‚ัŒ ะพั€ัƒะถะธะต, ะฟะพะฟะพะปะฝะธั‚ัŒ ะฑะพะตะทะฐะฟะฐั, ะฒะพัะฟะพะปะฝะธั‚ัŒ ะทะดะพั€ะพะฒัŒะต/ะฑั€ะพะฝัŽ ะธะปะธ ะดะพะฑะฐะฒะธั‚ัŒ ะฟะปะฐะทะผัƒ ะดะปั ะบั€ะฐั„ั‚ะฐ ะฟะฐั‚ั€ะพะฝะพะฒ.

IV. UI ะธ ะžะฑั€ะฐั‚ะฝะฐั ัะฒัะทัŒ

  • ๐Ÿ’ป HUD ะธ ะ˜ะฝะดะธะบะฐั‚ะพั€ั‹

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: MainCircleUI.cs, DashsIndicatorService.cs, HookCircle.cs, BulletsIndicators.cs.
    • ะกัƒั‚ัŒ: ะšะพะผะฟะปะตะบัะฝั‹ะน ะธะณั€ะพะฒะพะน ะธะฝั‚ะตั€ั„ะตะนั, ะบะพั‚ะพั€ั‹ะน ะฒ ั€ะตะฐะปัŒะฝะพะผ ะฒั€ะตะผะตะฝะธ ะพั‚ะพะฑั€ะฐะถะฐะตั‚ ะฒััŽ ะฒะฐะถะฝัƒัŽ ะธะฝั„ะพั€ะผะฐั†ะธัŽ: ะทะดะพั€ะพะฒัŒะต, ะฑั€ะพะฝัŽ, ะฒั‹ะฑั€ะฐะฝะฝะพะต ะพั€ัƒะถะธะต (ะฒ ะฒะธะดะต ะฐะฝะธะผะธั€ะพะฒะฐะฝะฝะพะณะพ "ะบะพะปะตัะฐ"), ะบะพะปะธั‡ะตัั‚ะฒะพ ะฟะฐั‚ั€ะพะฝะพะฒ, ะดะพัั‚ัƒะฟะฝั‹ะต ั€ั‹ะฒะบะธ ะธ ัะฝะตั€ะณะธัŽ ะบั€ัŽะบะฐ-ะบะพัˆะบะธ.
  • ๐ŸŽฏ ะšะพะฝั‚ะตะบัั‚ะฝั‹ะต ะฟะพะดัะบะฐะทะบะธ ะธ ะธะฝั„ะพั€ะผะฐั†ะธั

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: AdditionalInformationPanel.cs, KeyboardKeyTip.cs, LevelTaskService.cs.
    • ะกัƒั‚ัŒ: ะกะธัั‚ะตะผะฐ ะฟั€ะตะดะพัั‚ะฐะฒะปัะตั‚ ะธะณั€ะพะบัƒ ะพะฑั€ะฐั‚ะฝัƒัŽ ัะฒัะทัŒ:
      • ะŸั€ะธ ะฝะฐะฒะตะดะตะฝะธะธ ะฝะฐ ะธะฝั‚ะตั€ะฐะบั‚ะธะฒะฝั‹ะน ะพะฑัŠะตะบั‚ ะธะปะธ ะฒั€ะฐะณะฐ ะฟะพัะฒะปัะตั‚ัั ะฟะฐะฝะตะปัŒ ั ะธะฝั„ะพั€ะผะฐั†ะธะตะน ะพ ะฝั‘ะผ (AdditionalInformationPanel).
      • ะะฐัะบั€ะฐะฝะฝั‹ะต ะฟะพะดัะบะฐะทะบะธ ะฟะพ ัƒะฟั€ะฐะฒะปะตะฝะธัŽ (KeyboardKeyTip) ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะพะฑะฝะพะฒะปััŽั‚ัั ะฟั€ะธ ะธะทะผะตะฝะตะฝะธะธ ั€ะฐัะบะปะฐะดะบะธ ะฒ ะฝะฐัั‚ั€ะพะนะบะฐั….
      • ะกะธัั‚ะตะผะฐ ะทะฐะดะฐั‡ (LevelTaskService) ะฒั‹ะฒะพะดะธั‚ ะฝะฐ ัะบั€ะฐะฝ ั‚ะตะบัƒั‰ัƒัŽ ั†ะตะปัŒ ะผะธััะธะธ.

V. ะœะตะฝัŽ ะธ ะะฐัั‚ั€ะพะนะบะธ

  • โš™๏ธ ะšะพะผะฟะปะตะบัะฝะพะต ะผะตะฝัŽ ะฝะฐัั‚ั€ะพะตะบ

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: SettingsSaveLoadSystem.cs, SettingsSetSystem.cs.
    • ะกัƒั‚ัŒ: ะŸะพะปะฝะพั„ัƒะฝะบั†ะธะพะฝะฐะปัŒะฝะพะต ะผะตะฝัŽ ะฝะฐัั‚ั€ะพะตะบ, ะฟะพะทะฒะพะปััŽั‰ะตะต ะธะณั€ะพะบัƒ ะบะฐัั‚ะพะผะธะทะธั€ะพะฒะฐั‚ัŒ ะฟั€ะฐะบั‚ะธั‡ะตัะบะธ ะฒัะต ะฐัะฟะตะบั‚ั‹ ะธะณั€ั‹. ะ’ัะต ะฝะฐัั‚ั€ะพะนะบะธ ัะพั…ั€ะฐะฝััŽั‚ัั ะธ ะทะฐะณั€ัƒะถะฐัŽั‚ัั ะธะท ั„ะฐะนะปะฐ.
    • ะ“ั€ะฐั„ะธะบะฐ: ะšะฐั‡ะตัั‚ะฒะพ ั‚ะตะบัั‚ัƒั€, ะฐะฝะธะทะพั‚ั€ะพะฟะฝะฐั ั„ะธะปัŒั‚ั€ะฐั†ะธั, ั€ะฐะทั€ะตัˆะตะฝะธะต ะธ ะดะธัั‚ะฐะฝั†ะธั ั‚ะตะฝะตะน, SSAO, MSAA, ะบะฐั‡ะตัั‚ะฒะพ ั€ะฐัั‚ะธั‚ะตะปัŒะฝะพัั‚ะธ, ะดะธัั‚ะฐะฝั†ะธั ะฟั€ะพั€ะธัะพะฒะบะธ, VSync, FOV, ั€ะฐะทั€ะตัˆะตะฝะธะต ะธ ั„ะพั€ะผะฐั‚ ัะบั€ะฐะฝะฐ.
    • ะฃะฟั€ะฐะฒะปะตะฝะธะต: ะŸะพะปะฝะฐั ะฟะตั€ะตะฝะฐัั‚ั€ะพะนะบะฐ ะฒัะตั… ะบะปะฐะฒะธัˆ (InputButtonField.cs), ะฒะบะปัŽั‡ะฐั ะดะตะนัั‚ะฒะธั ะผั‹ัˆะธ ะธ ะบะพะปะตัะฐ ะฟั€ะพะบั€ัƒั‚ะบะธ, ะฐ ั‚ะฐะบะถะต ะฝะฐัั‚ั€ะพะนะบะฐ ั‡ัƒะฒัั‚ะฒะธั‚ะตะปัŒะฝะพัั‚ะธ.
    • ะ—ะฒัƒะบ: ะ ะฐะทะดะตะปัŒะฝะฐั ั€ะตะณัƒะปะธั€ะพะฒะบะฐ ะณั€ะพะผะบะพัั‚ะธ (ะผะฐัั‚ะตั€, ะผัƒะทั‹ะบะฐ, ัั„ั„ะตะบั‚ั‹, ะพะบั€ัƒะถะตะฝะธะต, UI), ะฝะฐัั‚ั€ะพะนะบะฐ ะผะฐะบัะธะผะฐะปัŒะฝะพะณะพ ะบะพะปะธั‡ะตัั‚ะฒะฐ ะทะฒัƒะบะพะฒั‹ั… ะธัั‚ะพั‡ะฝะธะบะพะฒ.
  • ๐ŸŒ ะกะธัั‚ะตะผะฐ ะปะพะบะฐะปะธะทะฐั†ะธะธ

    • ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝั‹ะต ะบะปะฐััั‹: CurrentLanguageData.cs, StaticTextLanguageAdaptable.cs.
    • ะกัƒั‚ัŒ: ะ ะตะฐะปะธะทะพะฒะฐะฝะฐ ัะธัั‚ะตะผะฐ, ะฟะพะทะฒะพะปััŽั‰ะฐั ะฟะตั€ะตะฒะพะดะธั‚ัŒ ะฒะตััŒ ะธะณั€ะพะฒะพะน ั‚ะตะบัั‚. ะขะตะบัั‚ะพะฒั‹ะต ะดะฐะฝะฝั‹ะต ั…ั€ะฐะฝัั‚ัั ะฒ ScriptableObject (LanguageData), ะฐ ัะฟะตั†ะธะฐะปัŒะฝั‹ะต ะบะพะผะฟะพะฝะตะฝั‚ั‹ ะฝะฐ UI-ัะปะตะผะตะฝั‚ะฐั… (StaticTextLanguageAdaptable) ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะฟะพะดะณั€ัƒะถะฐัŽั‚ ะฝัƒะถะฝั‹ะน ะฟะตั€ะตะฒะพะด ะฟั€ะธ ัะผะตะฝะต ัะทั‹ะบะฐ ะฒ ะฝะฐัั‚ั€ะพะนะบะฐั….

๐Ÿš€ ะšะตะนั-ัั‚ะฐะดะธ: ะŸั€ะพะตะบั‚ะธั€ะพะฒะฐะฝะธะต ะŸะพะปะฝะพะน ะกะธัั‚ะตะผั‹ ะกะพั…ั€ะฐะฝะตะฝะธะน

ะกะฐะผะพะน ัะปะพะถะฝะพะน ะธ ะธะฝั‚ะตั€ะตัะฝะพะน ะทะฐะดะฐั‡ะตะน ะฒ ะฟั€ะพะตะบั‚ะต ะฑั‹ะปะฐ ั€ะตะฐะปะธะทะฐั†ะธั ัะธัั‚ะตะผั‹ ัะพั…ั€ะฐะฝะตะฝะธะน, ะบะพั‚ะพั€ะฐั ะฝะต ะฟั€ะพัั‚ะพ ะทะฐะฟะพะผะธะฝะฐะตั‚ ั‡ะตะบะฟะพะธะฝั‚, ะฐ "ะทะฐะผะพั€ะฐะถะธะฒะฐะตั‚" ะฒะตััŒ ะธะณั€ะพะฒะพะน ะผะธั€ ะฒ ะปัŽะฑะพะน ะผะพะผะตะฝั‚ ะฒั€ะตะผะตะฝะธ.

Note

ะŸะพะบะฐะทะฐั‚ัŒ ะฟะพะปะฝั‹ะน ั€ะฐะทะฑะพั€ ัะธัั‚ะตะผั‹...

๐Ÿ“ ะŸั€ะพะตะบั‚ะธั€ะพะฒะฐะฝะธะต ัะธัั‚ะตะผั‹ ัะพั…ั€ะฐะฝะตะฝะธะน "Save-Anywhere"

1. ๐Ÿง ะŸั€ะพะฑะปะตะผะฐ ะธ ะฆะตะปะธ

ะ’ ะฑะพะปัŒัˆะธะฝัั‚ะฒะต ะธะณั€ ัะพั…ั€ะฐะฝะตะฝะธะต ะฟั€ะพะธัั…ะพะดะธั‚ ะฒ ัั‚ั€ะพะณะพ ะพะฟั€ะตะดะตะปะตะฝะฝั‹ั… ั‚ะพั‡ะบะฐั…. ะฆะตะปัŒ ะฑั‹ะปะฐ ะฐะผะฑะธั†ะธะพะทะฝะตะต: ะดะฐั‚ัŒ ะธะณั€ะพะบัƒ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ัะพั…ั€ะฐะฝะธั‚ัŒัั ะฒ ั€ะฐะทะณะฐั€ะต ะฑะพั, ะฒะพ ะฒั€ะตะผั ะฟะพะปะตั‚ะฐ ั€ะฐะบะตั‚ั‹ ะธะปะธ ะดะธะฐะปะพะณะฐ, ะฐ ะฟะพัะปะต ะทะฐะณั€ัƒะทะบะธ โ€” ะฒะตั€ะฝัƒั‚ัŒัั ะฒ ะฐะฑัะพะปัŽั‚ะฝะพ ะธะดะตะฝั‚ะธั‡ะฝะพะต ัะพัั‚ะพัะฝะธะต ะผะธั€ะฐ.

ะšะปัŽั‡ะตะฒั‹ะต ั‚ั€ะตะฑะพะฒะฐะฝะธั:

  • ะกะพั…ั€ะฐะฝัั‚ัŒ ัะพัั‚ะพัะฝะธะต ะฒัะตั… ะดะธะฝะฐะผะธั‡ะตัะบะธั… ััƒั‰ะฝะพัั‚ะตะน.
  • ะ ะฐะฑะพั‚ะฐั‚ัŒ ั ะฝะตัะตั€ะธะฐะปะธะทัƒะตะผั‹ะผะธ ั‚ะธะฟะฐะผะธ Unity.
  • ะšะพั€ั€ะตะบั‚ะฝะพ ะฒะพััั‚ะฐะฝะฐะฒะปะธะฒะฐั‚ัŒ ัั†ะตะฝัƒ, ะธะทะฑะตะณะฐั ะดัƒะฑะปะธะบะฐั‚ะพะฒ ะธ ะฟะพั‚ะตั€ัะฝะฝั‹ั… ะพะฑัŠะตะบั‚ะพะฒ.

2. ๐Ÿ—๏ธ ะั€ั…ะธั‚ะตะบั‚ัƒั€ะฐ ะธ ะ ะตะฐะปะธะทะฐั†ะธั

ะกะธัั‚ะตะผะฐ ัะพัั‚ะพะธั‚ ะธะท ั‚ั€ะตั… ะบะปัŽั‡ะตะฒั‹ั… ะบะพะผะฟะพะฝะตะฝั‚ะพะฒ:

  • LevelSaveData.cs: "ะšะพะฝั‚ะตะนะฝะตั€" ะดะปั ะดะฐะฝะฝั‹ั…. ะญั‚ะพั‚ MonoBehaviour ะดะธะฝะฐะผะธั‡ะตัะบะธ ัะพะฑะธั€ะฐะตั‚ ััั‹ะปะบะธ ะฝะฐ ะฒัะต ะพะฑัŠะตะบั‚ั‹, ะบะพั‚ะพั€ั‹ะต ะฝัƒะถะฝะพ ัะพั…ั€ะฐะฝะธั‚ัŒ: ะธะณั€ะพะบะฐ, ะฒั€ะฐะณะพะฒ, ะฟัƒะปะธ, ะฟั€ะตะดะผะตั‚ั‹, ั‚ั€ะธะณะณะตั€ั‹. ะŸะตั€ะตะด ัะตั€ะธะฐะปะธะทะฐั†ะธะตะน ะพะฝ "ะพะฟั€ะฐัˆะธะฒะฐะตั‚" ะบะฐะถะดั‹ะน ะพะฑัŠะตะบั‚ ะธ ัะพั…ั€ะฐะฝัะตั‚ ะตะณะพ ัะพัั‚ะพัะฝะธะต ะฒ ะฒะธะดะต ะฟั€ะพัั‚ะพะณะพ Serializable ะบะปะฐััะฐ.

  • FixedJsonUtilityFunc.cs: "ะŸะตั€ะตะฒะพะดั‡ะธะบ". ะกั‚ะฐะฝะดะฐั€ั‚ะฝั‹ะน JsonUtility ะฝะต ัƒะผะตะตั‚ ั€ะฐะฑะพั‚ะฐั‚ัŒ ั Transform, Rigidbody, Dictionary ะธ ะดั€ัƒะณะธะผะธ ัะปะพะถะฝั‹ะผะธ ั‚ะธะฟะฐะผะธ. ะญั‚ะพั‚ ัั‚ะฐั‚ะธั‡ะตัะบะธะน ะบะปะฐัั ัะพะดะตั€ะถะธั‚ ะผะตั‚ะพะดั‹, ะบะพั‚ะพั€ั‹ะต "ั€ะฐะทะฑะธั€ะฐัŽั‚" ัั‚ะธ ะพะฑัŠะตะบั‚ั‹ ะฝะฐ ะฑะฐะทะพะฒั‹ะต ั‚ะธะฟั‹ (ะฝะฐะฟั€ะธะผะตั€, Transform ะฝะฐ Vector3 ะฟะพะทะธั†ะธะธ, Quaternion ะฒั€ะฐั‰ะตะฝะธั ะธ Vector3 ัะบะตะนะปะฐ) ะธ "ัะพะฑะธั€ะฐัŽั‚" ะธั… ะพะฑั€ะฐั‚ะฝะพ ะฟั€ะธ ะทะฐะณั€ัƒะทะบะต.

  • LevelSaveLoadSystem.cs: "ะžั€ะบะตัั‚ั€ะฐั‚ะพั€". ะญั‚ะพั‚ ะบะปะฐัั ัƒะฟั€ะฐะฒะปัะตั‚ ะฒัะตะผ ะฟั€ะพั†ะตััะพะผ:

    1. ะŸั€ะธ ัะพั…ั€ะฐะฝะตะฝะธะธ: ะ’ั‹ะทั‹ะฒะฐะตั‚ ะผะตั‚ะพะด SaveToJson() ัƒ LevelSaveData, ะบะพั‚ะพั€ั‹ะน ัะพะฑะธั€ะฐะตั‚ ะฒัะต ะดะฐะฝะฝั‹ะต, ะบะพะฝะฒะตั€ั‚ะธั€ัƒะตั‚ ะธั… ะฒ JSON ะธ ะทะฐะฟะธัั‹ะฒะฐะตั‚ ะฒ ั„ะฐะนะป ั ะฟะพะผะพั‰ัŒัŽ BinaryFormatter (ะดะปั ะฟั€ะพัั‚ะพั‚ั‹).
    2. ะŸั€ะธ ะทะฐะณั€ัƒะทะบะต:
      • ะ—ะฐะณั€ัƒะถะฐะตั‚ ัั†ะตะฝัƒ ะฟะพ ID, ัะพั…ั€ะฐะฝะตะฝะฝะพะผัƒ ะฒ ั„ะฐะนะปะต.
      • (ะšะปัŽั‡ะตะฒะพะน ัˆะฐะณ) ะŸะพัะปะต ะทะฐะณั€ัƒะทะบะธ ัั†ะตะฝั‹ ัƒะฝะธั‡ั‚ะพะถะฐะตั‚ ะฒัะตั… ะดะธะฝะฐะผะธั‡ะตัะบะธั… ะฒั€ะฐะณะพะฒ, ะฟั€ะตะดะผะตั‚ั‹ ะธ ะฟัƒะปะธ, ะบะพั‚ะพั€ั‹ะต ะฑั‹ะปะธ ะฝะฐ ัั†ะตะฝะต ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ.
      • ะงะธั‚ะฐะตั‚ JSON ะธะท ั„ะฐะนะปะฐ.
      • ะŸั€ะพั…ะพะดะธั‚ ะฟะพ ัะพั…ั€ะฐะฝะตะฝะฝั‹ะผ ะดะฐะฝะฝั‹ะผ ะธ ะฒะพััะพะทะดะฐะตั‚ ะบะฐะถะดั‹ะน ะพะฑัŠะตะบั‚ ะธะท ะฟั€ะตั„ะฐะฑะฐ, ะฐ ะทะฐั‚ะตะผ ะฟั€ะธะผะตะฝัะตั‚ ะบ ะฝะตะผัƒ ัะพั…ั€ะฐะฝะตะฝะฝะพะต ัะพัั‚ะพัะฝะธะต (ะฟะพะทะธั†ะธัŽ, ะทะดะพั€ะพะฒัŒะต, ัะบะพั€ะพัั‚ัŒ ะธ ั‚.ะด.).

3. ๐ŸŽ‰ ะ ะตะทัƒะปัŒั‚ะฐั‚ั‹ ะธ ะ’ั‹ะฒะพะดั‹

  • ะ ะตะทัƒะปัŒั‚ะฐั‚: ะ‘ั‹ะปะฐ ัะพะทะดะฐะฝะฐ ะฟะพะปะฝะพัั‚ัŒัŽ ั€ะฐะฑะพั‡ะฐั ัะธัั‚ะตะผะฐ, ะฟะพะทะฒะพะปััŽั‰ะฐั ัะพั…ั€ะฐะฝัั‚ัŒ ะธ ะทะฐะณั€ัƒะถะฐั‚ัŒ ะธะณั€ัƒ ะฒ ะปัŽะฑะพะน ะผะพะผะตะฝั‚.
  • ะŸะพะปัƒั‡ะตะฝะฝั‹ะน ะพะฟั‹ั‚: ะญั‚ะพั‚ ะฟั€ะพั†ะตัั ะฝะฐัƒั‡ะธะป ะผะตะฝั ะณะปัƒะฑะพะบะพะน ั€ะฐะฑะพั‚ะต ั ัะตั€ะธะฐะปะธะทะฐั†ะธะตะน, ั€ะตั„ะปะตะบัะธะตะน (ะดะปั ะดะพัั‚ัƒะฟะฐ ะบ ั‚ะธะฟะฐะผ ะพะฑัŠะตะบั‚ะพะฒ), ัƒะฟั€ะฐะฒะปะตะฝะธัŽ ะถะธะทะฝะตะฝะฝั‹ะผ ั†ะธะบะปะพะผ ะพะฑัŠะตะบั‚ะพะฒ ะธ ะฒะฐะถะฝะพัั‚ะธ ัั‚ั€ะพะณะพะณะพ ะฟะพั€ัะดะบะฐ ะพะฟะตั€ะฐั†ะธะน ะฟั€ะธ ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธะธ ัะปะพะถะฝะพะน ัั†ะตะฝั‹. ะญั‚ะพั‚ ะพะฟั‹ั‚ ัั‚ะฐะป ั„ัƒะฝะดะฐะผะตะฝั‚ะพะผ ะดะปั ะผะพะธั… ะดะฐะปัŒะฝะตะนัˆะธั…, ะฑะพะปะตะต ัะปะพะถะฝั‹ั… ะฐั€ั…ะธั‚ะตะบั‚ัƒั€ะฝั‹ั… ั€ะตัˆะตะฝะธะน.

4. ๐Ÿค” ะšะพะผะฟั€ะพะผะธััั‹ ะธ ะขะพั‡ะบะธ ะ ะพัั‚ะฐ

  • ะŸั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ: ะขะตะบัƒั‰ะฐั ั€ะตะฐะปะธะทะฐั†ะธั ะธัะฟะพะปัŒะทัƒะตั‚ JsonUtility, ะบะพั‚ะพั€ั‹ะน ะฝะต ัะฒะปัะตั‚ัั ัะฐะผั‹ะผ ะฑั‹ัั‚ั€ั‹ะผ ะผะตั‚ะพะดะพะผ ัะตั€ะธะฐะปะธะทะฐั†ะธะธ. ะ’ ั€ะตะฐะปัŒะฝะพะผ ะะะ-ะฟั€ะพะตะบั‚ะต ัั‚ะพะธะปะพ ะฑั‹ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะฑะพะปะตะต ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝั‹ะต ะฑะธะฝะฐั€ะฝั‹ะต ัะตั€ะธะฐะปะธะทะฐั‚ะพั€ั‹.
  • "ะฅั€ัƒะฟะบะพัั‚ัŒ": ะกะธัั‚ะตะผะฐ ัะธะปัŒะฝะพ ะทะฐะฒะธัะธั‚ ะพั‚ ะฝะฐะปะธั‡ะธั ะฟั€ะตั„ะฐะฑะพะฒ ั ะฝัƒะถะฝั‹ะผะธ ะบะพะผะฟะพะฝะตะฝั‚ะฐะผะธ. ะ˜ะทะผะตะฝะตะฝะธะต ะฟั€ะตั„ะฐะฑะฐ ะผะพะถะตั‚ "ัะปะพะผะฐั‚ัŒ" ัั‚ะฐั€ั‹ะต ัะพั…ั€ะฐะฝะตะฝะธั. ะ’ ะฑัƒะดัƒั‰ะตะผ ะผะพะถะฝะพ ะฑั‹ะปะพ ะฑั‹ ะฒะฝะตะดั€ะธั‚ัŒ ัะธัั‚ะตะผัƒ ะฒะตั€ัะธะพะฝะธั€ะพะฒะฐะฝะธั ัะพั…ั€ะฐะฝะตะฝะธะน ะดะปั ะพะฑั€ะฐั‚ะฝะพะน ัะพะฒะผะตัั‚ะธะผะพัั‚ะธ.

๐Ÿ“ˆ ะงั‚ะพ ั ะฒั‹ะฝะตั ะธะท ัั‚ะพะณะพ ะฟั€ะพะตะบั‚ะฐ

ะญั‚ะพั‚ ะฟั€ะพะตะบั‚ ะฑั‹ะป ะผะพะตะน "ะฟะตัะพั‡ะฝะธั†ะตะน" ะดะปั ั„ัƒะฝะดะฐะผะตะฝั‚ะฐะปัŒะฝั‹ั… ะผะตั…ะฐะฝะธะบ. ะžั‚ััƒั‚ัั‚ะฒะธะต ัั‚ั€ะพะณะพะน ะฐั€ั…ะธั‚ะตะบั‚ัƒั€ั‹ ะธ DI-ั„ั€ะตะนะผะฒะพั€ะบะพะฒ ะทะฐัั‚ะฐะฒะธะปะพ ะผะตะฝั ั€ะตัˆะฐั‚ัŒ ะผะฝะพะณะธะต ะฟั€ะพะฑะปะตะผั‹ "ะฒั€ัƒั‡ะฝัƒัŽ", ั‡ั‚ะพ ะดะฐะปะพ ะฑะตัั†ะตะฝะฝะพะต ะฟะพะฝะธะผะฐะฝะธะต ั‚ะพะณะพ, ะบะฐะบ ะฝะฐ ัะฐะผะพะผ ะดะตะปะต ั€ะฐะฑะพั‚ะฐะตั‚ Unity. ะญั‚ะพั‚ ะพะฟั‹ั‚ ะฝะฐะฟั€ัะผัƒัŽ ะฟะพะฒะปะธัะป ะฝะฐ ะผะพะธ ะฟะพัะปะตะดัƒัŽั‰ะธะต ะฟั€ะพะตะบั‚ั‹, ะณะดะต ั ัƒะถะต ะพัะพะทะฝะฐะฝะฝะพ ะฟั€ะธะผะตะฝัะป SOLID, DI ะธ ะดั€ัƒะณะธะต ะฟะฐั‚ั‚ะตั€ะฝั‹ ะดะปั ั€ะตัˆะตะฝะธั ะฟั€ะพะฑะปะตะผ, ั ะบะพั‚ะพั€ั‹ะผะธ ัั‚ะพะปะบะฝัƒะปัั ะทะดะตััŒ.

ะกะฟะฐัะธะฑะพ ะทะฐ ะฒะฝะธะผะฐะฝะธะต!












Russian ะ ัƒััะบะฐั ะฒะตั€ัะธั icon

Ancelight Logo

Hi! This is "Ancelight"โ€”my old project where I implemented all the mechanics of a classic FPS from scratch.

Download Build

Gameplay Video LinkedIn Telegram


Gameplay Demo Save-Load System


TL;DR

  • ๐Ÿƒโ€โ™‚๏ธ Advanced Movement System: The player does more than just walk and jump. Key "action-FPS" mechanics have been implemented: a grappling hook (PlayerHookService) with its own physics based on SpringJoint and resource consumption, as well as a dash system (PlayerDashsService) limited by charges and cooldowns.
  • ๐Ÿ’พ Comprehensive Save System: Implemented the ability to save and load the game at any moment. The system processes and restores the state of all dynamic objects: from flying projectiles and enemies (including their current attack phase) to the position of doors and the state of triggers.
  • ๐Ÿ“ˆ Suit Upgrade and Customization System: The game features a full-fledged permanent upgrade system. The player collects special items (EnchancedSuitPointItem) to earn upgrade points, which can then be invested in improving abilities (increasing the number of dashes, enhancing the protective blast, upgrading the grappling hook).
  • ๐Ÿค– Tactical AI with Team Interaction: Over 15 unique enemy types have been created. Thanks to an "alert" system (EnemysAiManager), an enemy that spots the player can warn nearby allies, causing the entire group to attack in a coordinated manner. Some enemies can shoot predictively.
  • ๐Ÿ”ซ Data-Driven Weapon System: An arsenal of 10+ weapons is fully configurable via ScriptableObject. Various firing modes (automatic, charged, shotgun, laser), an ammunition system, and a custom procedural recoil (PlayerWeaponRecoil) have been implemented.
  • ๐ŸŽจ Advanced Shader Work: Complex shaders for visual effects were written from scratch, including an energy shield with a distortion effect, dynamic water, and animated UI shaders with iridescent lines.
  • ๐Ÿ–Œ๏ธ Asset Creation from Scratch: A significant portion of the game's assets, including 3D models, textures, icons, and UI elements, was created independently, demonstrating a comprehensive approach to development and an understanding of the entire content creation pipeline.
  • ๐ŸŽฏ Dynamic Quest System: The levels feature a task system (LevelTaskService) that sets goals for the player (e.g., "eliminate all enemies in the area") and tracks their completion, guiding the gameplay.

Gameplay Demo Save-Load System


๐Ÿ’ก About the Project

"Ancelight" is a dynamic FPS created as a training ground for developing and implementing complex game systems from scratch. The main focus was not on the visual component, but on the in-depth development of "under-the-hood" mechanics: AI, the save system, physics, and resource management.

Note

More about the project...
  • ๐ŸŽฎ Gameplay: A classic shooter with a variety of enemies, each with unique behavior. The player can use different weapons, perks, and special abilities to complete levels.

  • ๐ŸŽฏ Project Goal: To develop and organize a multitude of complex and interconnected game systems into a single, functional mechanism: from advanced enemy AI and an extensive arsenal of weapons to a comprehensive save system and custom physics. The main task was to create a stable and functional foundation capable of supporting this entire complex of mechanics.


๐Ÿ› ๏ธ Key Implemented Systems

The project is built on several fundamental systems, written from scratch to ensure full control over the game's behavior. Each system was designed with a focus on functionality and solving specific gameplay challenges.

Note

Show the full list of systems...

I. Player Core Systems

  • ๐Ÿƒโ€โ™‚๏ธ Advanced Movement System (Mobility Suite)

    • Responsible Classes: PlayerMovement.cs, PlayerDashsService.cs, PlayerHookService.cs.
    • Essence: In addition to standard movement (walking, crouching, jumping), the system includes two key action mechanics:
      • Grappling Hook: Implemented with a SpringJoint to create a physically accurate feeling of being pulled. It has a limited resource (Hook Strength) that is consumed during use and regenerates over time.
      • Dashes: The player has several dash charges that allow for instant evasion of attacks. Charges are restored one by one with a certain delay.
  • ๐Ÿ”ซ Weapon and Ability System

    • Responsible Classes: PlayerWeaponsManager.cs, WeaponData.cs, PlayerWeaponRecoil.cs, PlayerImmediatelyProtectionService.cs.
    • Essence: A completely data-driven system where all weapons (over 10 types) are configured via ScriptableObject. It supports various firing modes (automatic, charged, shotgun, laser), has a custom recoil system, and is integrated with an ammunition system. It also includes a defensive abilityโ€”a powerful directional blast (Magnetic Shock) that functions as an "ultimate" with a long cooldown.
  • ๐Ÿ“ˆ Health and Suit Upgrade System

    • Responsible Classes: PlayerMainService.cs (as a hub), ImprovementItem.cs, DashImprovementItem.cs (examples).
    • Essence: A comprehensive system that manages health, armor, and damage resistance. It includes a permanent upgrade mechanic: the player finds special items on levels that grant "upgrade points," which can be spent in a special menu to upgrade abilities (increasing the number of dashes, enhancing the protective blast, etc.).

II. AI and Game Scenarios

  • ๐Ÿค– Tactical AI with Team Interaction

    • Responsible Classes: DefaultBot.cs (base class), EnemysAiManager.cs, FlyingDroneBot.cs, TeleporterBot.cs, etc.
    • Essence: The foundation of enemy behavior (over 15 types). The AI is built on a finite-state machine (FSM) implemented with coroutines. Each enemy type inherits from DefaultBot and has unique attack and movement logic.
      • Teamwork: EnemysAiManager tracks all "smart" bots on the scene. If one of them spots the player, it can "raise an alarm," and all bots within a certain radius will also become aggressive and receive the player's last known location.
      • Predictive Shooting: Some enemies use the CalculateSmartTargetPos method, which calculates the player's future position based on their current velocity and the projectile's speed.
  • ๐ŸŽฌ Enemy Spawning System via Scenarios

    • Responsible Class: LevelSpawnScenario.cs.
    • Essence: A powerful tool for level design that allows creating complex enemy appearance scenarios. It supports waves, delays between them, repetitions, moving enemies to specified points (WayPoint), and activating UnityEvents after clearing all enemies in a scenario.

III. Architectural and Core Systems

  • ๐Ÿ’พ Comprehensive Save System

    • Responsible Classes: LevelSaveLoadSystem.cs, LevelSaveData.cs, FixedJsonUtilityFunc.cs.
    • Essence: Allows serializing and deserializing the state of the entire game scene at any moment. It saves the state of the player, every enemy, flying projectile, item, and trigger. To serialize non-serializable Unity types by default (Dictionary, Rigidbody, Transform), a custom helper class FixedJsonUtilityFunc was written to convert them into formats understandable by JsonUtility and back. This demonstrates the ability to work around the limitations of standard tools.
  • ๐ŸŽถ Audio System with Object Pooling

    • Responsible Class: AudioPoolService.cs.
    • Essence: An object pool of AudioSource components is used for playing sound effects, with support for priorities. This avoids constant instantiation and destruction of objects, significantly reducing garbage collection (GC) overhead during active gameplay.
  • ๐Ÿ“ฆ Item and Pickup System

    • Responsible Classes: OrdinaryPlayerItem.cs (base class), WeaponGetItem.cs, PlayerAmmoItem.cs, PlasmaGetItem.cs.
    • Essence: A polymorphic system where the base class OrdinaryPlayerItem defines the general pickup logic, and child classes implement specific behaviors: granting a weapon, replenishing ammo, restoring health/armor, or adding plasma for crafting ammo.

IV. UI and Feedback

  • HUD and Indicators

    • Responsible Classes: MainCircleUI.cs, DashsIndicatorService.cs, HookCircle.cs, BulletsIndicators.cs.
    • Essence: A comprehensive game interface that displays all vital information in real-time: health, armor, selected weapon (in an animated "wheel"), ammo count, available dashes, and grappling hook energy.
  • ๐ŸŽฏ Contextual Hints and Information

    • Responsible Classes: AdditionalInformationPanel.cs, KeyboardKeyTip.cs, LevelTaskService.cs.
    • Essence: The system provides feedback to the player:
      • When aiming at an interactive object or enemy, a panel with information about it appears (AdditionalInformationPanel).
      • On-screen control hints (KeyboardKeyTip) automatically update when the key layout is changed in the settings.
      • The task system (LevelTaskService) displays the current mission objective on the screen.

V. Menus and Settings

  • โš™๏ธ Comprehensive Settings Menu

    • Responsible Classes: SettingsSaveLoadSystem.cs, SettingsSetSystem.cs.
    • Essence: A fully functional settings menu that allows the player to customize almost every aspect of the game. All settings are saved to and loaded from a file.
      • Graphics: Texture quality, anisotropic filtering, shadow resolution and distance, SSAO, MSAA, vegetation quality, draw distance, VSync, FOV, screen resolution, and display mode.
      • Controls: Full rebinding of all keys (InputButtonField.cs), including mouse actions and scroll wheel, as well as sensitivity settings.
      • Sound: Separate volume controls (master, music, effects, ambient, UI), and configuration of the maximum number of sound sources.
  • ๐ŸŒ Localization System

    • Responsible Classes: CurrentLanguageData.cs, StaticTextLanguageAdaptable.cs.
    • Essence: A system has been implemented to translate all in-game text. Text data is stored in a ScriptableObject (LanguageData), and special components on UI elements (StaticTextLanguageAdaptable) automatically load the correct translation when the language is changed in the settings.

๐Ÿš€ Case Study: Designing a Comprehensive Save System

The most challenging and interesting task in the project was implementing a save system that doesn't just remember a checkpoint but "freezes" the entire game world at any given moment.

Note

Show the full system breakdown...

๐Ÿ“ Designing a "Save-Anywhere" System

1. ๐Ÿง Problem and Goals

In most games, saving occurs at strictly defined points. The goal was more ambitious: to give the player the ability to save in the middle of a battle, during a rocket's flight, or in a dialogue, and after loading, to return to an absolutely identical state of the world.

Key Requirements:

  • Save the state of all dynamic entities.
  • Work with non-serializable Unity types.
  • Correctly restore the scene, avoiding duplicates and lost objects.

2. ๐Ÿ—๏ธ Architecture and Implementation

The system consists of three key components:

  • LevelSaveData.cs: The data "container." This MonoBehaviour dynamically collects references to all objects that need to be saved: the player, enemies, projectiles, items, triggers. Before serialization, it "polls" each object and saves its state as a simple Serializable class.

  • FixedJsonUtilityFunc.cs: The "translator." The standard JsonUtility cannot handle Transform, Rigidbody, Dictionary, and other complex types. This static class contains methods that "disassemble" these objects into basic types (e.g., a Transform into a Vector3 for position, a Quaternion for rotation, and a Vector3 for scale) and "reassemble" them upon loading.

  • LevelSaveLoadSystem.cs: The "orchestrator." This class manages the entire process:

    1. On Save: Calls the SaveToJson() method on LevelSaveData, which gathers all data, converts it to JSON, and writes it to a file using BinaryFormatter (for simplicity).
    2. On Load:
      • Loads the scene by the ID saved in the file.
      • (Key Step) After the scene loads, it destroys all dynamic enemies, items, and projectiles that were in the scene by default.
      • Reads the JSON from the file.
      • Iterates through the saved data and recreates each object from a prefab, then applies its saved state (position, health, velocity, etc.).

3. ๐ŸŽ‰ Results and Conclusions

  • Result: A fully functional system was created that allows saving and loading the game at any moment.
  • Experience Gained: This process taught me in-depth work with serialization, reflection (for accessing object types), object lifecycle management, and the importance of a strict order of operations when restoring a complex scene. This experience became the foundation for my subsequent, more complex architectural decisions.

4. ๐Ÿค” Compromises and Growth Points

  • Performance: The current implementation uses JsonUtility, which is not the fastest serialization method. In a real AAA project, more performant binary serializers would be preferable.
  • "Fragility": The system heavily relies on the existence of prefabs with the necessary components. Changing a prefab can "break" old saves. In the future, a save versioning system could be implemented for backward compatibility.

๐Ÿ“ˆ What I Learned from This Project

This project was my "sandbox" for fundamental mechanics. The absence of a strict architecture and DI frameworks forced me to solve many problems "manually," which gave me an invaluable understanding of how Unity actually works. This experience directly influenced my subsequent projects, where I consciously applied SOLID, DI, and other patterns to solve the problems I encountered here.

Thank you for your attention!

About

An ambitious solo FPS project with two demo levels, featuring a deep implementation of core mechanics: Save/Load, 15+ AI types, and a data-driven weapon system.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published