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을 볼 수 있는지 확인합니다.