Skip to content

Attributes

Carlos Avila edited this page May 9, 2016 · 23 revisions

Overview

The code generator currently supports the following attributes to be used with classes deriving from IComponent :

  • [Pool]: You can use this attribute to make a component be available only in the specified pool(s); e.g., [MyPoolName], [Enemies], [UI], etc. Improves memory footprint.
  • [SingleEntity]: The code generator will provide additional methods to ensure that up to a maximum of one entity with this component exists.
  • [CustomPrefix]: Can be used to support custom prefixes for flag components only.
  • [DontGenerate]: The code generator will not process components with this attribute.

Pool

This is not an attribute you want to use directly. Instead, it's subclassed for you by the code generator for each pool name configured in the Entitas preference window. The resulting subclasses will be added as individual files in your Generated Folder with the format {PoolName}Attribute.cs.

Example

Add some custom pools in the Entitas preference window and click on "Generate":

Entitas.Unity.CodeGenerator

You can now use the newly generated pool attributes in your components:

using Entitas;
using Entitas.CodeGenerator;

[Core, Ui]
public class SceneComponent : IComponent
{
    public Scene Value;
}

[Meta]
public class EditorOnlyVisual : IComponent
{
    public bool ShowInMode;
}

SingleEntity

Add this attribute to components that should not have more than one instance in your application. This is an alternative for cases where you would want to use a singleton. It has the potential to throw an exception if circumvented in such a way that more than one entity with the component is found. It will generate the following additional properties and methods for the component:

  • Pool.{ComponentName}Entity
  • Pool.{ComponentName}.{ComponentProperty} (non-flag components)
  • Pool.Set{ComponentName}({ComponentProperty}) (non-flag components)
  • Pool.Replace{ComponentName}({ComponentProperty}) (non-flag components)
  • Pool.Remove{ComponentName}() (non-flag components)
  • Pool.has{ComponentName}() (non-flag components)

Example

Define your component:

using Entitas;
using Entitas.CodeGenerator;

[Core] // Pool
[SingleEntity]
public class UserComponent : IComponent {
    public string name;
    public int age;
}

You now have the following properties and methods available:

var pool = Pools.core;
var e = pool.userEntity;
var name = pool.user.name;
var has = pool.hasUser;

pool.SetUser("John", 42);
pool.ReplaceUser("Max", 24);
pool.RemoveUser();

CustomPrefix

Works only with components that act as flags. Flag components are empty classes, therefore have no fields and act as a form of boolean flag for entities. If this attribute is used in a component with public fields it will silently fail and no custom prefix will be generated.

Example

Create a flag component:

using Entitas;
using Entitas.CodeGenerator;

[CustomPrefix("flag")]
public class DestroyComponent : IComponent {
}

What the code generator would normally provide without the attribute:

entity.isDestroy = true;

With the [CustomPrefix] attribute:

entity.flagDestroy = true;

DontGenerate

This attribute is self-explanatory, any component with this attribute will be skipped by the code generator.

Example

using Entitas;
using Entitas.CodeGenerator;

[DontGenerate]
public class FutureFeatureComponent : IComponent {
}
Clone this wiki locally