S&box Wiki

GameObjects

GameObjects

GameObjects are the fundamental building blocks of a scene. A GameObject can have Components which can provide a wide variety of functionality.

Transform

You can manipulate a GameObject through code, including its Transform. A GameObject's Transform is held relative to its parent.

// Set world position GameObject.Transform.Position = new Vector3( 100, 100, 100 ); // Set position relative to parent GameObject.Transform.LocalPosition = new Vector3( 100, 100, 100 ); // Set world transform GameObject.Transform.World = new Transform( Vector3.Zero, new Angles( 90, 90, 180 ), 2.0f )

Tags

GameObjects have tags, which can be used a variety of ways. Some common usages include only returning GameObjects from a trace that include or omit certain tags, or determining what objects you want a specific camera to render.

GameObject.Tags.Add( "player" ); // Only trace against GameObjects that include the player tag var tr = Scene.Trace.Ray( myRay, 64f ).WithTag( "player" ).Run();

You can add/remove tags in the Editor at the top of the Inspector for that GameObject. To add a new tag, click the tag+ icon and then pick an existing one or type the name of a new tag and hit Enter.

image.png

Directory

If you want to find a GameObject in your scene by name or Guid, you can use Scene.Directory. You can also query Scene.GetAllObjects( bool enabled ). These are expensive, so you shouldn't do it all the time (such as in OnUpdate).

var go1 = Scene.Directory.FindByName( "my_go" ); var go2 = Scene.Directory.FindByGuid( "9bb977ad-5e74-4915-9ef7-c0249ec396d2" ); var go3 = Scene.GetAllObjects( true ).Where( go => go.Tags.Has( "player" ) );

As a Property

Sometimes, a Component may need a reference to a particular GameObject in your scene. You can set it as a property, and then reference it without having to iterate through all GameObjects in the scene to find it.

public sealed class MyComponent : Component { [Property] public GameObject Body { get; set; } protected override void OnStart() { var bodyClone = Body.Clone(); bodyClone.Transform.Position = new Vector3( 100f, 100f, 100f ); } }