마인크래프트/엔티티

엔티티(Entity)는 마인크래프트에서 월드 내를 자유롭게 움직일 수 있는 동적 객체를 총칭하는 개념이다. 플레이어, 몹, 드롭된 아이템, 발사체, 보트와 마인카트 같은 탈것 등이 모두 엔티티에 해당한다. 블록과 달리 엔티티는 물리 법칙의 영향을 받으며, 좌표계의 어느 위치에나 존재할 수 있고, 대부분 플레이어나 다른 엔티티와 상호작용할 수 있다.

엔티티는 마인크래프트 게임플레이의 핵심 요소 중 하나다. 고정된 블록 세계에 생명과 움직임을 불어넣는 것이 바로 엔티티이며, 이들 없이는 마인크래프트가 단순한 블록 쌓기 게임에 머물렀을 것이다. 각 엔티티는 고유한 UUID를 가지고 있어 게임 내에서 개별적으로 추적되고 관리된다.

엔티티의 특성

물리적 특성

모든 엔티티는 위치, 속도, 회전 값을 가지고 있다. 위치는 실수 좌표로 표현되어 블록 격자에 구애받지 않고 부드러운 움직임이 가능하다. 대부분의 엔티티는 중력의 영향을 받아 아래로 떨어지며, 블록과 충돌하면 멈춘다. 일부 엔티티는 물이나 용암에서 뜨거나 가라앉는 특성을 가지고 있다.

엔티티는 히트박스를 가지고 있어 다른 엔티티나 블록과의 충돌을 감지한다. 히트박스의 크기는 엔티티마다 다르며, F3+B를 눌러 시각적으로 확인할 수 있다. 예를 들어 엔더맨은 3블록 높이의 히트박스를 가지고 있어 2블록 높이의 공간을 통과할 수 없다.

틱 처리

엔티티는 매 게임 틱(1/20초)마다 업데이트된다. 이 과정에서 위치 이동, AI 처리, 상태 변화 등이 일어난다. 엔티티가 많을수록 서버나 클라이언트의 부담이 커지므로, 마인크래프트는 다양한 최적화 기법을 사용한다. 플레이어로부터 멀리 떨어진 엔티티는 처리 빈도가 줄어들거나 아예 정지 상태가 된다.

엔티티의 분류

몹 (Mob)

몹은 생명력을 가진 생물형 엔티티로, 마인크래프트에서 가장 복잡한 엔티티 유형이다. 플레이어를 제외한 모든 살아있는 생물이 여기에 속한다. 몹은 다시 여러 하위 카테고리로 나뉜다.

수동적 몹은 플레이어를 공격하지 않는 평화로운 생물들이다. 소, 돼지, 닭, 양 같은 가축들이 대표적이며, 이들은 번식이 가능하고 각각 고유한 드롭 아이템을 제공한다. 대부분 밝은 곳에서 자연 스폰되며, 풀이 있는 블록 위에서 생성되는 경향이 있다.

적대적 몹은 플레이어를 발견하면 공격하는 몹들이다. 좀비, 스켈레톤, 크리퍼 등이 여기에 속하며, 주로 어두운 곳에서 스폰된다. 각각 고유한 공격 패턴과 행동 양식을 가지고 있어, 플레이어는 이를 파악하고 대응해야 한다.

중립적 몹은 평소에는 공격하지 않지만, 특정 조건이 충족되면 적대적으로 변한다. 늑대는 공격받으면 반격하고, 좀비화 피글린은 근처의 동료가 공격받으면 집단으로 플레이어를 공격한다. 엔더맨은 플레이어가 직접 바라보면 적대적이 된다.

발사체

화살, 눈덩이, 엔더 진주, 화염구 등 발사되어 날아가는 엔티티들이다. 이들은 포물선을 그리며 날아가고, 목표물에 명중하거나 최대 사거리에 도달하면 사라진다. 대부분의 발사체는 엔티티나 블록과 충돌하면 특정 효과를 일으킨다. 화살은 데미지를 주고, 엔더 진주는 던진 플레이어를 순간이동시킨다.

아이템

드롭된 아이템도 엔티티의 한 종류다. 블록이 파괴되거나 몹이 죽을 때, 또는 플레이어가 아이템을 버릴 때 생성된다. 아이템 엔티티는 5분 동안 존재하다가 사라지며, 용암이나 선인장 같은 위험 요소에 닿으면 즉시 소멸한다. 여러 개의 같은 아이템이 가까이 있으면 자동으로 합쳐져 하나의 스택을 이룬다.

탈것

보트, 마인카트, 말, 라마 등 플레이어가 탑승할 수 있는 엔티티들이다. 각각 고유한 이동 메커니즘을 가지고 있으며, 일부는 아이템을 운반하거나 여러 엔티티를 연결할 수 있다. 보트는 물 위에서 빠른 이동을 가능하게 하고, 마인카트는 레일 위에서 자동화된 운송 시스템을 구축할 수 있게 한다.

기타 엔티티

위 분류에 속하지 않는 다양한 엔티티들이 존재한다. TNT는 점화되면 엔티티가 되어 폭발까지의 카운트다운을 시작한다. 낙하 중인 블록(모래, 자갈 등)도 엔티티 상태가 된다. 그림과 아이템 액자는 벽에 부착되어 있지만 엔티티로 분류되며, 갑옷 거치대는 장비를 전시할 수 있는 특수한 엔티티다.

엔티티 ID와 NBT

모든 엔티티는 고유한 타입 ID를 가지고 있다. 예를 들어 좀비는 `minecraft:zombie`, 크리퍼는 `minecraft:creeper`라는 ID를 가진다. 이 ID는 명령어에서 특정 타입의 엔티티를 지정할 때 사용된다.

엔티티의 모든 데이터는 NBT(Named Binary Tag) 형식으로 저장된다. 여기에는 위치, 체력, 장비, AI 목표 등 엔티티의 모든 속성이 포함된다. 명령어를 통해 이러한 NBT 데이터를 읽거나 수정할 수 있어, 매우 정교한 엔티티 조작이 가능하다.

/summon zombie ~ ~ ~ {Health:100.0f,IsBaby:1b,HandItems:[{id:"minecraft:diamond_sword",Count:1b},{}]}

이 명령어는 체력이 100이고 다이아몬드 검을 든 아기 좀비를 소환한다.

엔티티 관리

스폰 규칙

엔티티의 자연 스폰은 복잡한 규칙을 따른다. 적대적 몹은 빛 레벨 0에서만 스폰되며, 플레이어로부터 24블록 이상 128블록 이내의 거리에서 생성된다. 수동적 몹은 밝은 곳의 풀 블록 위에서 스폰되지만, 새로운 스폰은 매우 드물다. 각 몹은 스폰 가능한 바이옴이 정해져 있으며, 일부는 특정 구조물에서만 나타난다.

디스폰

엔티티는 특정 조건에서 사라진다. 적대적 몹은 플레이어로부터 128블록 이상 떨어지면 즉시 디스폰되고, 32블록 이상 떨어져 있으면 무작위로 디스폰될 가능성이 있다. 반면 이름표가 붙은 몹이나 플레이어가 상호작용한 몹은 디스폰되지 않는다. 수동적 몹은 기본적으로 디스폰되지 않지만, 특정 조건에서는 제거될 수 있다.

엔티티 제한

너무 많은 엔티티는 게임 성능을 크게 저하시킨다. 마인크래프트는 이를 방지하기 위해 여러 제한을 둔다. 청크당 스폰될 수 있는 몹의 수가 제한되어 있고, 전체 월드의 몹 수도 상한선이 있다. 많은 서버에서는 추가적인 엔티티 제한을 설정하여 안정성을 확보한다.

명령어와 엔티티

마인크래프트는 엔티티를 다루는 강력한 명령어들을 제공한다. `/summon`으로 엔티티를 생성하고, `/kill`로 제거하며, `/tp`로 이동시킬 수 있다. `/data`와 `/execute` 명령어를 조합하면 매우 복잡한 엔티티 조작도 가능하다.

타겟 셀렉터를 사용하면 특정 조건의 엔티티를 선택할 수 있다. `@e[type=zombie,distance=..10]`은 10블록 이내의 모든 좀비를 선택한다. 이러한 셀렉터는 NBT 조건, 점수판 값, 태그 등 다양한 필터를 지원한다.

기술적 측면

엔티티 틱

엔티티는 서버의 주요 부하 요인 중 하나다. 각 엔티티는 매 틱마다 위치 계산, 충돌 감지, AI 처리 등을 수행해야 한다. 특히 복잡한 AI를 가진 몹이나 많은 수의 아이템 엔티티는 서버 TPS(Ticks Per Second)를 크게 떨어뜨릴 수 있다.

최적화된 서버들은 엔티티 활성화 범위를 조정하여 성능을 개선한다. 플레이어로부터 멀리 떨어진 엔티티의 AI를 비활성화하거나, 업데이트 빈도를 줄이는 방식이다. Paper 같은 서버 소프트웨어는 이러한 최적화 옵션을 세밀하게 조정할 수 있게 한다.

클라이언트-서버 동기화

멀티플레이어 환경에서 엔티티 동기화는 중요한 과제다. 서버는 엔티티의 위치와 상태를 지속적으로 클라이언트에 전송해야 하며, 네트워크 지연으로 인한 불일치를 보정해야 한다. 이 과정에서 가끔 엔티티가 순간이동하거나 떨리는 현상이 발생할 수 있다.