Revision Difference
Components#563000
<cat>Code.Game</cat>
<title>Components</title>
# Components
Components are bits of functionality you can add to [GameObjects](https://wiki.facepunch.com/sbox/GameObjects). You can create a component to do anything you wish. There are also numerous components that exist in the s&box engine by default. You can find a list of example components within the [sbox-scenestaging repo](https://github.com/Facepunch/sbox-scenestaging/tree/main/code/ExampleComponents) on Facepunch's GitHub.
## Properties
An attribute `[Property]` can be added to a [property member](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties) on your component class, which allows you to slot in information about the property outside of code. This allows your component to be more re-usable.
```cs
public sealed class Health : Component
{
// MaxHealth can be changed within the editor now, but defaults to 100f.
[Property] public float MaxHealth { get; set; } = 100f;
public float CurrentHealth { get; set; }
protected override void OnStart()
{
// Set current health to max health when this component starts up
CurrentHealth = MaxHealth;
}
}
```
See the [Attributes and Component Properties](https://wiki.facepunch.com/sbox/Property) page for more info and examples.
## Methods
There are a number of methods you can override when making your own component. You can find a full list [here](https://docs.facepunch.com/s/sbox-dev/doc/component-methods-OCvoNh8ByW). Below is an example of overriding a method.
```cs
public sealed class MyComponent : Component
{
// OnUpdate is called every frame
protected override void OnUpdate()
{
Transform.LocalRotation = Rotation.Random;
LocalRotation = Rotation.Random;
}
}
```
## Enabling and Disabling
You can enable or disable a component through code. When a component is disabled, methods like OnUpdate, OnFixedUpdate, and more are skipped. Whenever you enable a component, OnStart and OnEnabled will be called (in that order). Disabling a component calls OnDisabled.
```cs
var comp = Components.Get<Health>();
if ( comp.CurrentHealth <= 0 )
{
// Will trigger OnDisabled on Health
comp.Enabled = false;
}
```
## Managing a Component on a GameObject
Most often, you will want to add components to a GameObject outside of the codebase (through the scene editor). But sometimes, there are cases you want to add to or remove from a GameObject directly.
```cs
// Gets Health, or creates it if it does not exist.
var comp = Components.GetOrCreate<Health>();
```
From within a component, many properties of a GameObject (such as Transform, Components, Scene, etc) are exposed for you for convenience.
```cs
public sealed class MyComponent : Component
{
protected override void OnStart()
{
// Changing the Transform on a Component simply adjusts the Transform of the GameObject.
Transform.Position = new Vector3( 10f, 0f, 10f );
WorldPosition = new Vector3( 10f, 0f, 10f );
if ( Components.TryGet( out Health health, FindMode.EnabledInSelfAndChildren ) )
health.Destroy();
}
}
```