Abstract
Entity Manager ๋ ์ํฐํฐ์ ์ฅ๋ถ์
๋๋ค. "์ง๊ธ Id ๋ช ๋ฒ์ด ์ด์ ์๊ณ , ์ด๋ ๊ทธ๋ฃน์ ์ํ๋ฉฐ, ์ด๋ค ์ํ์ธ๊ฐ"๋ฅผ ๊ธฐ๋กํ๊ณ , ๊ทธ ๊ธฐ๋ก์ ๋ฐ๋ผ ๋ก์ง์ OnInit / OnShow / OnHide ๋ฅผ ์ ํด์ง ์์๋ก ๋ฑ ํ ๋ฒ์ฉ ๋ถ๋ฌ ์ค๋๋ค. ๊ฒ์ ์ฝ๋์์ ๊ฒช๋ ์ํฐํฐ ๊ด๋ จ ์์ธ๋ ๊ฑฐ์ ์ ๋ถ ์ด ์ฅ๋ถ์ ์ด๊ธ๋ ์์ฒญ์ ํ์ ๋ ๋ฉ๋๋ค.
์ํฐํฐ์ ์ผ์ โ ์ํ์ ์ฝ๋ฐฑ
stateDiagram-v2
[*] --> Loading: ShowEntity
Loading --> Inited: ์์
๋์ฐฉ โ OnInit (์ธ์คํด์ค๊ฐ ์๊ฒ์ผ ๋๋ง)
Inited --> Showed: OnShow
Showed --> Hidden: HideEntity โ OnHide
Hidden --> Recycled: ๋ค์ Update โ OnRecycle
Recycled --> [*]: ์ธ์คํด์ค๋ ํ๋ก
Loading --> [*]: ๋ก๋ ์ค HideEntity โ ๋์ฐฉํ๋ฉด ๋ฐ๋ก ๋ฒ๋ฆผMermaid
๋ณต์ฌ
์ฌ๊ธฐ์ ๊ฒ์ ์ฝ๋๊ฐ ์์์ผ ํ ๊ฒ์ HideEntity ๊ฐ ๋ ๋จ๊ณ๋ผ๋ ์ ์
๋๋ค. ํธ์ถ ์ฆ์ OnHide ๊ฐ ๋ถ๋ฆฌ๊ณ ์ฅ๋ถ์์ ์ง์์ง์ง๋ง(Hidden), ์ธ์คํด์ค๊ฐ ํ๋ก ๋์๊ฐ๋ ๊ฒ์ ๋ค์ ํ๋ ์์ Update ์
๋๋ค(Recycled). ๊ทธ ์ฌ์ด ํ ํ๋ ์ ๋์ GameObject ๋ ์์ง ๊ทธ ์๋ฆฌ์ ์์ต๋๋ค.
์์ฃผ ๋ง๋๋ ์์ธ์ ์์ธ
๋ฉ์์ง | ์์ธ | ToyboxNightmare ์ ๋์ |
Entity id 'โฆ' is already exist. | ์ด์ ์๋ Id ๋ก ๋ ShowEntity. Id ๋ ํธ์ถ์๊ฐ ์ ํด ๋๊ธฐ๋ ๊ฐ์ด๋ผ ๊ฒน์น์ง ์๊ฒ ํ ์ฑ
์๋ ํธ์ถ์์๊ฒ ์๋ค | EntitySerialId.Next() ๋ก ๋งค๋ฒ ์ ๋ฒํธ๋ฅผ ๋ฐ๋๋ค |
Can not find entity 'โฆ'. | ์ด๋ฏธ ์จ๊ธด ์ํฐํฐ๋ฅผ ๋ HideEntity. ์ฒซ ํธ์ถ์์ ์ฅ๋ถ์์ ์ง์์ก๊ธฐ ๋๋ฌธ์ด๋ค | EntityLogicBase.SafeHide() โ "์ด๋ฏธ ์จ๊น ์์ฒญ์ ๋ณด๋๋" ํ๋๊ทธ๋ก ํ ๋ฒ๋ง ํต๊ณผ์ํจ๋ค |
Entity group 'โฆ' is not exist. | ShowEntity ์ ๋๊ธด ๊ทธ๋ฃน ์ด๋ฆ์ด EntityComponent ์ ๋ฑ๋ก๋ผ ์์ง ์๋ค (์คํ) | ๊ทธ๋ฃน ์ด๋ฆ์ EnemyTable.EntityGroup ๊ฐ์ ์์๋ก ํ๊ณณ์ ๋๋ค |
์ด์ค HideEntity ๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ์๊ธฐ๋์ง ์์ ๋๋ฉด ์ข์ต๋๋ค. ์ ์ด ๊ฐ์ ํ๋ ์์ ๋ ๋ฐ์ ์ด์์ ๋ง์ ์ฌ๋ง ์ฒ๋ฆฌ๊ฐ ๋ ๋ฒ ๋ค์ด์ค๊ฑฐ๋, ์๋ช
ํ์ด๋จธ์ ์ถฉ๋ ํ์ ์ด ๋์์ ํฌ์ฌ์ฒด๋ฅผ ํ์ํ๋ ค ํ ๋์
๋๋ค. ๋๋ฌผ์ง๋ง ๋ฐ๋์ ์ผ์ด๋๋ ๊ฒฝ์ฐ๋ผ, ์์ ๋ ๋ชจ๋ ํ์๋ฅผ SafeHide() ํ๋๋ก ๋ชจ์์ต๋๋ค.
๋ถ๋ชจ-์์ โ ๋ถ์ด๋ฉด ํจ๊ป ์ฌ๋ผ์ง๋ค
AttachEntity(child, parent) ๋ก ๋ถ์ธ ์์์ ๋ถ๋ชจ๊ฐ ์จ๊ฒจ์ง ๋ ๋จผ์ ์๋์ผ๋ก ์จ๊ฒจ์ง๋๋ค. ๋ฌด๊ธฐ๋ฅผ ์บ๋ฆญํฐ์ ๋ถ์ฌ ๋๋ฉด ์บ๋ฆญํฐ๋ฅผ ํ์ํ ๋ ๋ฌด๊ธฐ๋ฅผ ๋ฐ๋ก ์ฑ๊ธฐ์ง ์์๋ ๋ฉ๋๋ค. ๋ฐ๋๋ก ๋งํ๋ฉด, ๋ถ๋ชจ๋ฅผ ์จ๊ธด ๋ค ์์์ ๋ ์จ๊ธฐ๋ ค ํ๋ฉด ์์ Can not find entity ์์ธ๊ฐ ๋ฉ๋๋ค.
// ๋ฌด๊ธฐ ์ํฐํฐ๊ฐ ๋ฌ ๋ค(ShowEntitySuccess) ์บ๋ฆญํฐ์ ์ ๋ณธ์ ๋ถ์ธ๋ค
entity.AttachEntity(weaponId, playerId, "RightHand");
C#
๋ณต์ฌ
ToyboxNightmare ๋ ๋ฌด๊ธฐ๋ฅผ ๋ณ๋ ์ํฐํฐ๋ก ๋ง๋ค์ง ์๊ณ ์บ๋ฆญํฐ ํ๋ฆฌํน์ ํฌํจํด ๋์ด์ ์ด ๊ธฐ๋ฅ์ ์ฐ์ง ์์ต๋๋ค. ์ฅ๋น ๊ต์ฒด๊ฐ ์๋ ๊ฒ์์ด๋ผ๋ฉด ๊ฐ์ฅ ๋จผ์ ์ฐ๊ฒ ๋ ๊ธฐ๋ฅ์
๋๋ค.
OnInit ๊ณผ OnShow ๊ฐ ๋๋ ์ด์
์ธ์คํด์ค๊ฐ ํ์์ ์ฌ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์
๋๋ค. OnInit ์ GameObject ๊ฐ ์ฒ์ ๋ง๋ค์ด์ก์ ๋ ํ ๋ฒ, OnShow ๋ ์คํฐ๋ ๋๋ง๋ค ๋ถ๋ฆฝ๋๋ค.
OnInit ์ ๋ ๊ฒ | OnShow ์ ๋ ๊ฒ | |
์ฑ๊ฒฉ | ํ ๋ฒ ์ฐพ์ ๋๋ฉด ๋ณํ์ง ์๋ ๊ฒ | ์คํฐ๋ง๋ค ๋ฌ๋ผ์ง๋ ๊ฒ |
์ | GetComponentInChildren ์ผ๋ก ์บ์ฑ, ์ํ ๊ฐ์ฒด ์์ฑ | ์ฒด๋ ฅยท์์นยทํ์ด๋จธ ๋ฆฌ์
, FSM ์์ฑ, ์ ๋๋ฉ์ดํฐ ์ด๊ธฐํ |
"๋ ๋ฒ์งธ ์คํฐ๋ถํฐ ์ฒด๋ ฅ์ด 0 ์ธ ์ฑ๋ก ๋์จ๋ค" ๊ฐ์ ๋ฒ๊ทธ๋ OnShow ์์ ๋ฆฌ์
ํ ๊ฒ์ OnInit ์ด๋ ํ๋ ์ด๊ธฐ๊ฐ์ ๋งก๊ฒผ์ ๋ ์๊น๋๋ค.
๋ณธ๋ฌธ์ ์ฝ์ ๋ ์ฃผ์ํ ์
โข
๋ณธ๋ฌธ์ entityManager.ShowEntity(...) ๋ ์ฝ์ด API ์
๋๋ค. ๊ฒ์ ์ฝ๋๋ GameEntry.GetComponent<EntityComponent>() ๋ฅผ ์ฐ๊ณ , ์ฌ๊ธฐ์๋ ๋ก์ง ํ์
์ธ์๊ฐ ํ๋ ๋ ๋ถ์ต๋๋ค โ ShowEntity(id, typeof(Enemy), "Zombunny", "Enemy", data).
โข
"์ฌ์ฉ ๊ฐ์ด๋ โ ์ด๊ธฐํ" ์ SetObjectPoolManager / SetResourceManager / AddEntityGroup ์ EntityComponent ๊ฐ Start ์์ ๋์ ํด ์ค๋๋ค. ๊ทธ๋ฃน์ ์ธ์คํํฐ์์ ๋ฑ๋กํฉ๋๋ค.
โข
ShowEntityUpdate / ShowEntityDependencyAsset ์ด๋ฒคํธ๋ ์ด ์๋์
์์ ๋ฐ์ํ์ง ์์ต๋๋ค(๋ฆฌ์์ค ๊ณ์ธต์ด ์งํ๋ฅ ์ ์ ๋ฌํ์ง ์์).
โข
์ํฐํฐ๋ฅผ ์น์ธ ๋๋ ๋ฐ๋์ HideEntity ๋ฅผ ๊ฑฐ์นฉ๋๋ค. Destroy ๋ SetActive(false) ๋ก ์น์ฐ๋ฉด ์ฅ๋ถ์๋ ์ด์ ์๋ ๊ฒ์ผ๋ก ๋จ์ Id ๊ฐ ์์ํ ์ ์ ๋๊ณ ํ๋ ์ด๊ธ๋ฉ๋๋ค.
Entity Manager
๊ด๋ จ ์์ค ํ์ผ
โข
GameFramework/Base/EventPool/EventPool.cs
โข
GameFramework/Entity/EntityManager.EntityGroup.cs
โข
GameFramework/Entity/EntityManager.EntityInfo.cs
โข
GameFramework/Entity/EntityManager.cs
โข
GameFramework/Entity/IEntityGroup.cs
โข
GameFramework/Entity/IEntityManager.cs
โข
GameFramework/Sound/SoundManager.cs
โข
GameFramework/UI/IUIGroup.cs
โข
GameFramework/UI/IUIManager.cs
โข
GameFramework/UI/UIManager.UIGroup.cs
โข
GameFramework/UI/UIManager.cs
Entity Manager๋ ๊ฒ์ ์ํฐํฐ ์์ฑ, ๊ด๋ฆฌ, ํ๊ดด๋ฅผ ์ฒ๋ฆฌํ๋ GameFramework์ ํต์ฌ ์์คํ
์
๋๋ค.
๊ฒ์ ์ค๋ธ์ ํธ์ ์๋ช
์ฃผ๊ธฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, UI ๊ด๋ฆฌ์๋ UI ์ ์ฉ ๊ด๋ฆฌ, ์ฌ์ด๋ ๊ด๋ฆฌ์๋ ์ฌ์ด๋ ์ ์ฉ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค.
๊ฐ์ (Overview)
Entity Manager๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๋ ์ค์ ์์คํ
์
๋๋ค.
โข
์์
์์ ๊ฒ์ ์ํฐํฐ ์์ฑ ๋ฐ ํ์
โข
์ํฐํฐ๋ฅผ ๋
ผ๋ฆฌ์ ๊ทธ๋ฃน์ผ๋ก ์กฐ์ง
โข
์ํฐํฐ ๊ฐ ๋ถ๋ชจ-์์ ๊ด๊ณ ๊ด๋ฆฌ
โข
์ํฐํฐ ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ
โข
์ค๋ธ์ ํธ ํ์ ํตํ ์ํฐํฐ ์ธ์คํด์ค ์ฌํ์ฉ
ํต์ฌ ์ํคํ ์ฒ
๋ค๋ฅธ GameFramework ์์คํ
๊ณผ ๋์ผํ๊ฒ ๋ชจ๋ํ ๋์์ธ ํจํด์ ๋ฐ๋ฆ
๋๋ค.
Entity Manager
EntityManager ํด๋์ค๋ IEntityManager ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํต์ฌ ๊ตฌ์ฑ์์์
๋๋ค.
์ญํ :
โข
mEntityInfos ๋์
๋๋ฆฌ๋ก ํ์ฑ ์ํฐํฐ ์ถ์ (์์ ํ๊ธฐ๋ m_EntityInfos)
โข
mEntityGroups ๋์
๋๋ฆฌ๋ก ์ํฐํฐ ๊ทธ๋ฃน ๊ด๋ฆฌ
โข
๋ฆฌ์์ค ๋งค๋์ ์ ํ๋ ฅํ์ฌ ์ํฐํฐ ๋ก๋ฉ
โข
์ํฐํฐ ์ฌํ์ฉ ๋ฐ ํ๋ง ๊ด๋ฆฌ
โข
๋ถ๋ชจ-์์ ๊ด๊ณ ๊ด๋ฆฌ
โข
์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ ๋ธ๋ก๋์บ์คํธ
์ํฐํฐ ๊ทธ๋ฃน (Entity Groups)
์ํฐํฐ ๊ทธ๋ฃน์ ๊ด๋ จ ์ํฐํฐ๋ฅผ ๋ฌถ๋ ์ปจํ
์ด๋์
๋๋ค.
๊ฐ ๊ทธ๋ฃน์ ๊ณ ์ ํ ์ธ์คํด์ค ํ์ ๊ฐ์ง๋๋ค.
์์ฑ:
โข
Name: ๊ทธ๋ฃน ์๋ณ์
โข
EntityCount: ๊ทธ๋ฃน ๋ด ์ํฐํฐ ๊ฐ์
โข
InstanceAutoReleaseInterval: ํ ์๋ ํด์ ์ฃผ๊ธฐ
โข
InstanceCapacity: ํ ์ต๋ ์ฉ๋
โข
InstanceExpireTime: ๋ฏธ์ฌ์ฉ ์ธ์คํด์ค ๋ง๋ฃ ์๊ฐ
โข
InstancePriority: ํ ํด์ ์ฐ์ ์์
โข
Helper: ๊ทธ๋ฃน ํฌํผ ๊ตฌํ์ฒด
์ํฐํฐ ์ ๋ณด ์ถ์ (EntityInfo)
EntityManager๋ EntityInfo ํด๋์ค๋ฅผ ํตํด ์ํฐํฐ ์ํ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ถ์ ํฉ๋๋ค.
์ํฐํฐ ์๋ช ์ฃผ๊ธฐ
์ํฐํฐ๋ ์์ฑ โ ํ์ โ ์จ๊น โ ์ฌํ์ฉ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
์ํฐํฐ ํ์ (ShowEntity)
์ ์ฐจ:
1.
ShowEntity() ํธ์ถ (ID, ์์
์ด๋ฆ, ๊ทธ๋ฃน ์ด๋ฆ ์ง์ )
2.
ํ์ ์ธ์คํด์ค ์กด์ฌ ์ฌ๋ถ ํ์ธ
3.
์์ผ๋ฉด ๋ฆฌ์์ค ๋งค๋์ ๋ก ์์
๋ก๋
4.
๋ก๋ ์ฑ๊ณต ์ ์ํฐํฐ ์ด๊ธฐํ
5.
ํด๋น ๊ทธ๋ฃน์ ์ถ๊ฐ
6.
OnInit(), OnShow() ์ฝ๋ฐฑ ์คํ
7.
ShowEntitySuccess ์ด๋ฒคํธ ๋ฐ์
์ํฐํฐ ์จ๊น (HideEntity)
์ ์ฐจ:
1.
HideEntity() ํธ์ถ (ID ๋๋ ์ฐธ์กฐ)
2.
๋ก๋ฉ ์ค์ด๋ฉด release-on-load ๋ฆฌ์คํธ์ ์ถ๊ฐ
3.
์๋๋ฉด InternalHideEntity() ํธ์ถ
4.
OnHide() ์ฝ๋ฐฑ ์คํ
5.
์ฌํ์ฉ ํ์ ์ถ๊ฐ
6.
HideEntityComplete ์ด๋ฒคํธ ๋ฐ์
์ํฐํฐ ์ฌํ์ฉ
์
๋ฐ์ดํธ ๋ฃจํ์์ ์ฌํ์ฉ ํ ์ฒ๋ฆฌ:
1.
ํ์์ ์ํฐํฐ ๊บผ๋ด๊ธฐ
2.
์ํ๋ฅผ WillRecycle๋ก ๋ณ๊ฒฝ
3.
OnRecycle() ์ฝ๋ฐฑ ์คํ
4.
์ํ๋ฅผ Recycled๋ก ๋ณ๊ฒฝ
5.
์ธ์คํด์ค๋ฅผ ํด๋น ๊ทธ๋ฃน ํ์ ๋ฐํ
6.
EntityInfo ํด์
์ํฐํฐ ๊ณ์ธต ๊ตฌ์กฐ
๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ์ง์ํฉ๋๋ค.
AttachEntity
โข
์์ ์ํฐํฐ์ ๋ถ๋ชจ ์ฐธ์กฐ ์ค์
โข
๋ถ๋ชจ์ ์์ ๋ฆฌ์คํธ์ ์ถ๊ฐ
โข
๋ถ๋ชจ OnAttached() ํธ์ถ
โข
์์ OnAttachTo() ํธ์ถ
Query
โข
GetParentEntity()
โข
GetChildEntityCount()
โข
GetChildEntity()
โข
GetChildEntities()
DetachEntity
โข
๋ถ๋ชจ์ ์์ ๋ฆฌ์คํธ์์ ์ ๊ฑฐ
โข
์์์ ๋ถ๋ชจ ์ฐธ์กฐ ์ ๊ฑฐ
โข
๋ถ๋ชจ OnDetached() ํธ์ถ
โข
์์ OnDetachFrom() ํธ์ถ
๋ค๋ฅธ ์์คํ ๊ณผ์ ํตํฉ
์ค๋ธ์ ํธ ํ
โข
๊ฐ ์ํฐํฐ ๊ทธ๋ฃน์ ์ ์ฉ ํ ๋ณด์
โข
ํ์ ์ ํ์์ ์์ฑ
โข
์จ๊ธธ ๋ ํ์ ๋ฐํ
โข
๊ทธ๋ฃน๋ณ ํ๋ผ๋ฏธํฐ ์ค์ ๊ฐ๋ฅ
๋ฆฌ์์ค ๋งค๋์
โข
์์
๋ก๋ฉ ์์
โข
๋ก๋ ์ฑ๊ณต/์คํจ ์ฝ๋ฐฑ ์ฒ๋ฆฌ
์ด๋ฒคํธ ์์คํ
โข
ShowEntitySuccess
โข
ShowEntityFailure
โข
ShowEntityUpdate
โข
ShowEntityDependencyAsset
โข
HideEntityComplete
๋ค๋ฅธ ๋งค๋์ ์ ๋น๊ต
๊ธฐ๋ฅ | Entity Manager | UI Manager | Sound Manager |
๊ทธ๋ฃน ๊ฐ๋
| Entity Groups | UI Groups | Sound Groups |
์์
๋ก๋ฉ | Resource Manager | Resource Manager | Resource Manager |
์ธ์คํด์ค ํ | Entity Instances | UI Form Instances | Sound Agents |
ํฌํผ ์ธํฐํ์ด์ค | IEntityHelper | IUIFormHelper | ISoundHelper |
๊ทธ๋ฃน ํฌํผ | IEntityGroupHelper | IUIGroupHelper | ISoundGroupHelper |
๋ถ๋ชจ-์์ ์ง์ | O | X | X |
์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ | Show/Hide | Open/Close | Play/Stop |
์ฌ์ฉ ๊ฐ์ด๋
์ด๊ธฐํ
entityManager.SetObjectPoolManager(objectPoolManager);
entityManager.SetResourceManager(resourceManager);
entityManager.SetEntityHelper(entityHelper);
entityManager.AddEntityGroup(groupName, autoReleaseInterval, capacity, expireTime, priority, groupHelper);
C#
๋ณต์ฌ
์ํฐํฐ ๊ธฐ๋ณธ ์กฐ์
entityManager.ShowEntity(entityId, entityAssetName, entityGroupName);
entityManager.HideEntity(entityId);
bool exists = entityManager.HasEntity(entityId);
IEntity entity = entityManager.GetEntity(entityId);
C#
๋ณต์ฌ
๊ณ์ธต ์กฐ์
entityManager.AttachEntity(childEntityId, parentEntityId);
entityManager.DetachEntity(childEntityId);
IEntity parent = entityManager.GetParentEntity(childEntityId);
IEntity[] children = entityManager.GetChildEntities(parentEntityId);
C#
๋ณต์ฌ






