{"id":22549058,"url":"https://github.com/dcfapixels/dragonecs-hybrid","last_synced_at":"2025-03-28T09:24:47.171Z","repository":{"id":226320055,"uuid":"762780352","full_name":"DCFApixels/DragonECS-Hybrid","owner":"DCFApixels","description":null,"archived":false,"fork":false,"pushed_at":"2025-03-19T08:35:23.000Z","size":62,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-19T09:31:50.274Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DCFApixels.png","metadata":{"files":{"readme":"README-RU.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-02-24T17:10:25.000Z","updated_at":"2025-03-17T03:28:43.000Z","dependencies_parsed_at":"2024-06-15T18:28:54.465Z","dependency_job_id":"461b93a2-5e3f-428a-bdda-ae3d529e0396","html_url":"https://github.com/DCFApixels/DragonECS-Hybrid","commit_stats":null,"previous_names":["dcfapixels/dragonecs-hybrid"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DCFApixels%2FDragonECS-Hybrid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DCFApixels%2FDragonECS-Hybrid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DCFApixels%2FDragonECS-Hybrid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DCFApixels%2FDragonECS-Hybrid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DCFApixels","download_url":"https://codeload.github.com/DCFApixels/DragonECS-Hybrid/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246000736,"owners_count":20707778,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-07T16:07:47.227Z","updated_at":"2025-03-28T09:24:47.164Z","avatar_url":"https://github.com/DCFApixels.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg width=\"400\" src=\"https://private-user-images.githubusercontent.com/99481254/386965991-5f16d1ca-0f05-4ca0-88aa-6fa55ac9b817.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDIxODIzNDQsIm5iZiI6MTc0MjE4MjA0NCwicGF0aCI6Ii85OTQ4MTI1NC8zODY5NjU5OTEtNWYxNmQxY2EtMGYwNS00Y2EwLTg4YWEtNmZhNTVhYzliODE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAzMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMzE3VDAzMjcyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQxNDRjZjk5YTQzNzE0NDI5MTUxZGFhNTU0NWUyZTUzYjk1NDcyZDJlNTA4ZjVjYTM0ZDk4OTBiZjI1OGI1MDYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.n5-D5v5kHNKINYX9MKrZGhfJ-Z4vtxuhDAWAipsgAps\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg alt=\"Version\" src=\"https://img.shields.io/github/package-json/v/DCFApixels/DragonECS-Hybrid?color=%23ff4e85\u0026style=for-the-badge\"\u003e\n\u003cimg alt=\"License\" src=\"https://img.shields.io/github/license/DCFApixels/DragonECS-Hybrid?color=ff4e85\u0026style=for-the-badge\"\u003e\n\u003ca href=\"https://discord.gg/kqmJjExuCf\"\u003e\u003cimg alt=\"Discord\" src=\"https://img.shields.io/badge/Discord-JOIN-00b269?logo=discord\u0026logoColor=%23ffffff\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n\u003ca href=\"http://qm.qq.com/cgi-bin/qm/qr?_wv=1027\u0026k=IbDcH43vhfArb30luGMP1TMXB3GCHzxm\u0026authKey=s%2FJfqvv46PswFq68irnGhkLrMR6y9tf%2FUn2mogYizSOGiS%2BmB%2B8Ar9I%2Fnr%2Bs4oS%2B\u0026noverify=0\u0026group_code=949562781\"\u003e\u003cimg alt=\"QQ\" src=\"https://img.shields.io/badge/QQ-JOIN-00b269?logo=tencentqq\u0026logoColor=%23ffffff\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# DragonECS-Hybrid\n \n`IEcsHybridComponent` - Гибридные компоненты. Используются для реализации гибридности.\n\n`EcsHybridPool` - пул для гибридных компонентов. Используются для реализации гибридности, хранит class-компоненты `IEcsHybridComponent`;\n\nДля смешивания архитектурных подходов классического OOP и ECS используется специальный пул `EcsHybridPool\u003cT\u003e`. Принцип работы этого пула несколько от других и он добавляет поддержу наследования и полиморфизма в компоненты. \n\n\u003cdetails\u003e\n\u003csummary\u003eКак это работает?\u003c/summary\u003e\n\nПри добавлении элемента в пул, пул сканирует его иерархию наследования и реализуемые интерфейсы в поиске типов у которых есть интерфейс `IEcsHybridComponent` и автоматически добавляет компонент в соответствующие этим типам пулы. Таким же образом происходит удаление. Сканирование происходит не для типа T а для типа экземпляра, поэтому в примере ниже строчка в `_world.GetPool\u003cITransform\u003e().Add(entity, _rigidbody);` добавляет не только в пул `EcsHybridPool\u003cITransform\u003e` но и в остальные.\n\n\u003c/details\u003e\n\nПример использования:\n``` csharp\npublic interface ITransform : IEcsHybridComponent\n{\n    Vector3 Position { get; set; }\n    // ...\n}\npublic class Transform : ITransform\n{\n    public Vector3 Position { get; set; }\n    // ...\n}\npublic class Rigidbody : Transform\n{\n    public Vector3 Position { get; set; }\n    public float Mass { get; set; }\n    // ...\n}\npublic class Camera : ITransform\n{\n    Vector3 Position { get; set; }\n    // ...\n}\npublic TransformAspect : EcsAspect\n{\n    public EcsHybridPool\u003cTransform\u003e transforms;\n    public Aspect(Builder b) \n    {\n        transforms = b.Include\u003cTransform\u003e();\n    }\n}\n// ...\n\nEcsWorld _world;\nRigidbody _rigidbody;\n// ...\n\n// Создадим пустую сущность.\nint entity = _world.NewEmptyEntity();\n// Получаем пул EcsHybridPool\u003cITransform\u003e и добавляем в него для сущности компонент _rigidbody.\n// Если вместо ITransform подставить Transform или Rigidbody, то результат будет одинаковый\n_world.GetPool\u003cITransform\u003e().Add(entity, _rigidbody);\n// ...\n\n//Все эти строчки вернут экземпляр _rigidbody.\nITransform iTransform = _world.GetPool\u003cITransform\u003e().Get(entity);  \nTransform transform = _world.GetPool\u003cTransform\u003e().Get(entity);  \nRigidbody rigidbody = _world.GetPool\u003cRigidbody\u003e().Get(entity);\n//Исключение - отсутствует компонент. Camera не является наследником или наследуемым классом для _rigidbody.\nCamera camera = _world.GetPool\u003cCamera\u003e().Get(entity);\n\n//Вернет True. Поэтому фишка гибридных пулов будет работать и в запросах сущностей\nbool isMatches = _world.GetAspect\u003cTransformAspect\u003e().IsMatches(entity);\n\n//Все эти строчки вернут True.\nbool isITransform = _world.GetPool\u003cITransform\u003e().Has(entity);  \nbool isTransform = _world.GetPool\u003cTransform\u003e().Has(entity);  \nbool isRigidbody = _world.GetPool\u003cRigidbody\u003e().Has(entity);\n//Эта строчка вернет False.\nbool isCamera = _world.GetPool\u003cCamera\u003e().Has(entity);\n// ...\n\n// Удалим у сущности компонент.\n_world.GetPool\u003cITransform\u003e().Del(entity);\n// ...\n//Все эти строчки вернут False.\nbool isITransform = _world.GetPool\u003cITransform\u003e().Has(entity);  \nbool isTransform = _world.GetPool\u003cTransform\u003e().Has(entity);  \nbool isRigidbody = _world.GetPool\u003cRigidbody\u003e().Has(entity);\nbool isCamera = _world.GetPool\u003cCamera\u003e().Has(entity);\n// ...\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdcfapixels%2Fdragonecs-hybrid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdcfapixels%2Fdragonecs-hybrid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdcfapixels%2Fdragonecs-hybrid/lists"}