> For the complete documentation index, see [llms.txt](https://santutu.gitbook.io/rts-selection-system/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://santutu.gitbook.io/rts-selection-system/integration/iselectable-implementation-example.md).

# ISelectable Implementation Example

This implementation demonstrates:

* Selection priority system based on ownership and object type (unit, structure)
* Ordering system for selection groups
* Local player objects are prioritized over other objects
* Units are prioritized over structures
* Objects are ordered within their groups based on type and ID
* Multi-selection and grouping restrictions based on ownership
* Integration with Unity's component system

This sample file can be found at the following path

```
Assets\Santutu\RTS\Selectables\SimpleRealWorldSamples\SelectableRealWorldSample.cs
```

And you can play the demo.

```
Assets\Santutu\RTS\Selectables\SimpleRealWorldSamples\Scenes\Demo.scene
```

Here is preview.  You can customize it to fit your project.

```csharp
class SelectableRealWorldSample : MonoBehaviour, ISelectable
{
   
    [field: SerializeField] public ObjectData Data { get; private set; }
    [field: SerializeField] public Forceable Forceable { get; private set; }

    [field: SerializeField] public bool CanBeSelected { get; private set; } = true;

    [field: SerializeField] public UnityEvent<bool> OnSelectChanged { get; private set; } = new();
    [field: SerializeField] public UnityEvent<bool> OnHoverChanged { get; private set; } = new();

    public bool IsLocalPlayer => Forceable.forceId == Forceable.LocalPlayerId;

    public Sprite Icon => Data.icon;

    // Primary selection priority
    // Returns 0 for local player objects, 1 for others
    // Used to prioritize selecting player's own units first
    public int SelectionPriority1
    {
        get
        {
            if (IsLocalPlayer) return 0;
            return 1;
        }
    }

    // Secondary selection priority
    // Prioritizes units (0) over structures (1) and other types (2)
    public int SelectionPriority2
    {
        get
        {
            if (Data.type == ObjectType.Unit) return 0;
            else if (Data.type == ObjectType.Structure) return 1;
            return 2;
        }
    }

    // Tertiary selection priority
    // For units, returns 0
    // For other types, uses the Order value
    public int SelectionPriority3
    {
        get
        {
            if (Data.type == ObjectType.Unit) return 0;
            return Order;
        }
    }

    // Determines the ordering within selection groups
    // Units get a higher base order (10000 + ID)
    // Other types just use their ID
    public int Order
    {
        get
        {
            int order = 0;
            if (Data.type == ObjectType.Unit)
            {
                order += 10000;
            }
            order += Data.id;
            return order;
        }
    }

    // SubGroupId uses the object's ID for grouping related selectables
    public int SubGroupId => Data.id;

    // Only local player objects can be multi-selected
    public bool CanBeMultiSelected => IsLocalPlayer;
    
    // Only local player objects can be grouped
    public bool CanBeGrouped => IsLocalPlayer;

  
}
```
