Revision Difference
Entity_Components#560145
<cat>Code.Entity</cat>⤶
<title>Entity Components</title>⤶
⤶
Entities can have components, which are code classes that can be attached and detached from Entities via code during gameplay. Because Entity Components are open-ended, they can be used for almost anything from giving players power-ups, to handling advanced NPC AI behaviors. ⤶
⤶
Entity Components are also networked, so they will be available on both the client and server once added to an Entity.⤶
⤶
Many other game engines use a component model similar to this, including Unity and Unreal.⤶
⤶
# Defining Components⤶
⤶
```csharp⤶
public partial class MyComponent : EntityComponent⤶
{⤶
[Net] public string MyVariable { get; set; }⤶
⤶
// Components also support [Predicted]⤶
[Net, Predicted] public int MyPredictedVariable { get; set; }⤶
}⤶
⤶
```⤶
⤶
Components can also have [Events](EventSystem).⤶
```⤶
public partial class FlyingComponent : EntityComponent⤶
{⤶
[GameEvent.Tick]⤶
public void OnTick()⤶
{⤶
Entity.Velocity += Vector3.Up * 16.0f;⤶
}⤶
}⤶
```⤶
⤶
# Creating Components⤶
⤶
You can create, get and remove components from an Entity at any time, in this example we simply assign them on Spawn.⤶
⤶
```csharp⤶
public partial class MyEntity : Entity⤶
{⤶
public override void Spawn()⤶
{⤶
var c = Components.Create<MyComponent>();⤶
var c = Components.GetOrCreate<MyComponent>();⤶
var c = Components.Get<MyComponent>();⤶
⤶
var c = new MyComponent();⤶
Components.Add( c );⤶
⤶
Components.Remove( c );⤶
Components.RemoveAll();⤶
⤶
foreach ( var c in Components.GetAll<MyComponent>() )⤶
{⤶
⤶
}⤶
⤶
foreach ( var c in Components.GetAll<EntityComponent>() )⤶
{⤶
⤶
}⤶
}⤶
}⤶
```⤶
⤶
# Binding Components⤶
If you need to frequently access a component and want a reference that is networked between server and client, you can set up the component as a property with the `BindComponent` attribute.⤶
⤶
```csharp⤶
public partial class MyEntity : Entity⤶
{⤶
[BindComponent] public MyComponent Component { get; }⤶
⤶
public override void Spawn()⤶
{⤶
Components.Create<MyComponent>();⤶
base.Spawn();⤶
}⤶
}⤶
```⤶
⤶
Component will now refer to the same networked component on both client and server.⤶
* Note that you still need to create the component, and you should do so only from the server. ⤶
* You also do not need to assign the component to the property, which should have no setter.⤶
⤶
### Footnotes⤶
⤶
* Clients are also entities and can have components on Client.Components<cat>removed</cat>