ะัะธะฒะตั! ะญัะพ "Ancelight" โ ะผะพะน ััะฐััะน ะฟัะพะตะบั, ะฒ ะบะพัะพัะพะผ ั ั ะฝัะปั ัะตะฐะปะธะทะพะฒะฐะป ะฒัะต ะผะตั ะฐะฝะธะบะธ ะบะปะฐััะธัะตัะบะพะณะพ FPS-ัััะตัะฐ.
- ๐โโ๏ธ ะัะพะดะฒะธะฝััะฐั ัะธััะตะผะฐ ะฟะตัะตะดะฒะธะถะตะฝะธั: ะะณัะพะบ ะฝะต ะฟัะพััะพ ั
ะพะดะธั ะธ ะฟััะณะฐะตั. ะ ะตะฐะปะธะทะพะฒะฐะฝั ะบะปััะตะฒัะต "action-FPS" ะผะตั
ะฐะฝะธะบะธ: ะบััะบ-ะบะพัะบะฐ (
PlayerHookService
) ั ัะพะฑััะฒะตะฝะฝะพะน ัะธะทะธะบะพะน ะฝะฐSpringJoint
ะธ ัะฐัั ะพะดะพะผ ัะตััััะฐ, ะฐ ัะฐะบะถะต ัะธััะตะผะฐ ััะฒะบะพะฒ (dashes) (PlayerDashsService
), ะพะณัะฐะฝะธัะตะฝะฝะฐั ะบะพะปะธัะตััะฒะพะผ ะทะฐััะดะพะฒ ะธ ะฒัะตะผะตะฝะตะผ ะฒะพัััะฐะฝะพะฒะปะตะฝะธั. - ๐พ ะะพะปะฝะฐั ัะธััะตะผะฐ ัะพั ัะฐะฝะตะฝะธะน: ะ ะตะฐะปะธะทะพะฒะฐะฝะฐ ะฒะพะทะผะพะถะฝะพััั ัะพั ัะฐะฝะธัั ะธ ะทะฐะณััะทะธัั ะธะณัั ะฒ ะปัะฑะพะน ะผะพะผะตะฝั. ะกะธััะตะผะฐ ะพะฑัะฐะฑะฐััะฒะฐะตั ะธ ะฒะพัััะฐะฝะฐะฒะปะธะฒะฐะตั ัะพััะพัะฝะธะต ะฒัะตั ะดะธะฝะฐะผะธัะตัะบะธั ะพะฑัะตะบัะพะฒ: ะพั ะปะตัััะธั ะฟัะปั ะธ ะฒัะฐะณะพะฒ (ะฒะบะปััะฐั ะธั ัะตะบัััั ัะฐะทั ะฐัะฐะบะธ) ะดะพ ะฟะพะปะพะถะตะฝะธั ะดะฒะตัะตะน ะธ ัะพััะพัะฝะธั ััะธะณะณะตัะพะฒ.
- ๐ ะกะธััะตะผะฐ ะฟัะพะบะฐัะบะธ ะธ ะบะฐััะพะผะธะทะฐัะธะธ ะบะพัััะผะฐ: ะ ะธะณัั ะฒัััะพะตะฝะฐ ะฟะพะปะฝะพัะตะฝะฝะฐั ัะธััะตะผะฐ ะฟะตัะผะฐะฝะตะฝัะฝัั
ัะปัััะตะฝะธะน. ะะณัะพะบ ัะพะฑะธัะฐะตั ัะฟะตัะธะฐะปัะฝัะต ะฟัะตะดะผะตัั (
EnchancedSuitPointItem
) ะดะปั ะฟะพะปััะตะฝะธั ะพัะบะพะฒ ะฟัะพะบะฐัะบะธ, ะบะพัะพััะต ะทะฐัะตะผ ะฒะบะปะฐะดัะฒะฐะตั ะฒ ัะปัััะตะฝะธะต ัะฒะพะธั ัะฟะพัะพะฑะฝะพััะตะน (ัะฒะตะปะธัะตะฝะธะต ัะธัะปะฐ ััะฒะบะพะฒ, ััะธะปะตะฝะธะต ะทะฐัะธัะฝะพะณะพ ะฒะทััะฒะฐ, ัะปัััะตะฝะธะต ะบััะบะฐ-ะบะพัะบะธ). - ๐ค ะขะฐะบัะธัะตัะบะธะน ะะ ั ะบะพะผะฐะฝะดะฝัะผ ะฒะทะฐะธะผะพะดะตะนััะฒะธะตะผ: ะกะพะทะดะฐะฝะพ ะฑะพะปะตะต 15 ัะฝะธะบะฐะปัะฝัั
ัะธะฟะพะฒ ะฒัะฐะณะพะฒ. ะะปะฐะณะพะดะฐัั ัะธััะตะผะต "ััะตะฒะพะณะธ" (
EnemysAiManager
), ะทะฐะผะตัะธะฒัะธะน ะธะณัะพะบะฐ ะฟัะพัะธะฒะฝะธะบ ะผะพะถะตั ะฟัะตะดัะฟัะตะดะธัั ัะพัะทะฝะธะบะพะฒ ะฒ ัะฐะดะธััะต, ะทะฐััะฐะฒะปัั ะฒัั ะณััะฟะฟั ะฐัะฐะบะพะฒะฐัั ัะบะพะพัะดะธะฝะธัะพะฒะฐะฝะฝะพ. ะะตะบะพัะพััะต ะฒัะฐะณะธ ัะผะตัั ัััะตะปััั ะฝะฐ ัะฟัะตะถะดะตะฝะธะต. - ๐ซ Data-driven ัะธััะตะผะฐ ะพััะถะธั: ะััะตะฝะฐะป ะธะท 10+ ะฒะธะดะพะฒ ะพััะถะธั ะฟะพะปะฝะพัััั ะฝะฐัััะฐะธะฒะฐะตััั ัะตัะตะท
ScriptableObject
. ะ ะตะฐะปะธะทะพะฒะฐะฝั ัะฐะทะปะธัะฝัะต ัะตะถะธะผั ัััะตะปัะฑั (ะฐะฒัะพะผะฐัะธัะตัะบะธะน, ะทะฐััะดะบะฐ, ะดัะพะฑะพะฒะธะบ, ะปะฐะทะตั), ัะธััะตะผะฐ ะฑะพะตะฟัะธะฟะฐัะพะฒ ะธ ะบะฐััะพะผะฝะฐั ะฟัะพัะตะดััะฝะฐั ะพัะดะฐัะฐ (PlayerWeaponRecoil
). - ๐จ ะัะพะดะฒะธะฝััะฐั ัะฐะฑะพัะฐ ั ัะตะนะดะตัะฐะผะธ: ะะฐะฟะธัะฐะฝั ั ะฝัะปั ะบะพะผะฟะปะตะบัะฝัะต ัะตะนะดะตัั ะดะปั ะฒะธะทัะฐะปัะฝัั ัััะตะบัะพะฒ, ะฒะบะปััะฐั ัะฝะตัะณะตัะธัะตัะบะธะน ัะธั ั ัััะตะบัะพะผ ะธัะบะฐะถะตะฝะธั, ะดะธะฝะฐะผะธัะตัะบัั ะฒะพะดั, ะฐ ัะฐะบะถะต ะฐะฝะธะผะธัะพะฒะฐะฝะฝัะต UI-ัะตะนะดะตัั ั ะฟะตัะตะปะธะฒะฐััะธะผะธัั ะปะธะฝะธัะผะธ.
- ๐๏ธ ะกะพะทะดะฐะฝะธะต ะฐััะตัะพะฒ ั ะฝัะปั: ะะฝะฐัะธัะตะปัะฝะฐั ัะฐััั ะธะณัะพะฒัั ะฐััะตัะพะฒ, ะฒะบะปััะฐั 3D-ะผะพะดะตะปะธ, ัะตะบััััั, ะธะบะพะฝะบะธ ะธ ัะปะตะผะตะฝัั UI, ะฑัะปะฐ ัะพะทะดะฐะฝะฐ ัะฐะผะพััะพััะตะปัะฝะพ, ััะพ ะดะตะผะพะฝัััะธััะตั ะบะพะผะฟะปะตะบัะฝัะน ะฟะพะดั ะพะด ะบ ัะฐะทัะฐะฑะพัะบะต ะธ ะฟะพะฝะธะผะฐะฝะธะต ะฒัะตะณะพ ะฟะฐะนะฟะปะฐะนะฝะฐ ัะพะทะดะฐะฝะธั ะบะพะฝัะตะฝัะฐ.
- ๐ฏ ะะธะฝะฐะผะธัะตัะบะฐั ัะธััะตะผะฐ ะทะฐะดะฐะฝะธะน: ะะฐ ััะพะฒะฝัั
ัะฐะฑะพัะฐะตั ัะธััะตะผะฐ ะทะฐะดะฐั (
LevelTaskService
), ะบะพัะพัะฐั ััะฐะฒะธั ะฟะตัะตะด ะธะณัะพะบะพะผ ัะตะปะธ (ะฝะฐะฟัะธะผะตั, "ัะฝะธััะพะถะธัั ะฒัะตั ะฒัะฐะณะพะฒ ะฒ ะทะพะฝะต") ะธ ะพััะปะตะถะธะฒะฐะตั ะธั ะฒัะฟะพะปะฝะตะฝะธะต, ะฝะฐะฟัะฐะฒะปัั ะณะตะนะผะฟะปะตะน.
Ancelight โ ััะพ ะดะธะฝะฐะผะธัะฝัะน FPS-ัััะตั, ัะพะทะดะฐะฝะฝัะน ะบะฐะบ ะฟะพะปะธะณะพะฝ ะดะปั ะพััะฐะฑะพัะบะธ ะธ ัะตะฐะปะธะทะฐัะธะธ ัะปะพะถะฝัั ะธะณัะพะฒัั ัะธััะตะผ ั ะฝัะปั. ะัะฝะพะฒะฝะพะน ัะพะบัั ะฑัะป ัะดะตะปะฐะฝ ะฝะต ะฝะฐ ะฒะธะทัะฐะปัะฝะพะน ัะพััะฐะฒะปัััะตะน, ะฐ ะฝะฐ ะณะปัะฑะพะบะพะน ะฟัะพัะฐะฑะพัะบะต "ะฟะพะดะบะฐะฟะพัะฝัั " ะผะตั ะฐะฝะธะบ: AI, ัะธััะตะผะฐ ัะพั ัะฐะฝะตะฝะธะน, ัะธะทะธะบะฐ ะธ ัะฟัะฐะฒะปะตะฝะธะต ัะตััััะฐะผะธ.
Note
ะะพะดัะพะฑะฝะตะต ะพ ะฟัะพะตะบัะต...
-
๐ฎ ะะณัะพะฒะพะน ะฟัะพัะตัั: ะะปะฐััะธัะตัะบะธะน ัััะตั ั ัะฐะทะฝะพะพะฑัะฐะทะฝัะผะธ ะฒัะฐะณะฐะผะธ, ะบะฐะถะดัะน ะธะท ะบะพัะพััั ะพะฑะปะฐะดะฐะตั ัะฝะธะบะฐะปัะฝัะผ ะฟะพะฒะตะดะตะฝะธะตะผ. ะะณัะพะบ ะผะพะถะตั ะธัะฟะพะปัะทะพะฒะฐัั ัะฐะทะปะธัะฝะพะต ะพััะถะธะต, ะฟะตัะบะธ ะธ ัะฟะตัะธะฐะปัะฝัะต ัะฟะพัะพะฑะฝะพััะธ ะดะปั ะฟัะพั ะพะถะดะตะฝะธั ััะพะฒะฝะตะน.
-
๐ฏ ะฆะตะปั ะฟัะพะตะบัะฐ: ะ ะฐะทัะฐะฑะพัะฐัั ะธ ะพัะณะฐะฝะธะทะพะฒะฐัั ะฒ ะตะดะธะฝัะน, ัะฐะฑะพัะพัะฟะพัะพะฑะฝัะน ะผะตั ะฐะฝะธะทะผ ะผะฝะพะถะตััะฒะพ ัะปะพะถะฝัั ะธ ะฒะทะฐะธะผะพัะฒัะทะฐะฝะฝัั ะธะณัะพะฒัั ัะธััะตะผ: ะพั ะฟัะพะดะฒะธะฝััะพะณะพ AI ะฟัะพัะธะฒะฝะธะบะพะฒ ะธ ะพะฑัะธัะฝะพะณะพ ะฐััะตะฝะฐะปะฐ ะพััะถะธั ะดะพ ะฟะพะปะฝะพะน ัะธััะตะผั ัะพั ัะฐะฝะตะฝะธะน ะธ ะบะฐััะพะผะฝะพะน ัะธะทะธะบะธ. ะัะฝะพะฒะฝะพะน ะทะฐะดะฐัะตะน ะฑัะปะพ ัะพะทะดะฐะฝะธะต ััะฐะฑะธะปัะฝะพะน ะธ ััะฝะบัะธะพะฝะฐะปัะฝะพะน ะพัะฝะพะฒั, ัะฟะพัะพะฑะฝะพะน ะฟะพะดะดะตัะถะธะฒะฐัั ะฒะตัั ััะพั ะบะพะผะฟะปะตะบั ะผะตั ะฐะฝะธะบ.
ะัะพะตะบั ะฟะพัััะพะตะฝ ะฝะฐ ะฝะตัะบะพะปัะบะธั ััะฝะดะฐะผะตะฝัะฐะปัะฝัั ัะธััะตะผะฐั , ะฝะฐะฟะธัะฐะฝะฝัั ั ะฝัะปั ะดะปั ะพะฑะตัะฟะตัะตะฝะธั ะฟะพะปะฝะพะณะพ ะบะพะฝััะพะปั ะฝะฐะด ะฟะพะฒะตะดะตะฝะธะตะผ ะธะณัั. ะะฐะถะดะฐั ัะธััะตะผะฐ ะฟัะพะตะบัะธัะพะฒะฐะปะฐัั ั ัะฟะพัะพะผ ะฝะฐ ััะฝะบัะธะพะฝะฐะปัะฝะพััั ะธ ัะตัะตะฝะธะต ะบะพะฝะบัะตัะฝัั ะณะตะนะผะฟะปะตะนะฝัั ะทะฐะดะฐั.
Note
ะะพะบะฐะทะฐัั ะฟะพะปะฝัะน ัะฟะธัะพะบ ัะธััะตะผ...
-
๐โโ๏ธ ะัะพะดะฒะธะฝััะฐั ัะธััะตะผะฐ ะฟะตัะตะดะฒะธะถะตะฝะธั (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
(ะฟัะธะผะตัั). - ะกััั: ะะพะผะฟะปะตะบัะฝะฐั ัะธััะตะผะฐ, ัะฟัะฐะฒะปัััะฐั ะทะดะพัะพะฒัะตะผ, ะฑัะพะฝะตะน ะธ ัะพะฟัะพัะธะฒะปะตะฝะธะตะผ ััะพะฝั. ะะบะปััะฐะตั ะฒ ัะตะฑั ะผะตั ะฐะฝะธะบั ะฟะตัะผะฐะฝะตะฝัะฝัั ัะปัััะตะฝะธะน: ะธะณัะพะบ ะฝะฐั ะพะดะธั ะฝะฐ ััะพะฒะฝัั ัะฟะตัะธะฐะปัะฝัะต ะฟัะตะดะผะตัั, ะดะฐััะธะต "ะพัะบะธ ะฟัะพะบะฐัะบะธ", ะบะพัะพััะต ะผะพะถะฝะพ ะฟะพััะฐัะธัั ะฒ ัะฟะตัะธะฐะปัะฝะพะผ ะผะตะฝั ะฝะฐ ะฐะฟะณัะตะนะด ัะฟะพัะพะฑะฝะพััะตะน (ัะฒะตะปะธัะตะฝะธะต ัะธัะปะฐ ััะฒะบะพะฒ, ััะธะปะตะฝะธะต ะทะฐัะธัะฝะพะณะพ ะฒะทััะฒะฐ ะธ ั.ะด.).
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
-
๐ค ะขะฐะบัะธัะตัะบะธะน ะะ ั ะบะพะผะฐะฝะดะฝัะผ ะฒะทะฐะธะผะพะดะตะนััะฒะธะตะผ
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
DefaultBot.cs
(ะฑะฐะทะพะฒัะน ะบะปะฐัั),EnemysAiManager.cs
,FlyingDroneBot.cs
,TeleporterBot.cs
ะธ ะดั. - ะกััั: ะัะฝะพะฒะฐ ะฟะพะฒะตะดะตะฝะธั ะฒัะฐะณะพะฒ (ะฑะพะปะตะต 15 ัะธะฟะพะฒ). AI ะฟะพัััะพะตะฝ ะฝะฐ ะฑะฐะทะต ะบะพะฝะตัะฝะพะณะพ ะฐะฒัะพะผะฐัะฐ (FSM), ัะตะฐะปะธะทะพะฒะฐะฝะฝะพะณะพ ะฝะฐ ะบะพัััะธะฝะฐั
. ะะฐะถะดัะน ัะธะฟ ะฒัะฐะณะฐ ะฝะฐัะปะตะดัะตััั ะพั
DefaultBot
ะธ ะธะผะตะตั ัะฝะธะบะฐะปัะฝัั ะปะพะณะธะบั ะฐัะฐะบะธ ะธ ะฟะตัะตะดะฒะธะถะตะฝะธั. - ะะพะผะฐะฝะดะฝะฐั ัะฐะฑะพัะฐ:
EnemysAiManager
ะพััะปะตะถะธะฒะฐะตั ะฒัะตั "ัะผะฝัั " ะฑะพัะพะฒ ะฝะฐ ััะตะฝะต. ะัะปะธ ะพะดะธะฝ ะธะท ะฝะธั ะทะฐะผะตัะฐะตั ะธะณัะพะบะฐ, ะพะฝ ะผะพะถะตั "ะฟะพะดะฝััั ััะตะฒะพะณั", ะธ ะฒัะต ะฑะพัั ะฒ ัะฐะดะธััะต ัะฐะบะถะต ััะฐะฝัั ะฐะณัะตััะธะฒะฝัะผะธ ะธ ะฟะพะปััะฐั ะฟะพัะปะตะดะฝะตะต ะธะทะฒะตััะฝะพะต ะผะตััะพะฟะพะปะพะถะตะฝะธะต ะธะณัะพะบะฐ. - ะกััะตะปัะฑะฐ ะฝะฐ ัะฟัะตะถะดะตะฝะธะต: ะะตะบะพัะพััะต ะฒัะฐะณะธ ะธัะฟะพะปัะทััั ะผะตัะพะด
CalculateSmartTargetPos
, ะบะพัะพััะน ัะฐัััะธััะฒะฐะตั ะฑัะดัััั ะฟะพะทะธัะธั ะธะณัะพะบะฐ ะฝะฐ ะพัะฝะพะฒะต ะตะณะพ ัะตะบััะตะน ัะบะพัะพััะธ ะธ ัะบะพัะพััะธ ะฟะพะปะตัะฐ ัะฝะฐััะดะฐ.
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
-
๐ฌ ะกะธััะตะผะฐ ัะฟะฐะฒะฝะฐ ะฒัะฐะณะพะฒ ะฟะพ ััะตะฝะฐัะธัะผ
- ะัะฒะตัััะฒะตะฝะฝัะน ะบะปะฐัั:
LevelSpawnScenario.cs
. - ะกััั: ะะพัะฝัะน ะธะฝััััะผะตะฝั ะดะปั ะปะตะฒะตะป-ะดะธะทะฐะนะฝะฐ, ะฟะพะทะฒะพะปัััะธะน ัะพะทะดะฐะฒะฐัั ัะปะพะถะฝัะต ััะตะฝะฐัะธะธ ะฟะพัะฒะปะตะฝะธั ะฒัะฐะณะพะฒ. ะะพะดะดะตัะถะธะฒะฐะตั ะฒะพะปะฝั, ะทะฐะดะตัะถะบะธ ะผะตะถะดั ะฝะธะผะธ, ะฟะพะฒัะพัะตะฝะธั, ะดะฒะธะถะตะฝะธะต ะฒัะฐะณะพะฒ ะบ ัะบะฐะทะฐะฝะฝัะผ ัะพัะบะฐะผ (
WayPoint
) ะธ ะฐะบัะธะฒะฐัะธัUnityEvent
'ะพะฒ ะฟะพัะปะต ะทะฐัะธััะบะธ ะฒัะตั ะฒัะฐะณะพะฒ ะฒ ััะตะฝะฐัะธะธ.
- ะัะฒะตัััะฒะตะฝะฝัะน ะบะปะฐัั:
-
๐พ ะะพะปะฝะฐั ัะธััะตะผะฐ ัะพั ัะฐะฝะตะฝะธะน
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
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
ะพะฟัะตะดะตะปัะตั ะพะฑััั ะปะพะณะธะบั ะฟะพะดะฑะพัะฐ, ะฐ ะดะพัะตัะฝะธะต ะบะปะฐััั ัะตะฐะปะธะทััั ะบะพะฝะบัะตัะฝะพะต ะฟะพะฒะตะดะตะฝะธะต: ะฒัะดะฐัั ะพััะถะธะต, ะฟะพะฟะพะปะฝะธัั ะฑะพะตะทะฐะฟะฐั, ะฒะพัะฟะพะปะฝะธัั ะทะดะพัะพะฒัะต/ะฑัะพะฝั ะธะปะธ ะดะพะฑะฐะฒะธัั ะฟะปะฐะทะผั ะดะปั ะบัะฐััะฐ ะฟะฐััะพะฝะพะฒ.
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
-
๐ป HUD ะธ ะะฝะดะธะบะฐัะพัั
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
MainCircleUI.cs
,DashsIndicatorService.cs
,HookCircle.cs
,BulletsIndicators.cs
. - ะกััั: ะะพะผะฟะปะตะบัะฝัะน ะธะณัะพะฒะพะน ะธะฝัะตััะตะนั, ะบะพัะพััะน ะฒ ัะตะฐะปัะฝะพะผ ะฒัะตะผะตะฝะธ ะพัะพะฑัะฐะถะฐะตั ะฒัั ะฒะฐะถะฝัั ะธะฝัะพัะผะฐัะธั: ะทะดะพัะพะฒัะต, ะฑัะพะฝั, ะฒัะฑัะฐะฝะฝะพะต ะพััะถะธะต (ะฒ ะฒะธะดะต ะฐะฝะธะผะธัะพะฒะฐะฝะฝะพะณะพ "ะบะพะปะตัะฐ"), ะบะพะปะธัะตััะฒะพ ะฟะฐััะพะฝะพะฒ, ะดะพัััะฟะฝัะต ััะฒะบะธ ะธ ัะฝะตัะณะธั ะบััะบะฐ-ะบะพัะบะธ.
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
-
๐ฏ ะะพะฝัะตะบััะฝัะต ะฟะพะดัะบะฐะทะบะธ ะธ ะธะฝัะพัะผะฐัะธั
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
AdditionalInformationPanel.cs
,KeyboardKeyTip.cs
,LevelTaskService.cs
. - ะกััั: ะกะธััะตะผะฐ ะฟัะตะดะพััะฐะฒะปัะตั ะธะณัะพะบั ะพะฑัะฐัะฝัั ัะฒัะทั:
- ะัะธ ะฝะฐะฒะตะดะตะฝะธะธ ะฝะฐ ะธะฝัะตัะฐะบัะธะฒะฝัะน ะพะฑัะตะบั ะธะปะธ ะฒัะฐะณะฐ ะฟะพัะฒะปัะตััั ะฟะฐะฝะตะปั ั ะธะฝัะพัะผะฐัะธะตะน ะพ ะฝัะผ (
AdditionalInformationPanel
). - ะะฐัะบัะฐะฝะฝัะต ะฟะพะดัะบะฐะทะบะธ ะฟะพ ัะฟัะฐะฒะปะตะฝะธั (
KeyboardKeyTip
) ะฐะฒัะพะผะฐัะธัะตัะบะธ ะพะฑะฝะพะฒะปััััั ะฟัะธ ะธะทะผะตะฝะตะฝะธะธ ัะฐัะบะปะฐะดะบะธ ะฒ ะฝะฐัััะพะนะบะฐั . - ะกะธััะตะผะฐ ะทะฐะดะฐั (
LevelTaskService
) ะฒัะฒะพะดะธั ะฝะฐ ัะบัะฐะฝ ัะตะบัััั ัะตะปั ะผะธััะธะธ.
- ะัะธ ะฝะฐะฒะตะดะตะฝะธะธ ะฝะฐ ะธะฝัะตัะฐะบัะธะฒะฝัะน ะพะฑัะตะบั ะธะปะธ ะฒัะฐะณะฐ ะฟะพัะฒะปัะตััั ะฟะฐะฝะตะปั ั ะธะฝัะพัะผะฐัะธะตะน ะพ ะฝัะผ (
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
-
โ๏ธ ะะพะผะฟะปะตะบัะฝะพะต ะผะตะฝั ะฝะฐัััะพะตะบ
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
SettingsSaveLoadSystem.cs
,SettingsSetSystem.cs
. - ะกััั: ะะพะปะฝะพััะฝะบัะธะพะฝะฐะปัะฝะพะต ะผะตะฝั ะฝะฐัััะพะตะบ, ะฟะพะทะฒะพะปัััะตะต ะธะณัะพะบั ะบะฐััะพะผะธะทะธัะพะฒะฐัั ะฟัะฐะบัะธัะตัะบะธ ะฒัะต ะฐัะฟะตะบัั ะธะณัั. ะัะต ะฝะฐัััะพะนะบะธ ัะพั ัะฐะฝััััั ะธ ะทะฐะณััะถะฐัััั ะธะท ัะฐะนะปะฐ.
- ะัะฐัะธะบะฐ: ะะฐัะตััะฒะพ ัะตะบัััั, ะฐะฝะธะทะพััะพะฟะฝะฐั ัะธะปัััะฐัะธั, ัะฐะทัะตัะตะฝะธะต ะธ ะดะธััะฐะฝัะธั ัะตะฝะตะน, SSAO, MSAA, ะบะฐัะตััะฒะพ ัะฐััะธัะตะปัะฝะพััะธ, ะดะธััะฐะฝัะธั ะฟัะพัะธัะพะฒะบะธ, VSync, FOV, ัะฐะทัะตัะตะฝะธะต ะธ ัะพัะผะฐั ัะบัะฐะฝะฐ.
- ะฃะฟัะฐะฒะปะตะฝะธะต: ะะพะปะฝะฐั ะฟะตัะตะฝะฐัััะพะนะบะฐ ะฒัะตั
ะบะปะฐะฒะธั (
InputButtonField.cs
), ะฒะบะปััะฐั ะดะตะนััะฒะธั ะผััะธ ะธ ะบะพะปะตัะฐ ะฟัะพะบัััะบะธ, ะฐ ัะฐะบะถะต ะฝะฐัััะพะนะบะฐ ััะฒััะฒะธัะตะปัะฝะพััะธ. - ะะฒัะบ: ะ ะฐะทะดะตะปัะฝะฐั ัะตะณัะปะธัะพะฒะบะฐ ะณัะพะผะบะพััะธ (ะผะฐััะตั, ะผัะทัะบะฐ, ัััะตะบัั, ะพะบััะถะตะฝะธะต, UI), ะฝะฐัััะพะนะบะฐ ะผะฐะบัะธะผะฐะปัะฝะพะณะพ ะบะพะปะธัะตััะฒะฐ ะทะฒัะบะพะฒัั ะธััะพัะฝะธะบะพะฒ.
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
-
๐ ะกะธััะตะผะฐ ะปะพะบะฐะปะธะทะฐัะธะธ
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
CurrentLanguageData.cs
,StaticTextLanguageAdaptable.cs
. - ะกััั: ะ ะตะฐะปะธะทะพะฒะฐะฝะฐ ัะธััะตะผะฐ, ะฟะพะทะฒะพะปัััะฐั ะฟะตัะตะฒะพะดะธัั ะฒะตัั ะธะณัะพะฒะพะน ัะตะบัั. ะขะตะบััะพะฒัะต ะดะฐะฝะฝัะต ั
ัะฐะฝัััั ะฒ
ScriptableObject
(LanguageData
), ะฐ ัะฟะตัะธะฐะปัะฝัะต ะบะพะผะฟะพะฝะตะฝัั ะฝะฐ UI-ัะปะตะผะตะฝัะฐั (StaticTextLanguageAdaptable
) ะฐะฒัะพะผะฐัะธัะตัะบะธ ะฟะพะดะณััะถะฐัั ะฝัะถะฝัะน ะฟะตัะตะฒะพะด ะฟัะธ ัะผะตะฝะต ัะทัะบะฐ ะฒ ะฝะฐัััะพะนะบะฐั .
- ะัะฒะตัััะฒะตะฝะฝัะต ะบะปะฐััั:
๐ ะะตะนั-ััะฐะดะธ: ะัะพะตะบัะธัะพะฒะฐะฝะธะต ะะพะปะฝะพะน ะกะธััะตะผั ะกะพั ัะฐะฝะตะฝะธะน
ะกะฐะผะพะน ัะปะพะถะฝะพะน ะธ ะธะฝัะตัะตัะฝะพะน ะทะฐะดะฐัะตะน ะฒ ะฟัะพะตะบัะต ะฑัะปะฐ ัะตะฐะปะธะทะฐัะธั ัะธััะตะผั ัะพั ัะฐะฝะตะฝะธะน, ะบะพัะพัะฐั ะฝะต ะฟัะพััะพ ะทะฐะฟะพะผะธะฝะฐะตั ัะตะบะฟะพะธะฝั, ะฐ "ะทะฐะผะพัะฐะถะธะฒะฐะตั" ะฒะตัั ะธะณัะพะฒะพะน ะผะธั ะฒ ะปัะฑะพะน ะผะพะผะตะฝั ะฒัะตะผะตะฝะธ.
Note
ะะพะบะฐะทะฐัั ะฟะพะปะฝัะน ัะฐะทะฑะพั ัะธััะตะผั...
ะ ะฑะพะปััะธะฝััะฒะต ะธะณั ัะพั ัะฐะฝะตะฝะธะต ะฟัะพะธัั ะพะดะธั ะฒ ัััะพะณะพ ะพะฟัะตะดะตะปะตะฝะฝัั ัะพัะบะฐั . ะฆะตะปั ะฑัะปะฐ ะฐะผะฑะธัะธะพะทะฝะตะต: ะดะฐัั ะธะณัะพะบั ะฒะพะทะผะพะถะฝะพััั ัะพั ัะฐะฝะธัััั ะฒ ัะฐะทะณะฐัะต ะฑะพั, ะฒะพ ะฒัะตะผั ะฟะพะปะตัะฐ ัะฐะบะตัั ะธะปะธ ะดะธะฐะปะพะณะฐ, ะฐ ะฟะพัะปะต ะทะฐะณััะทะบะธ โ ะฒะตัะฝััััั ะฒ ะฐะฑัะพะปััะฝะพ ะธะดะตะฝัะธัะฝะพะต ัะพััะพัะฝะธะต ะผะธัะฐ.
ะะปััะตะฒัะต ััะตะฑะพะฒะฐะฝะธั:
- ะกะพั ัะฐะฝััั ัะพััะพัะฝะธะต ะฒัะตั ะดะธะฝะฐะผะธัะตัะบะธั ัััะฝะพััะตะน.
- ะ ะฐะฑะพัะฐัั ั ะฝะตัะตัะธะฐะปะธะทัะตะผัะผะธ ัะธะฟะฐะผะธ Unity.
- ะะพััะตะบัะฝะพ ะฒะพัััะฐะฝะฐะฒะปะธะฒะฐัั ััะตะฝั, ะธะทะฑะตะณะฐั ะดัะฑะปะธะบะฐัะพะฒ ะธ ะฟะพัะตััะฝะฝัั ะพะฑัะตะบัะพะฒ.
ะกะธััะตะผะฐ ัะพััะพะธั ะธะท ััะตั ะบะปััะตะฒัั ะบะพะผะฟะพะฝะตะฝัะพะฒ:
-
LevelSaveData.cs
: "ะะพะฝัะตะนะฝะตั" ะดะปั ะดะฐะฝะฝัั . ะญัะพัMonoBehaviour
ะดะธะฝะฐะผะธัะตัะบะธ ัะพะฑะธัะฐะตั ัััะปะบะธ ะฝะฐ ะฒัะต ะพะฑัะตะบัั, ะบะพัะพััะต ะฝัะถะฝะพ ัะพั ัะฐะฝะธัั: ะธะณัะพะบะฐ, ะฒัะฐะณะพะฒ, ะฟัะปะธ, ะฟัะตะดะผะตัั, ััะธะณะณะตัั. ะะตัะตะด ัะตัะธะฐะปะธะทะฐัะธะตะน ะพะฝ "ะพะฟัะฐัะธะฒะฐะตั" ะบะฐะถะดัะน ะพะฑัะตะบั ะธ ัะพั ัะฐะฝัะตั ะตะณะพ ัะพััะพัะฝะธะต ะฒ ะฒะธะดะต ะฟัะพััะพะณะพSerializable
ะบะปะฐััะฐ. -
FixedJsonUtilityFunc.cs
: "ะะตัะตะฒะพะดัะธะบ". ะกัะฐะฝะดะฐััะฝัะนJsonUtility
ะฝะต ัะผะตะตั ัะฐะฑะพัะฐัั ัTransform
,Rigidbody
,Dictionary
ะธ ะดััะณะธะผะธ ัะปะพะถะฝัะผะธ ัะธะฟะฐะผะธ. ะญัะพั ััะฐัะธัะตัะบะธะน ะบะปะฐัั ัะพะดะตัะถะธั ะผะตัะพะดั, ะบะพัะพััะต "ัะฐะทะฑะธัะฐัั" ััะธ ะพะฑัะตะบัั ะฝะฐ ะฑะฐะทะพะฒัะต ัะธะฟั (ะฝะฐะฟัะธะผะตั,Transform
ะฝะฐVector3
ะฟะพะทะธัะธะธ,Quaternion
ะฒัะฐัะตะฝะธั ะธVector3
ัะบะตะนะปะฐ) ะธ "ัะพะฑะธัะฐัั" ะธั ะพะฑัะฐัะฝะพ ะฟัะธ ะทะฐะณััะทะบะต. -
LevelSaveLoadSystem.cs
: "ะัะบะตัััะฐัะพั". ะญัะพั ะบะปะฐัั ัะฟัะฐะฒะปัะตั ะฒัะตะผ ะฟัะพัะตััะพะผ:- ะัะธ ัะพั
ัะฐะฝะตะฝะธะธ: ะัะทัะฒะฐะตั ะผะตัะพะด
SaveToJson()
ัLevelSaveData
, ะบะพัะพััะน ัะพะฑะธัะฐะตั ะฒัะต ะดะฐะฝะฝัะต, ะบะพะฝะฒะตััะธััะตั ะธั ะฒ JSON ะธ ะทะฐะฟะธััะฒะฐะตั ะฒ ัะฐะนะป ั ะฟะพะผะพัััBinaryFormatter
(ะดะปั ะฟัะพััะพัั). - ะัะธ ะทะฐะณััะทะบะต:
- ะะฐะณััะถะฐะตั ััะตะฝั ะฟะพ ID, ัะพั ัะฐะฝะตะฝะฝะพะผั ะฒ ัะฐะนะปะต.
- (ะะปััะตะฒะพะน ัะฐะณ) ะะพัะปะต ะทะฐะณััะทะบะธ ััะตะฝั ัะฝะธััะพะถะฐะตั ะฒัะตั ะดะธะฝะฐะผะธัะตัะบะธั ะฒัะฐะณะพะฒ, ะฟัะตะดะผะตัั ะธ ะฟัะปะธ, ะบะพัะพััะต ะฑัะปะธ ะฝะฐ ััะตะฝะต ะฟะพ ัะผะพะปัะฐะฝะธั.
- ะงะธัะฐะตั JSON ะธะท ัะฐะนะปะฐ.
- ะัะพั ะพะดะธั ะฟะพ ัะพั ัะฐะฝะตะฝะฝัะผ ะดะฐะฝะฝัะผ ะธ ะฒะพััะพะทะดะฐะตั ะบะฐะถะดัะน ะพะฑัะตะบั ะธะท ะฟัะตัะฐะฑะฐ, ะฐ ะทะฐัะตะผ ะฟัะธะผะตะฝัะตั ะบ ะฝะตะผั ัะพั ัะฐะฝะตะฝะฝะพะต ัะพััะพัะฝะธะต (ะฟะพะทะธัะธั, ะทะดะพัะพะฒัะต, ัะบะพัะพััั ะธ ั.ะด.).
- ะัะธ ัะพั
ัะฐะฝะตะฝะธะธ: ะัะทัะฒะฐะตั ะผะตัะพะด
- ะ ะตะทัะปััะฐั: ะัะปะฐ ัะพะทะดะฐะฝะฐ ะฟะพะปะฝะพัััั ัะฐะฑะพัะฐั ัะธััะตะผะฐ, ะฟะพะทะฒะพะปัััะฐั ัะพั ัะฐะฝััั ะธ ะทะฐะณััะถะฐัั ะธะณัั ะฒ ะปัะฑะพะน ะผะพะผะตะฝั.
- ะะพะปััะตะฝะฝัะน ะพะฟัั: ะญัะพั ะฟัะพัะตัั ะฝะฐััะธะป ะผะตะฝั ะณะปัะฑะพะบะพะน ัะฐะฑะพัะต ั ัะตัะธะฐะปะธะทะฐัะธะตะน, ัะตัะปะตะบัะธะตะน (ะดะปั ะดะพัััะฟะฐ ะบ ัะธะฟะฐะผ ะพะฑัะตะบัะพะฒ), ัะฟัะฐะฒะปะตะฝะธั ะถะธะทะฝะตะฝะฝัะผ ัะธะบะปะพะผ ะพะฑัะตะบัะพะฒ ะธ ะฒะฐะถะฝะพััะธ ัััะพะณะพะณะพ ะฟะพััะดะบะฐ ะพะฟะตัะฐัะธะน ะฟัะธ ะฒะพัััะฐะฝะพะฒะปะตะฝะธะธ ัะปะพะถะฝะพะน ััะตะฝั. ะญัะพั ะพะฟัั ััะฐะป ััะฝะดะฐะผะตะฝัะพะผ ะดะปั ะผะพะธั ะดะฐะปัะฝะตะนัะธั , ะฑะพะปะตะต ัะปะพะถะฝัั ะฐัั ะธัะตะบัััะฝัั ัะตัะตะฝะธะน.
- ะัะพะธะทะฒะพะดะธัะตะปัะฝะพััั: ะขะตะบััะฐั ัะตะฐะปะธะทะฐัะธั ะธัะฟะพะปัะทัะตั
JsonUtility
, ะบะพัะพััะน ะฝะต ัะฒะปัะตััั ัะฐะผัะผ ะฑัััััะผ ะผะตัะพะดะพะผ ัะตัะธะฐะปะธะทะฐัะธะธ. ะ ัะตะฐะปัะฝะพะผ ะะะ-ะฟัะพะตะบัะต ััะพะธะปะพ ะฑั ะธัะฟะพะปัะทะพะฒะฐัั ะฑะพะปะตะต ะฟัะพะธะทะฒะพะดะธัะตะปัะฝัะต ะฑะธะฝะฐัะฝัะต ัะตัะธะฐะปะธะทะฐัะพัั. - "ะฅััะฟะบะพััั": ะกะธััะตะผะฐ ัะธะปัะฝะพ ะทะฐะฒะธัะธั ะพั ะฝะฐะปะธัะธั ะฟัะตัะฐะฑะพะฒ ั ะฝัะถะฝัะผะธ ะบะพะผะฟะพะฝะตะฝัะฐะผะธ. ะะทะผะตะฝะตะฝะธะต ะฟัะตัะฐะฑะฐ ะผะพะถะตั "ัะปะพะผะฐัั" ััะฐััะต ัะพั ัะฐะฝะตะฝะธั. ะ ะฑัะดััะตะผ ะผะพะถะฝะพ ะฑัะปะพ ะฑั ะฒะฝะตะดัะธัั ัะธััะตะผั ะฒะตััะธะพะฝะธัะพะฒะฐะฝะธั ัะพั ัะฐะฝะตะฝะธะน ะดะปั ะพะฑัะฐัะฝะพะน ัะพะฒะผะตััะธะผะพััะธ.
ะญัะพั ะฟัะพะตะบั ะฑัะป ะผะพะตะน "ะฟะตัะพัะฝะธัะตะน" ะดะปั ััะฝะดะฐะผะตะฝัะฐะปัะฝัั ะผะตั ะฐะฝะธะบ. ะััััััะฒะธะต ัััะพะณะพะน ะฐัั ะธัะตะบัััั ะธ DI-ััะตะนะผะฒะพัะบะพะฒ ะทะฐััะฐะฒะธะปะพ ะผะตะฝั ัะตัะฐัั ะผะฝะพะณะธะต ะฟัะพะฑะปะตะผั "ะฒัััะฝัั", ััะพ ะดะฐะปะพ ะฑะตััะตะฝะฝะพะต ะฟะพะฝะธะผะฐะฝะธะต ัะพะณะพ, ะบะฐะบ ะฝะฐ ัะฐะผะพะผ ะดะตะปะต ัะฐะฑะพัะฐะตั Unity. ะญัะพั ะพะฟัั ะฝะฐะฟััะผัั ะฟะพะฒะปะธัะป ะฝะฐ ะผะพะธ ะฟะพัะปะตะดัััะธะต ะฟัะพะตะบัั, ะณะดะต ั ัะถะต ะพัะพะทะฝะฐะฝะฝะพ ะฟัะธะผะตะฝัะป SOLID, DI ะธ ะดััะณะธะต ะฟะฐััะตัะฝั ะดะปั ัะตัะตะฝะธั ะฟัะพะฑะปะตะผ, ั ะบะพัะพััะผะธ ััะพะปะบะฝัะปัั ะทะดะตัั.
Hi! This is "Ancelight"โmy old project where I implemented all the mechanics of a classic FPS from scratch.
- ๐โโ๏ธ 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 onSpringJoint
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.
"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.
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...
-
๐โโ๏ธ 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.
- Grappling Hook: Implemented with a
- Responsible Classes:
-
๐ซ 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.
- Responsible Classes:
-
๐ 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.).
- Responsible Classes:
-
๐ค 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.
- Teamwork:
- Responsible Classes:
-
๐ฌ 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 activatingUnityEvent
s after clearing all enemies in a scenario.
- Responsible Class:
-
๐พ 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 classFixedJsonUtilityFunc
was written to convert them into formats understandable byJsonUtility
and back. This demonstrates the ability to work around the limitations of standard tools.
- Responsible Classes:
-
๐ถ 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.
- Responsible Class:
-
๐ฆ 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.
- Responsible Classes:
-
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.
- Responsible Classes:
-
๐ฏ 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.
- When aiming at an interactive object or enemy, a panel with information about it appears (
- Responsible Classes:
-
โ๏ธ 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.
- Responsible Classes:
-
๐ 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.
- Responsible Classes:
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...
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.
The system consists of three key components:
-
LevelSaveData.cs
: The data "container." ThisMonoBehaviour
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 simpleSerializable
class. -
FixedJsonUtilityFunc.cs
: The "translator." The standardJsonUtility
cannot handleTransform
,Rigidbody
,Dictionary
, and other complex types. This static class contains methods that "disassemble" these objects into basic types (e.g., aTransform
into aVector3
for position, aQuaternion
for rotation, and aVector3
for scale) and "reassemble" them upon loading. -
LevelSaveLoadSystem.cs
: The "orchestrator." This class manages the entire process:- On Save: Calls the
SaveToJson()
method onLevelSaveData
, which gathers all data, converts it to JSON, and writes it to a file usingBinaryFormatter
(for simplicity). - 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.).
- On Save: Calls the
- 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.
- 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.
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.