Rendering Spec · Rev. 2026

Visibility System

Entity 사이의 연결 가능성을 평가하고, Floor 표면에 보이는 영역을 Pheromone으로 맵핑하는 시스템. World System 하위에서 동작합니다.

Visibility Check Visibility Mapping Capsule Casting Pheromone Mapping Event 발행 Read-only Query
2Schedules
3Events
6Query 오버로드
scroll
01
개요
Overview

Visibility System은 World System에서 각 entity 사이에서 연결 가능성 평가와 Floor 표면에 보이는 영역을 맵핑하기 위한 계산을 실행하는 시스템입니다.

Pawn ↔ Pawn Pawn ↔ Block Block ↔ Block Pawn → Floor Block → Floor
02
Schedules
실행 스케줄

Visibility System은 크게 두 가지 책임을 갖습니다.

02-A
Visibility Check
// entity ↔ entity
// 서로 보이는지 판정
02-B
Visibility Mapping
// entity → Floor
// Pheromone 마킹
02-A
Visibility Check
Entity 간 가시성 확인

Pawn ↔ Pawn, Pawn ↔ Block, Block ↔ Block 사이에 서로 보이는지 여부를 확인하고 업데이트합니다.

확인 기준은 center of mass에서 center of mass로 capsule casting하고, 중간에 타겟이 아닌 다른 Entity 또는 Floor, Wall 등으로 막히면 실패합니다.

확인 결과를 어떻게 사용하는지는 Visibility System에서는 더 이상 관여하지 않습니다.

Cast 방향
src.centerOfMass
     dst.centerOfMass
// capsule cast
실패 조건
// 차단 대상
Entity (non-target)
Floor
Wall
결과 데이터의 소비는 시스템 외부 책임입니다. Visibility System은 판정 및 이벤트 발행까지만 담당합니다.
02-B
Visibility Mapping
Floor 가시 영역 맵핑

Pawn → Floor, Block → Floor 방향으로 마찬가지로 capsule casting 합니다. 보이는 Floor 표면에 Pheromone을 남깁니다.

남겨진 Pheromone을 어떻게 사용하는지는 Visibility System에서는 더 이상 관여하지 않습니다.

Cast 방향
Pawn   Floor
Block  Floor
// capsule cast
결과
// 보이는 Floor에
Pheromone.mark(floor)
// 소비 책임은 외부
03
Center of Mass
Shape별 질량 중심 정의

Shape에 따라 center of mass는 결정적으로 정해집니다.

Sphere
// center가 곧 CoM
CoM = center
Capsule
// 두 끝점의 중점
CoM = (a + b)
    * 0.5f
Cube
// center가 곧 CoM
CoM = center
04
Events
발행 이벤트

Visibility System이 실제로 발행하는 이벤트입니다. 모두 Check schedule에서 발행됩니다.

EnterVisible
이전 프레임까지 보이지 않던 엔티티가 처음으로 보이도록 판정 받았을 때 발행됩니다.
StayVisible
이전 프레임과 무관하게, 현재 프레임에서 보이고 있을 때 발행됩니다.
ExitVisible
이전 프레임에서는 보였던 엔티티가 처음으로 보이지 않도록 판정 받았을 때 발행됩니다.
05
Query
읽기 전용 쿼리

Visibility System이 제공하는 쿼리입니다. Query는 Visibility System의 상태를 Read 권한으로 읽지만, 상태를 변경하지 않습니다.

IsPawnVisible
bool IsPawnVisible(float3 pos, float radius, Pawn pawn)
월드 공간의 특정 좌표에서 radius만큼의 마진으로 파라미터 pawn을 볼 수 있는지 확인합니다.
bool IsPawnVisible(Pawn viewer, Pawn pawn)
Pawn viewer가 viewer.shape.radius만큼의 마진으로 파라미터 pawn을 볼 수 있는지 확인합니다.
bool IsPawnVisible(Block viewer, Pawn pawn)
Block viewer가 viewer.shape.size * 0.5f만큼의 마진으로 파라미터 pawn을 볼 수 있는지 확인합니다.
IsBlockVisible
bool IsBlockVisible(float3 pos, float radius, Block block)
월드 공간의 특정 좌표에서 radius만큼의 마진으로 파라미터 block을 볼 수 있는지 확인합니다.
bool IsBlockVisible(Pawn viewer, Block block)
Pawn viewer가 viewer.shape.radius만큼의 마진으로 파라미터 block을 볼 수 있는지 확인합니다.
bool IsBlockVisible(Block viewer, Block block)
Block viewer가 viewer.shape.size * 0.5f만큼의 마진으로 파라미터 block을 볼 수 있는지 확인합니다.