
Install via UPM
Add to Unity Package Manager using this URL
https://www.pkglnk.dev/leopotam-ecs.git README Markdown
Copy this to your project's README.md
## Installation
Add **LeoECS Core** to your Unity project via Package Manager:
1. Open **Window > Package Manager**
2. Click **+** > **Add package from git URL**
3. Enter:
```
https://www.pkglnk.dev/leopotam-ecs.git
```
[](https://www.pkglnk.dev/pkg/leopotam-ecs)README
LeoECS - ΠΠ΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΠΉ C# Entity Component System ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π½ΡΠ»Π΅Π²ΡΠ΅ ΠΈΠ»ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΈ, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ, ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΎΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ³ΡΠΎΠ²ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ° - ΡΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠ΅Π»ΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°.
ΠΠΠΠΠ! Π ΠΠΠ ΠΠΠΠ’ΠΠ ΠΠΠΠΠΠΠ ΠΠ ΠΠΠΠ’Π ΠΠ ΠΠΠ ΠΠ©ΠΠΠ, ΠΠΠΠ‘Π’Π ΠΠΠΠ Π‘ΠΠΠΠ£ΠΠ’ ΠΠ‘ΠΠΠΠ¬ΠΠΠΠΠ’Π¬ EcsProto, Π»ΠΈΠ±ΠΎ EcsLite.
ΠΠΠΠΠ! ΠΠ΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
DEBUG-Π²Π΅ΡΡΠΈΠΈ Π±ΠΈΠ»Π΄ΠΎΠ² Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈRELEASE-Π²Π΅ΡΡΠΈΠΈ Π±ΠΈΠ»Π΄ΠΎΠ² Π΄Π»Ρ ΡΠ΅Π»ΠΈΠ·ΠΎΠ²: Π²ΡΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ/ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²DEBUG-Π²Π΅ΡΡΠΈΡΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½Ρ Π΄Π»Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π²RELEASE-Π²Π΅ΡΡΠΈΡΡ .
ΠΠΠΠΠ! LeoEcs-ΡΡΠ΅ΠΉΠΌΠΎΡΠΊ Π½Π΅ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΈΠΌ! ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ - Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π² Π²ΠΈΠ΄Π΅ ecs-ΡΠΈΡΡΠ΅ΠΌΡ.
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅
- Π‘ΠΎΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
- ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠΈΠΏΡ
- ΠΠ½ΡΠ΅ΠΊΡΠΈΡ Π΄Π°Π½Π½ΡΡ
- Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠΏΡ
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈ
- Π‘ΡΠ°ΡΡΠΈ
- ΠΡΠΎΠ΅ΠΊΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ LeoECS
- Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ
- ΠΠΈΡΠ΅Π½Π·ΠΈΡ
- Π§Π°ΠΠΎ
Π‘ΠΎΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ
ΠΠ»ΠΎΠ³ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
Π Π²ΠΈΠ΄Π΅ unity ΠΌΠΎΠ΄ΡΠ»Ρ
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π² Π²ΠΈΠ΄Π΅ unity-ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ΅ΡΠ΅Π· git-ΡΡΡΠ»ΠΊΡ Π² PackageManager ΠΈΠ»ΠΈ ΠΏΡΡΠΌΠΎΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Packages/manifest.json:
"com.leopotam.ecs": "https://github.com/Leopotam/ecs.git",
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΠ΅Π»ΠΈΠ·Π½Π°Ρ Π²Π΅ΡΡΠΈΡ. ΠΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²Π΅ΡΡΠΈΡ "Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅" Ρ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ - ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡΡΡ Π½Π° Π²Π΅ΡΠΊΡ develop:
"com.leopotam.ecs": "https://github.com/Leopotam/ecs.git#develop",
Π Π²ΠΈΠ΄Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΎΠ²
ΠΠΎΠ΄ ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ Π² Π²ΠΈΠ΄Π΅ Π°ΡΡ ΠΈΠ²Π° ΡΠΎ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ΅Π»ΠΈΠ·ΠΎΠ².
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠΈΠΏΡ
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
Π―Π²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ Π΄Π»Ρ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ (Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ Ρ Π΅Π»ΠΏΠ΅ΡΡ, Π½ΠΎ Π½Π΅ ΠΊΡΡΠΊΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ):
struct WeaponComponent {
public int Ammo;
public string GunName;
}
Π‘ΡΡΠ½ΠΎΡΡΡ
Π‘Π°ΠΌΠ° ΠΏΠΎ ΡΠ΅Π±Π΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π·Π½Π°ΡΠΈΡ ΠΈ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ². Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ EcsEntity:
// NewEntity() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΡΡ
ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΌΠΈΡΠ°.
EcsEntity entity = _world.NewEntity ();
// Get() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ Π½Π° ΡΡΡΠ½ΠΎΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ. ΠΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π» - ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
// Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° "ref" - ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅.
ref Component1 c1 = ref entity.Get<Component1> ();
ref Component2 c2 = ref entity.Get<Component2> ();
// Del() ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Ρ ΡΡΡΠ½ΠΎΡΡΠΈ. ΠΡΠ»ΠΈ ΡΡΠΎ Π±ΡΠ» ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ - ΡΡΡΠ½ΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°Π»Π΅Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ. ΠΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π» - ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
entity.Del<Component2> ();
// Replace() Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π·Π°ΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π½ΠΎΠ²ΡΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ. ΠΡΠ»ΠΈ ΡΡΠ°ΡΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π» - Π½ΠΎΠ²ΡΠΉ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΊΠΈ.
WeaponComponent weapon = new WeaponComponent () { Ammo = 10, GunName = "Handgun" };
entity.Replace (weapon);
// Replace() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ "ΡΠ΅ΠΉΠ½ΠΈΠ½Π³" ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²:
EcsEntity entity2 = world.NewEntity ();
entity2.Replace (new Component1 { Id = 10 }).Replace (new Component2 { Name = "Username" });
// ΠΡΠ±Π°Ρ ΡΡΡΠ½ΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π° Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ:
EcsEntity entity2Copy = entity2.Copy ();
// ΠΡΠ±Π°Ρ ΡΡΡΠ½ΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ "ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ" ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΡΠ½ΠΎΡΡΠΈ (ΡΠ°ΠΌΠ° Π±ΡΠ΄Π΅Ρ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½Π°):
var newEntity = world.NewEntity ();
entity2Copy.MoveTo (newEntity); // Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Ρ "entity2Copy" ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΡΡΡΡ Π½Π° "newEntity", Π° "entity2Copy" Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°Π»Π΅Π½Π°.
// ΠΡΠ±Π°Ρ ΡΡΡΠ½ΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄Π°Π»Π΅Π½Π°, ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ½Π°ΡΠ°Π»Π° Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π±ΡΠ΄ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Π»Π΅Π½Ρ ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ ΡΠ½ΡΠΈΡΠΈ Π±ΡΠ΄Π΅Ρ ΡΡΠΈΡΠ°ΡΡΡΡ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½Π½ΠΎΠΉ.
entity.Destroy ();
ΠΠΠΠΠ! Π‘ΡΡΠ½ΠΎΡΡΠΈ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π±Π΅Π· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΈ Π±ΡΠ΄ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡΡΡ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π½Π° Π½ΠΈΡ .
Π‘ΠΈΡΡΠ΅ΠΌΠ°
Π―Π²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ Π΄Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΡ
ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠ΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· IEcsInitSystem, IEcsDestroySystem, IEcsRunSystem (ΠΈ ΠΏΡΠΎΡΠΈΡ
ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ
) ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ²:
class UserSystem : IEcsPreInitSystem, IEcsInitSystem, IEcsRunSystem, IEcsDestroySystem, IEcsPostDestroySystem {
public void PreInit () {
// ΠΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΡ EcsSystems.Init() ΠΈ Π΄ΠΎ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ IEcsInitSystem.Init().
}
public void Init () {
// ΠΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΡ EcsSystems.Init() ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ IEcsPreInitSystem.PreInit().
}
public void Run () {
// ΠΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΡ EcsSystems.Run().
}
public void Destroy () {
// ΠΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΡ EcsSystems.Destroy() ΠΈ Π΄ΠΎ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ IEcsPostDestroySystem.PostDestroy().
}
public void PostDestroy () {
// ΠΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΡ EcsSystems.Destroy() ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ IEcsDestroySystem.Destroy().
}
}
ΠΠ½ΡΠ΅ΠΊΡΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΡΠ΅ ΠΏΠΎΠ»Ρ ecs-ΡΠΈΡΡΠ΅ΠΌ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅ c EcsWorld ΠΈ EcsFilter<T> Π±ΡΠ΄ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Π²Π°Π»ΠΈΠ΄Π½ΡΠΌΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ
ΡΠΈΠΏΠΎΠ²:
class HealthSystem : IEcsSystem {
// ΠΠΎΠ»Ρ Ρ Π°Π²ΡΠΎ-ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠ΅ΠΉ.
EcsWorld _world;
EcsFilter<WeaponComponent> _weaponFilter;
}
ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° (ΠΊΠ»Π°ΡΡΠ°) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° EcsSystems.Inject():
class SharedData {
public string PrefabsPath;
}
...
SharedData sharedData = new SharedData { PrefabsPath = "Items/{0}" };
EcsSystems systems = new EcsSystems (world);
systems
.Add (new TestSystem1 ())
.Inject (sharedData)
.Init ();
ΠΠ°ΠΆΠ΄Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½Π° Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΡ ΠΏΠΎ ΡΠΈΠΏΡ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠ΅ΠΉ:
class TestSystem1 : IEcsInitSystem {
// ΠΠΎΠ»Π΅ Ρ Π°Π²ΡΠΎ-ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠ΅ΠΉ.
SharedData _sharedData;
public void Init() {
var prefabPath = string.Format (_sharedData.Prefabspath, 123);
// prefabPath = "Items/123" ΠΊ ΡΡΠΎΠΌΡ ΠΌΠΎΠΌΠ΅Π½ΡΡ.
}
}
ΠΠΠΠΠ! ΠΠ»Ρ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΡΡΠ°ΡΠΈΡΠ½ΡΠ΅ public/private-ΠΏΠΎΠ»Ρ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΡΡΠ΅ΠΌΡ, Π»ΠΈΠ±ΠΎ public/protected-ΠΏΠΎΠ»Ρ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Ρ!
Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠΏΡ
EcsFilter
Π―Π²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΏΠΎ Π½Π°Π»ΠΈΡΠΈΡ ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²:
class WeaponSystem : IEcsInitSystem, IEcsRunSystem {
// ΠΠΎΠ»Ρ Ρ Π°Π²ΡΠΎ-ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠ΅ΠΉ.
EcsWorld _world;
// ΠΡ Ρ
ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ "WeaponComponent"
// ΠΈ Π±Π΅Π· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° "HealthComponent".
EcsFilter<WeaponComponent>.Exclude<HealthComponent> _filter;
public void Init () {
_world.NewEntity ().Get<WeaponComponent> ();
}
public void Run () {
foreach (int i in _filter) {
// Π‘ΡΡΠ½ΠΎΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΡΠ½ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ "WeaponComponent".
ref EcsEntity entity = ref _filter.GetEntity (i);
// Get1() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ,
// ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠ΅ΡΠ²ΡΠΌ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΡΠΈΠ»ΡΡΡΠ° ("WeaponComponent").
ref WeaponComponent weapon = ref _filter.Get1 (i);
weapon.Ammo = System.Math.Max (0, weapon.Ammo - 1);
}
}
}
ΠΡΠ±ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈΠ· Include-ΡΠΏΠΈΡΠΊΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΡΠΈΠ»ΡΡΡΠ° ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΡΠ΅ΡΠ΅Π· Π²ΡΠ·ΠΎΠ²Ρ EcsFilter.Get1(), EcsFilter.Get2() ΠΈ Ρ.Π΄ - Π½ΡΠΌΠ΅ΡΠ°ΡΠΈΡ ΠΈΠ΄Π΅Ρ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΡΡΠΎ ΠΈ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ.
ΠΡΠ»ΠΈ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅ Π½Π΅Ρ Π΄Π°Π½Π½ΡΡ
ΠΈ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠ°ΠΊ ΡΠ»Π°Π³-ΠΏΡΠΈΠ·Π½Π°ΠΊ Π΄Π»Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ, ΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IEcsIgnoreInFilter - ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΡΠΈΠ»ΡΡΡΠΎΠΌ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ:
struct Component1 { }
struct Component2 : IEcsIgnoreInFilter { }
class TestSystem : IEcsRunSystem {
EcsFilter<Component1, Component2> _filter;
public void Run () {
foreach (var i in _filter) {
// ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ "Component1".
ref var component1 = ref _filter.Get1 (i);
// ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ "Component2" - ΠΊΠ΅Ρ Π²Π½ΡΡΡΠΈ ΡΠΈΠ»ΡΡΡΠ° Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Π±ΡΠ΄Π΅Ρ Π²ΡΠΊΠΈΠ½ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
ref var component2 = ref _filter.Get2 (i);
}
}
}
ΠΠΠΠΠ!: Π€ΠΈΠ»ΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π΄ΠΎ 6
Include-ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΠΈ 2Exclude-ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ. Π§Π΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π² ΡΠΈΠ»ΡΡΡΠ΅ - ΡΠ΅ΠΌ ΠΎΠ½ Π±ΡΡΡΡΠ΅Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΠΠΠΠ! ΠΠ΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠ»ΡΡΡΠΎΠ² Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ, Π½ΠΎ Π²ΡΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π² ΡΠ°Π·Π½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ - Π²
DEBUG-Π²Π΅ΡΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ Π²ΡΠΊΠΈΠ½ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡΠΈΡ ΡΠΈΠ»ΡΡΡΠΎΠ².
ΠΠΠΠΠ! ΠΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π² ΡΠΏΠΈΡΠΊΠ°Ρ "Include" ΠΈ "Exclude" ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠ»ΡΡΡΠ° ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
EcsWorld
Π―Π²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΈ ΡΠΈΠ»ΡΡΡΠΎΠ², Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½Ρ ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Ρ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΌΠΈΡΠΎΠ².
ΠΠΠΠΠ! ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ
EcsWorld.Destroy()Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΌΠΈΡΠ° Π΅ΡΠ»ΠΈ ΠΎΠ½ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ΅Π½.
EcsSystems
Π―Π²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ EcsWorld-ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΌΠΈΡΠ°:
class Startup : MonoBehaviour {
EcsWorld _world;
EcsSystems _systems;
void Start () {
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΡ.
_world = new EcsWorld ();
_systems = new EcsSystems (_world)
.Add (new WeaponSystem ());
_systems.Init ();
}
void Update () {
// ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π²ΡΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ.
_systems.Run ();
}
void OnDestroy () {
// Π£Π½ΠΈΡΡΠΎΠΆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ.
_systems.Destroy ();
// ΠΡΠΈΡΠ°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅.
_world.Destroy ();
}
}
ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ EcsSystems ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½Π°Ρ ecs-ΡΠΈΡΡΠ΅ΠΌΠ° (Π²Π»ΠΎΠΆΠ΅Π½Π° Π² Π΄ΡΡΠ³ΡΡ EcsSystems):
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
EcsSystems nestedSystems = new EcsSystems (_world).Add (new NestedSystem ());
// ΠΠ΅Π»ΡΠ·Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ nestedSystems.Init() Π·Π΄Π΅ΡΡ,
// "rootSystems" Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΡΡΠΎΡ Π²ΡΠ·ΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
EcsSystems rootSystems = new EcsSystems (_world).Add (nestedSystems);
rootSystems.Init ();
// Π ΡΠΈΠΊΠ»Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π½Π΅Π»ΡΠ·Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ nestedSystems.Run(),
// "rootSystems" Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΡΡΠΎΡ Π²ΡΠ·ΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
rootSystems.Run ();
// ΠΡΠΈΡΡΠΊΠ°.
// ΠΠ΅Π»ΡΠ·Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ nestedSystems.Destroy() Π·Π΄Π΅ΡΡ,
// "rootSystems" Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΡΡΠΎΡ Π²ΡΠ·ΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
rootSystems.Destroy ();
ΠΡΠ±Π°Ρ IEcsRunSystem ΡΠΈΡΡΠ΅ΠΌΠ° (Π²ΠΊΠ»ΡΡΠ°Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ EcsSystems) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½ ΠΈΠ»ΠΈ Π²ΡΠΊΠ»ΡΡΠ΅Π½ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ:
class TestSystem : IEcsRunSystem {
public void Run () { }
}
EcsSystems systems = new EcsSystems (_world);
systems.Add (new TestSystem (), "my special system");
systems.Init ();
var idx = systems.GetNamedRunSystem ("my special system");
// "state" Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ "true", Π²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
var state = systems.GetRunSystemState (idx);
// ΠΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΠΎ Π΅Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ.
systems.SetRunSystemState (idx, false);
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈ
Unity
ΠΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ Π½Π° Unity 2020.3 (Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π½Π΅Π΅) ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ asmdef-ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠ±ΠΎΡΠΎΠΊ ΠΈ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π² Unity editor ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Ρ ΠΊΠΎΠ΄Π°, Π° ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΌΠΈΡΠ°.
ΠΠ°ΡΡΠΎΠΌΠ½ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ C#7.3 ΠΈΠ»ΠΈ Π²ΡΡΠ΅.
ΠΠ°ΠΆΠ΄Π°Ρ ΡΠ°ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½ΠΈΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Π° Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° Π΄Π²ΠΈΠΆΠΊΠΎΠΌ:
using Leopotam.Ecs;
class EcsStartup {
EcsWorld _world;
EcsSystems _systems;
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
void Init () {
_world = new EcsWorld ();
_systems = new EcsSystems (_world);
_systems
// Π‘ΠΈΡΡΠ΅ΠΌΡ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ
// Π±ΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π·Π΄Π΅ΡΡ, ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π²Π°ΠΆΠ΅Π½:
// .Add (new TestSystem1 ())
// .Add (new TestSystem2 ())
// OneFrame-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Ρ
// Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΡΠΈΡΡΠ΅ΠΌ, ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π²Π°ΠΆΠ΅Π½:
// .OneFrame<TestComponent1> ()
// .OneFrame<TestComponent2> ()
// ΠΠ½ΡΠ΅ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π° Π·Π΄Π΅ΡΡ,
// ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π½Π΅ Π²Π°ΠΆΠ΅Π½:
// .Inject (new CameraService ())
// .Inject (new NavMeshSupport ())
.Init ();
}
// ΠΠ΅ΡΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½ ΠΈΠ·
// ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ update-ΡΠΈΠΊΠ»Π° Π΄Π²ΠΈΠΆΠΊΠ°.
void UpdateLoop () {
_systems?.Run ();
}
// ΠΡΠΈΡΡΠΊΠ°.
void Destroy () {
if (_systems != null) {
_systems.Destroy ();
_systems = null;
_world.Destroy ();
_world = null;
}
}
}
Π‘ΡΠ°ΡΡΠΈ
ΠΡΠΎΠ΅ΠΊΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ LeoECS
Π‘ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠ°ΠΌΠΈ
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Unity
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Unity uGui
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ
- Unity Physx events support
ΠΠΈΡΠ΅Π½Π·ΠΈΡ
Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π²ΡΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΠΎΠ΄ Π΄Π²ΡΠΌΡ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΠΌΠΈ, ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΡΡΡ.
Π ΡΠ»ΡΡΠ°ΡΡ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ MIT-Red Π½Π΅ ΡΡΠΎΠΈΡ ΡΠ°ΡΡΠΈΡΡΠ²Π°ΡΡ Π½Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ»ΡΡΠ°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π³Π°ΡΠ°Π½ΡΠΈΠΈ.
Π§Π°ΠΠΎ
Π― Ρ ΠΎΡΡ Π·Π½Π°ΡΡ - ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π» Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΡΡΡΠ½ΠΎΡΡΠΈ Π΄ΠΎ Π²ΡΠ·ΠΎΠ²Π° Get() Π΄Π»Ρ ΡΠ°Π·Π½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ?
ΠΡΠ»ΠΈ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ - ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ°Π½Π΅Π΅ ΠΈ ΠΏΡΠΎΡΡΠΎ Π½ΡΠΆΠ½Π° ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΡ, ΡΡΠΎ ΠΎΠ½ ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΠ·ΠΎΠ²Π° EcsEntity.Get<T>().
ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π» ΡΠ°Π½Π΅Π΅ - ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° EcsEntity.Has<T>().
Π― Ρ
ΠΎΡΡ ΠΎΠ΄Π½Ρ ΡΠΈΡΡΠ΅ΠΌΡ Π²ΡΠ·Π²Π°ΡΡ Π² MonoBehaviour.Update(), Π° Π΄ΡΡΠ³ΡΡ - Π² MonoBehaviour.FixedUpdate(). ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ?
ΠΠ»Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ°Π·Π½ΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΈΠ· MonoBehaviour Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ EcsSystems-Π³ΡΡΠΏΠΏΡ:
EcsSystems _update;
EcsSystems _fixedUpdate;
void Start () {
var world = new EcsWorld ();
_update = new EcsSystems (world).Add (new UpdateSystem ());
_update.Init ();
_fixedUpdate = new EcsSystems (world).Add (new FixedUpdateSystem ());
_fixedUpdate.Init ();
}
void Update () {
_update.Run ();
}
void FixedUpdate () {
_fixedUpdate.Run ();
}
ΠΠ½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΡΠ°ΡΡΡ ΠΏΠΎΠ»Π΅ΠΉ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ. ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ?
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΠΈΡΡ ΠΏΠΎΠ»Π΅ ΡΠΈΡΡΠ΅ΠΌΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ [EcsIgnoreInject]:
// ΠΡΠΎ ΠΏΠΎΠ»Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠ΅ΠΉ.
EcsFilter<C1> _filter1;
// ΠΡΠΎ ΠΏΠΎΠ»Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠ΅ΠΉ.
[EcsIgnoreInject] EcsFilter<C2> _filter2;
ΠΠ΅Π½Ρ Π½Π΅ ΡΡΡΡΠ°ΠΈΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ². ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΡΡΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ?
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠ΅ΡΠ΅Π· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IEcsAutoReset<>:
struct MyComponent : IEcsAutoReset<MyComponent> {
public int Id;
public object LinkToAnotherComponent;
public void AutoReset (ref MyComponent c) {
c.Id = 2;
c.LinkToAnotherComponent = null;
}
}
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π΄Π»Ρ Π²ΡΠ΅Ρ Π½ΠΎΠ²ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², Π° ΡΠ°ΠΊ ΠΆΠ΅ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ , Π΄ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΡ Π² ΠΏΡΠ».
ΠΠΠΠΠ! Π ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ
IEcsAutoResetΠ²ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΡΠΈΡΡΠΊΠΈ/ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΎΡΠΊΠ»ΡΡΠ°ΡΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΡΠ΅ΡΠΊΠ°ΠΌ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π»Π΅ΠΆΠΈΡ Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅!
ΠΠΠΠΠ!: ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠ΅
IEcsAutoResetΠ½Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡ Ρ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈentity.Replace(). Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡentity.Replace()ΠΈΠ»ΠΈ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΊΠ°ΠΊ "ΡΠΎΠ±ΡΡΠΈΡ", ΠΊΠΎΡΠΎΡΡΠ΅ ΠΆΠΈΠ²ΡΡ 1 ΡΠΈΠΊΠ», Π° ΠΏΠΎΡΠΎΠΌ ΡΠ΄Π°Π»ΡΡΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ. ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π»ΠΈΡΠ½Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, Π΅ΡΡΡ Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±?
ΠΠ»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΡΠΈΡΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΆΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΊΠ», ΠΌΠ΅ΡΡΠΎ ΠΈΡ
ΠΎΡΠΈΡΡΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΡΠΈΡΡΠ΅ΠΌ Π²Π½ΡΡΡΠΈ EcsSystems:
struct MyOneFrameComponent { }
EcsSystems _update;
void Start () {
var world = new EcsWorld ();
_update = new EcsSystems (world);
_update
.Add (new CalculateSystem ())
// ΠΡΠ΅ "MyOneFrameComponent" ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π±ΡΠ΄ΡΡ
// ΡΠ΄Π°Π»Π΅Π½Ρ Π·Π΄Π΅ΡΡ.
.OneFrame<MyOneFrameComponent> ()
// ΠΠ΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌ, ΡΡΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½
// "MyOneFrameComponent" Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.
.Add (new UpdateSystem ())
.Init ();
}
void Update () {
_update.Run ();
}
ΠΠ½Π΅ Π½ΡΠΆΠ΅Π½ Π±ΠΎΠ»ΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΊΠ΅ΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ. ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ?
ΠΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ·Π΄Π°Π½ Ρ ΡΠ²Π½ΡΠΌ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ EcsWorldConfig-ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ:
var config = new EcsWorldConfig () {
// Π Π°Π·ΠΌΠ΅Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ World.Entities.
WorldEntitiesCacheSize = 1024,
// Π Π°Π·ΠΌΠ΅Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ World.Filters.
WorldFiltersCacheSize = 128,
// Π Π°Π·ΠΌΠ΅Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ World.ComponentPools.
WorldComponentPoolsCacheSize = 512,
// Π Π°Π·ΠΌΠ΅Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Entity.Components (Π΄ΠΎ ΡΠ΄Π²ΠΎΠ΅Π½ΠΈΡ).
EntityComponentsCacheSize = 8,
// Π Π°Π·ΠΌΠ΅Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Filter.Entities.
FilterEntitiesCacheSize = 256,
};
var world = new EcsWorld(config);
ΠΠ½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ΅ΠΌ 6-"Include" ΠΈ 2-"Exclude" ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π² ΡΠΈΠ»ΡΡΡΠ΅. ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ?
ΠΠΠΠΠ! ΠΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΈ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡΠΌΠΈ.
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΠ΅ΠΉ EcsFilter ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π° EcsFilter.cs.
Π― Ρ ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅Π°ΠΊΡΠΈΠ²ΡΠΈΠ½Ρ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΈΠ»ΡΡΡΠΎΠ². ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ?
ΠΠΠΠΠ! Π’Π°ΠΊ Π΄Π΅Π»Π°ΡΡ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΠ·-Π·Π° ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΠ»Ρ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π° ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ LEOECS_FILTER_EVENTS Π² ΡΠΏΠΈΡΠΎΠΊ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ΠΊΠΎΠΌΠΏΠ»ΡΡΠΎΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ - Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΡΠΎΠ±ΡΡΠΈΠΉ:
class CustomListener: IEcsFilterListener {
public void OnEntityAdded (in EcsEntity entity) {
// Π‘ΡΡΠ½ΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² ΡΠΈΠ»ΡΡΡ.
}
public void OnEntityRemoved (in EcsEntity entity) {
// Π‘ΡΡΠ½ΠΎΡΡΡ ΡΠ΄Π°Π»Π΅Π½Π° ΠΈΠ· ΡΠΈΠ»ΡΡΡΠ°.
}
}
class MySystem : IEcsInitSystem, IEcsDestroySystem {
readonly EcsFilter<Component1> _filter = null;
readonly CustomListener _listener = new CustomListener ();
public void Init () {
// ΠΠΎΠ΄ΠΏΠΈΡΠΊΠ° ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π½Π° ΡΠΎΠ±ΡΡΠΈΡ ΡΠΈΠ»ΡΡΡΠ°.
_filter.AddListener (_listener);
}
public void Destroy () {
// ΠΡΠΏΠΈΡΠΊΠ° ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΠΎΡ ΡΠΎΠ±ΡΡΠΈΠΉ ΡΠΈΠ»ΡΡΡΠ°.
_filter.RemoveListener (_listener);
}
}











No comments yet. Be the first!