50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Markdown
		
	
	
---
 | 
						|
title: "Component"
 | 
						|
date: 2019-05-22T12:51:29-07:00
 | 
						|
weight: 5
 | 
						|
---
 | 
						|
 | 
						|
A Component is a structure of related data.
 | 
						|
 | 
						|
To define a Component, declare a struct which implements the **IComponent** interface.
 | 
						|
 | 
						|
```cs
 | 
						|
using Encompass;
 | 
						|
using System.Numerics;
 | 
						|
 | 
						|
public struct VelocityComponent : IComponent {
 | 
						|
 | 
						|
    public Vector2 Velocity { get; }
 | 
						|
 | 
						|
    public VelocityComponent(Vector2 velocity)
 | 
						|
    {
 | 
						|
        Velocity = velocity;
 | 
						|
    }
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
Components are attached to Entities with the **SetComponent** method.
 | 
						|
 | 
						|
```cs
 | 
						|
using Encompass;
 | 
						|
 | 
						|
...
 | 
						|
 | 
						|
var worldBuilder = new WorldBuilder();
 | 
						|
var entity = worldBuilder.CreateEntity();
 | 
						|
worldBuilder.SetComponent(entity, new VelocityComponent(Vector2.One));
 | 
						|
```
 | 
						|
 | 
						|
**SetComponent** can also be used from within an **Engine**. We will talk more about this later.
 | 
						|
 | 
						|
Components are always structs, meaning they follow value-type semantics. If you are used to working with classes you might find this confusing.
 | 
						|
One major point of difference is that value types are _copied_ rather that passed by reference by default.
 | 
						|
 | 
						|
You can read more about value types here: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/value-types
 | 
						|
 | 
						|
If you use them idiomatically, you don't have to worry about them creating garbage collection pressure, so this is a big win for performance when working in C#.
 | 
						|
 | 
						|
{{% notice warning %}}
 | 
						|
Components should **never** reference other Components directly. This breaks the principle of loose coupling. You **will** regret it if you do this.
 | 
						|
{{% /notice %}}
 |