jecs/docs/api/name.md
2025-02-25 05:04:54 +03:00

3.4 KiB

Name Component

The Name component allows you to associate a string identifier with an entity.

Overview

jecs.Name: Entity<string>

The Name component is a built-in component in jecs that stores a string value. It has no special behavior beyond storing a name.

Usage

Setting a Name

local world = jecs.World.new()

-- Create an entity
local entity = world:entity()

-- Assign a name to the entity
world:set(entity, jecs.Name, "Player")

Getting an Entity's Name

-- Retrieve an entity's name
local name = world:get(entity, jecs.Name)
print("Entity name:", name) -- Outputs: "Entity name: Player"

Finding Entities by Name

-- Iterate over all entities with the Name component
for entity, name in world:query(jecs.Name) do
  if name == "Player" then
    -- Found the entity named "Player"
    -- Do something with entity...
  end
end

Using Names with Hierarchies

Names are particularly useful when working with entity hierarchies:

local world = jecs.World.new()
local pair = jecs.pair

-- Create a parent entity with a name
local parent = world:entity()
world:set(parent, jecs.Name, "Parent")

-- Create child entities with names
local child1 = world:entity()
world:set(child1, jecs.Name, "Child1")
world:add(child1, pair(jecs.ChildOf, parent))

local child2 = world:entity()
world:set(child2, jecs.Name, "Child2")
world:add(child2, pair(jecs.ChildOf, parent))

-- Print the hierarchy
print("Parent:", world:get(parent, jecs.Name))
for child in world:query(pair(jecs.ChildOf, parent)) do
  print("  Child:", world:get(child, jecs.Name))
end

-- Output:
-- Parent: Parent
--   Child: Child1
--   Child: Child2

Helper Function

For convenience, you can create a simple helper function to get an entity's name:

local function getName(world, entity)
  return world:get(entity, jecs.Name) or tostring(entity)
end

-- Usage
local name = getName(world, entity)

This function will return the entity's name if it has one, or fall back to the entity ID as a string.

Best Practices

  1. Use Consistently: Apply names to key entities systematically, especially for important game objects.

  2. Be Descriptive: Use meaningful names that describe the entity's role or purpose.

  3. Handle Missing Names: Always check if an entity has a name before trying to use it, or use a helper function like the one above.

  4. Namespacing: Consider using prefixes or namespaces for different systems (e.g., "UI:MainMenu", "Enemy:Boss").

  5. Performance: Remember that adding a Name component to every entity adds memory overhead. Use judiciously in performance-critical applications.

Example: Entity Debugging System

Here's a simple debugging system that uses the Name component:

local function debugEntity(world, entity)
  local name = world:get(entity, jecs.Name) or "Unnamed"
  print("Entity", entity, "(" .. name .. ")")
  
  -- Print all components
  for componentId in world:query(jecs.pair(jecs.Component, jecs.Wildcard)) do
    if world:has(entity, componentId) then
      local componentName = world:get(componentId, jecs.Name) or "Unknown"
      local value = world:get(entity, componentId)
      print("  Component:", componentName, "=", value)
    end
  end
end

-- Usage
debugEntity(world, player)

This debugging function prints an entity's name along with all its components, making it easier to inspect entities during development.