Skip to content
This repository was archived by the owner on Jul 12, 2022. It is now read-only.

EntitySystem

Syadeu edited this page Oct 22, 2021 · 15 revisions

Namespace: Syadeu.Presentation
File: EntitySystem.cs

public sealed class EntitySystem : PresentationSystemEntity<EntitySystem>

Entity<T> (EntityBase 를 상속받는) 와 EntityData<T> (EntityDataBase 를 상속받는), AttributeBase 의 모든 인스턴스들의 매니저 시스템입니다.

Inheritance: PresentationSystemEntity<T> -> EntitySystem

Overview

  • UnityEngine.GameObject, 또는 UnityEngine.Object 들을 GameObjectProxySystem 을 통해 생성된 ProxyTransform 으로 효율적으로 관리할 수 있습니다.
  • Json serialize 된 ObjectBase 의 인스턴스를 생성할 수 있습니다.

Remarks

EntitySystem 에서 Entity 와 관련된 모든 작업을 수행합니다. Entity 의 구현부인 EntityDataProcessor, Attribute 의 구현부인 AttributeProcessorObjectBase 의 인스턴스 생성, EntityBaseProxyTransform 과의 연결등 GameObjectProxySystem 의 상위 시스템이라 보아도 무방합니다.

EntitySystem 객체 지향 설계 (OOP) 방식을 따릅니다. 이는 사용자의 입장에서 더 쉽고 간편하게 시스템을 사용할 수 있게 위함인데, 사용자는 Presentation 시스템의 최종 딜리버리 형태인 EntityDataBase, EntityBase, AttributeBase, DataObjectBase, ActionBase 를 상속받아 추가적으로 시스템을 확장해 나갈 수 있습니다.

Description

EntitySystem 은 ObjectBase 를 상속받는 모든 인스턴스 객체에 대해 관리합니다. ObjectBase 들은 기본적으로 전부 재사용을 염두하고 개발되어, Destroy call 요청되어도 실제로는 메모리상에서 유후 상태로 존재합니다. 이로 인해 각 객체들은 Reference type 을 포함할 시, 객체 레벨에서 파괴되었을 때 이를 초기화하여 다음 객체가 정상적으로 활용할 수 있도록 하여야 할 것 입니다. ObjectBase 를 상속받는 모든 객체들은 메모리 풀로 돌아갈 시 ObjectBase.OnReserve 를 수행하며, 실제 메모리에서 제거될 시에는 ObjectBase.OnDestroy 를 수행합니다.

EntityDataBase 를 상속받는 모든 ObjectBase 들에 대해, 만약 데이터 컴포넌트(IEntityComponent 를 참조하세요)를 가지고 있다면, 파괴하기전에 이를 수동으로 제거하거나 INotifyComponent<T> 를 통해 해당 Entity 가 컴포넌트를 가지고 있음을 선언하여야합니다. 모든 컴포넌트들이 제거되지 않고 Destroy call 요청을 할시에는 에러를 반환합니다.

Examples

EntitySystem 으로 Entity 를 생성하는 가장 쉬운 방법은 Hash 를 이용하는 것 입니다. EntityWindow 에서 생성된 모든 Entity 들은 각자의 고유 Hash 를 발급받으며, 이 Hash 값을 통해 Raw 데이터 값을 Code-level 에서 접근하여 수정하거나 생성할 수 있습니다.

// 아래는 3971879049288062714 Hash 값을 가진 DataObjectBase 를
// 생성하는 방법에 대해 설명합니다.

public void CreateDataObject()
{
    // 기존에 그룹을 지정하지 않고 시스템을 호출하는 방법은
    // 퇴역되었습니다. 이제는 각 시스템이 위치한 그룹도 지정하여
    // 시스템을 받아올 수 있도록 하여야합니다.
    EntitySystem system = PresentationSystem<DefaultPresentationGroup, EntitySystem>.System;
    
    // 생성할 레퍼런스를 먼저 생성합니다.
    Reference temp = new Reference(3971879049288062714);
    // 생성한 레퍼런스를 통해 인스턴스를 생성요청합니다.
    Instance ins = system.CreateInstance(temp);
}

각 Entity 들에 맞는 메소드를 호출하여 불필요한 연산 작업을 줄이도록 설계하였습니다. 예를 들어, DataObjectBase 를 상속받는 Entity 는 Attribute 가 없는 Entity 이므로 생성 가능 여부 체크도 필요 없을 것 입니다. EntityDataBaseProxyTransform 이 필요없는 Entity 이므로 해당 생성 체크도 필요 없을 것 입니다.

이러한 불필요한 Overhead 를 줄이기 위해 각 Entity 들은 각자의 고유 메소드를 통해 생성되어야 합니다. DataObjectBase 를 상속받는 Entity 는 CreateInstance, EntityDataBase 를 상속받고 ProxyTransform 이 필요없는 Entity는 CreateObject, 마지막으로 ProxyTransformAttributeBase 를 상속받는 EntityBase 는 CreateEntity 를 통해 생성될 수 있습니다. Editor-level 에서는 CreateInstance 가 각 생성 가능 체크를 통해 각자의 고유 메소드로 연결해주나, 이는 Build 에서 포함되지 않는 기능이므로 알맞게 배치하여야 할 것 입니다.

AttributeBase 를 상속받는 모든 어트리뷰트는 인스턴스를 사용자가 임의로 생성할 수 없습니다. EntityDataBase 를 상속받는 Entity 가 AttributeBase 들을 참조한다면 자동으로 생성되어 할당됩니다.


Public Methods

Name Description
CreateEntity(in string, in float3) 해당 이름을 가진 EntityBase (이름은 ObjectBase.Name 입니다) 의 인스턴트를 해당 월드 좌표에 생성합니다.
CreateEntity(in Hash, in float3) 해당 Hash 값의 EntityBase 의 인스턴트를 해당 월드 좌표에 생성합니다. HashReference 값으로 대체할 수 있습니다.
CreateEntity(in string, in float3, in quaternion, in float3) 해당 이름을 가진 EntityBase (이름은 ObjectBase.Name 입니다) 의 인스턴트를 해당 월드 좌표에 생성합니다.
CreateEntity(in Hash, in float3, in quaternion, in float3) 해당 Hash 값의 EntityBase 를 해당 월드 좌표에 생성합니다. HashReference 값으로 대체할 수 있습니다.
CreateObject(Hash) 해당 Hash 값의 EntityDataBase 의 인스턴트를 생성합니다. HashReference 값으로 대체할 수 있습니다.
CreateObject(string) 해당 이름을 가진 EntityDataBase (이름은 ObjectBase.Name 입니다) 의 인스턴트를 생성합니다. HashReference 값으로 대체할 수 있습니다.
CreateInstance<T>(Reference<T>)
CreateInstance<T>(IFixedReference<T>)
CreateInstance(Reference)
CreateInstance(IFixedReference)
CreateInstance<T>(IObject)
CreateInstance(IObject)
Convert(UnityEngine.GameObject) 이미 생성된 UnityEngine.GameObject 를 EntitySystem 으로 편입시켜 ConvertedEntity 로 변환하여 반환합니다.
DestroyEntity(Entity<IEntity>) 해당 Entity 를 즉시 파괴합니다.
DestroyEntity(EntityData<IEntityData>) 해당 Entity 를 즉시 파괴합니다.
- Interfaces
- Enums
- Attributes
- Abstract Classes
- Classes
- Structs
- Exceptions

- Syadeu.Presentation
- Syadeu.Collections
- Syadeu.Collections.Converters
- Syadeu.Collections.Proxy
- Syadeu.Presentation.Proxy
- Syadeu.Presentation.Internal
- Syadeu.Presentation.Entities
- Syadeu.Presentation.Attributes
- Syadeu.Presentation.Components
- Syadeu.Presentation.Actions
- Syadeu.Presentation.Render
  • CameraData
  • CameraFrustum
  • IntersectionType
  • RenderSystem
  • WorldCanvasSystem
- Syadeu.Presentation.Data
  • DataContainerSystem
  • DataObjectBase
  • EntityAnimationClipEventData
- Syadeu.Presentation.Events

Clone this wiki locally