# EntityExtensions

|Class/Struct Info|
|:-------------------------------------------|
|public static class EntityExtensions 实体扩展方法。|

## Method Summary

|Qualifier and Type|Method Name and Description|
|:-----------------|:----------------------------------------------------------------------------------------------------------------------------|
|void|[Add<T1, ...>](#section1031617010220)(this IEntity entity, in T1 comp1, ..., in ITags iTags = default) 批量添加组件和标签，最多支持10个泛型组件。|
|void|[Remove<T1, ...>](#section5899728155713)(this IEntity entity, in ITags iTags = default) 批量移除组件和标签，最多支持10个泛型组件。|
|void|[Set<T1, ...>](#section1264219291571)(this IEntity entity, in T1 comp1, ...) 批量设置组件，最多支持10个泛型组件。|
|bool|[AddComponent<TS>](#section112411921571)(this IEntity entity, in TS sharedComponent = default) 添加共享组件，仅支持一个泛型。|
|bool|[RemoveComponent<TS>](#section77861459195513)(this IEntity entity) 移除共享组件，仅支持一个泛型。|
|bool|[SetSharedComponent<TS>](#section266135310270)(this IEntity entity, in TS sharedComponent) 设置共享组件值，仅支持一个泛型。|
|bool|[HasComponent<TS>](#section12497259172720)(this IEntity entity) 判断实体是否拥有指定共享组件，仅支持一个泛型。|
|ref TS|[GetComponent<TS>](#section93768313285)(this IEntity entity) 获取共享组件，仅支持一个泛型。|
|IEntity|[SetEnable<T1, ...>](#section17560132642915)(this IEntity entity) 启用实体的组件，最多支持10个泛型组件。|
|IEntity|[SetDisable<T1, ...>](#section1391083310296)(this IEntity entity) 禁用实体的组件，最多支持10个泛型组件。|
|bool|[IsEnabled<T1, ...>](#section1666910378299)(this IEntity entity) 判断实体的组件的启用状态，最多支持10个泛型组件。|

## Methods

### Add<T1, ...>

|Method|
|:----------------------------------------------------------------------------------------------------------------------|
|void Add<T1, ...>(this IEntity entity, in T1 comp1, ..., in ITags iTags = default) 批量添加组件和标签，最多支持10个泛型组件。 T为IComponent。|

**Parameters**

|Name|Type|Description|
|:-----|:------|:----------|
|entity|IEntity|作用的实体。|
|comp1|T1|泛型组件，最多10个。|
|iTags|ITags|标签类型集合。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity();
// 添加多个组件和标签，仅进行一次结构性变更，最多支持一次添加10个组件和10个标签
entity.Add(new PgdPosition(), new PgdScale(), new Name("test"), ITags.Get<TestTag, TestTag2>());
```

### Remove<T1, ...>

|Method|
|:-------------------------------------------------------------------------------------------------------|
|void Remove<T1, ...>(this IEntity entity, in ITags iTags = default) 批量移除组件和标签，最多支持10个泛型组件。 T为IComponent。|

**Parameters**

|Name|Type|Description|
|:-----|:------|:----------|
|entity|IEntity|作用的实体。|
|iTags|ITags|标签类型集合。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity(new PgdPosition(), new PgdScale(), new Name("test"), ITags.Get<TestTag, TestTag2>());
// 移除多个组件和标签，仅进行一次结构性变更，最多支持一次移除10个组件和10个标签
entity.Remove(new PgdPosition(), new PgdScale(), new Name("test"), ITags.Get<TestTag, TestTag2>());
```

### Set<T1, ...>

|Method|
|:-----------------------------------------------------------------------------------------|
|void Set<T1, ...>(this IEntity entity, in T1 comp1, ...) 批量设置组件，最多支持10个泛型组件。 T为IComponent。|

**Parameters**

|Name|Type|Description|
|:-----|:------|:----------|
|entity|IEntity|作用的实体。|
|comp1|T1|泛型组件，最多10个。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity(new PgdPosition(), new Name("test")); // 此时实体的PgdPosition组件值为(0,0,0)，Name组件值为"test"
// 设置多个组件值，最多支持一次设置10个组件
entity.Set(new PgdPosition(1,1,1), new Name("set")); // 此时实体的PgdPosition组件值为(1,1,1)，Name组件值为"set"
```

### AddComponent<TS>

|Method|
|:-------------------------------------------------------------------------------------------------------------|
|static bool AddComponent<TS>(this IEntity entity, in TS sharedComponent = default) 添加共享组件，仅支持一个泛型。 TS为IShared。|

**Parameters**

|Name|Type|Description|
|:--------------|:------|:-----------------|
|entity|IEntity|作用的实体。|
|sharedComponent|TS|共享组件。 默认值为default。|

**Return**

|Type|Description|
|:---|:-----------------------------------------------------------|
|bool|* true：实体添加共享组件成功。 * false：实体已经拥有该共享组件。此时会用当前输入的组件值覆盖原来的组件值。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity();
// 添加共享组件，仅支持添加1个共享组件，不输入组件值则为默认值
entity.AddComponent(new SharedComponent());
// 重复添加相同共享组件，返回false，但是新组件值会覆盖旧组件值
entity.AddComponent(new SharedComponent{Value = 1}); // 此时共享组件值为1
```

### RemoveComponent<TS>

|Method|
|:-------------------------------------------------------------------------------|
|static bool RemoveComponent<TS>(this IEntity entity) 移除共享组件，仅支持一个泛型。 TS为IShared。|

**Parameters**

|Name|Type|Description|
|:-----|:------|:----------|
|entity|IEntity|作用的实体。|

**Return**

|Type|Description|
|:---|:-------------------------------------|
|bool|* true：实体移除共享组件成功。 * false：实体未拥有该共享组件。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity();
entity.AddComponent(new SharedComponent());
// 移除共享组件，仅支持移除1个共享组件
entity.RemoveComponent<SharedComponent>();
// 移除没有的共享组件，返回false
entity.RemoveComponent<SharedComponent>();
```

### SetSharedComponent<TS>

|Method|
|:----------------------------------------------------------------------------------------------------------|
|static bool SetSharedComponent<TS>(this IEntity entity, in TS sharedComponent) 设置共享组件值，仅支持一个泛型。 TS为IShared。|

**Parameters**

|Name|Type|Description|
|:--------------|:------|:----------|
|entity|IEntity|作用的实体。|
|sharedComponent|TS|共享组件。|

**Return**

|Type|Description|
|:---|:--------------------------------------|
|bool|* true：实体设置共享组件值成功。 * false：实体未拥有该共享组件。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity();
entity.AddComponent(new SharedComponent());
// 设置共享组件，仅支持设置1个共享组件
entity.SetSharedComponent(new SharedComponent{Value = 1}); // 此时共享组件值为1
// 设置没有的共享组件，返回false
entity.SetSharedComponent(new SharedComponent2{Value = 1});
```

### HasComponent<TS>

|Method|
|:------------------------------------------------------------------------------------|
|static bool HasComponent<TS>(this IEntity entity) 判断实体是否拥有指定共享组件，仅支持一个泛型。 TS为IShared。|

**Parameters**

|Name|Type|Description|
|:-----|:------|:----------|
|entity|IEntity|作用的实体。|

**Return**

|Type|Description|
|:---|:------------------------------------|
|bool|* true：实体拥有该共享组件。 * false：实体未拥有该共享组件。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity();
entity.AddComponent(new SharedComponent());
// 判断实体是否有共享组件
entity.HasComponent<SharedComponent>();
entity.HasComponent<SharedComponent2>();
```

### GetComponent<TS>

|Method|
|:------------------------------------------------------------------------------|
|static ref TS GetComponent<TS>(this IEntity entity) 获取共享组件，仅支持一个泛型。 TS为IShared。|

**Parameters**

|Name|Type|Description|
|:-----|:------|:----------|
|entity|IEntity|作用的实体。|

**Return**

|Type|Description|
|:-----|:----------|
|ref TS|获取的共享组件引用。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity();
entity.AddComponent(new SharedComponent());
// 获取共享组件引用，可直接修改组件值
entity.GetComponent<SharedComponent>().Value = 1;  // 此时共享组件值为1
```

### SetEnable<T1, ...>

|Method|
|:----------------------------------------------------------------------------------------|
|static IEntity SetEnable<T1, ...>(this IEntity entity) 启用实体的组件，最多支持10个泛型组件。 T为IComponent。|

**Parameters**

|Name|Type|Description|
|:-----|:------|:----------|
|entity|IEntity|作用的实体。|

**Return**

|Type|Description|
|:------|:----------|
|IEntity|实体。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity(new PgdPosition());
// 启用组件，最多支持一次启用10个组件。组件默认为启用，重复启用等于无效操作。支持链式调用
entity.SetEnable<PgdPosition>();
```

### SetDisable<T1, ...>

|Method|
|:-----------------------------------------------------------------------------------------|
|static IEntity SetDisable<T1, ...>(this IEntity entity) 禁用实体的组件，最多支持10个泛型组件。 T为IComponent。|

**Parameters**

|Name|Type|Description|
|:-----|:------|:----------|
|entity|IEntity|作用的实体。|

**Return**

|Type|Description|
|:------|:----------|
|IEntity|实体。|

**Sample Code**

```screen
var world = new IECSWorld();
// 禁用组件
var entity = world.CreateEntity(new PgdPosition()).SetDisable<PgdPosition>();
```

### IsEnabled<T1, ...>

|Method|
|:---------------------------------------------------------------------------------------------------------------------|
|static bool IsEnabled<T1, ...>(this IEntity entity) 判断实体的组件的启用状态，最多支持10个泛型组件，输入复数种组件时，需要全部为启用状态才会返回true。 T为IComponent。|

**Parameters**

|Name|Type|Description|
|:-----|:------|:----------|
|entity|IEntity|作用的实体。|

**Return**

|Type|Description|
|:---|:----------------------------------------------------------------|
|bool|* true：当实体拥有所有指定组件，且这些组件均启用时。 * false：实体未拥有其中任意组件，或实体的任意指定组件未启用时。|

**Sample Code**

```screen
var world = new IECSWorld();
var entity = world.CreateEntity(new PgdPosition());
// 判断组件启用状态
entity.IsEnabled<PgdPosition>(); // true
entity.SetDisable<PgdPosition>();
entity.IsEnabled<PgdPosition>(); // false
```

