RoadObject.cs
public sealed class RoadObject : Component
{
	public GameObject CreatedObject;
	public GameObject Clone;
	public bool IsVisible = true;

	protected override void OnStart()
	{
		CreateObject();
	}

	public void CreateObject()
	{
		CreatedObject?.Destroy();
		Clone?.Destroy();

		var randomObject = Game.Random.FromList( ChristmassyGameLogic.Instance.AllRoadObjects );
		CreatedObject = SceneUtility.GetPrefabScene( randomObject ).Clone();
		CreatedObject.SetParent( GameObject );
		CreatedObject.WorldTransform = WorldTransform;

		Clone = CreatedObject.Clone();
		Clone.SetParent( ChristmassyGameLogic.Instance.MapClone );
		Clone.LocalTransform = LocalTransform;
		Clone.GetComponent<Collider>()?.Destroy();
	}

	TimeUntil _nextCheck;

	protected override void OnFixedUpdate()
	{
		if ( _nextCheck )
		{
			if ( Vector3.Dot( WorldRotation.Up, Vector3.Backward ) >= 0.5f )
			{
				if ( IsVisible )
				{
					IsVisible = false;
					CreatedObject?.Destroy();
				}
			}

			if ( Vector3.Dot( WorldRotation.Up, Vector3.Down ) <= 1f )
			{
				if ( !IsVisible )
				{
					IsVisible = true;
					CreateObject();
				}
			}

			_nextCheck = 0.5f + Game.Random.Float( 0.5f );
		}
	}

	protected override void OnDestroy()
	{
		CreatedObject?.Destroy();
		Clone?.Destroy();
	}
}