⚓문제
- Creature 객체가 맵 위에 남기는 흔적의 픽셀이 연속되지 않는다.
- uv 좌표상 (0, 0) -> (0, 1) 이 아니라 (0, 2) 같은 형식으로 건너뛰는 상황
- 따라서, (0, 1)에 공백이 생기기 때문에 흔적을 밟았을 때 파괴되는 로직이 실행되지 않을 수 있다.
⚓접근
- Creature는 자신의 위치와 매칭되는 맵의 uv 좌표에 자신의 데이터로 흔적을 남긴다.(예.픽셀 색깔)
- Creature는 Update()에서 매 프레임마다 자신의 위치를 갱신한다.
- Update()는 불규칙한 프레임으로 작동. FixedUpdate()는 일정한 간격으로 호출.
- 두 Update() 함수 모두 프레임 사이에 Creature 객체가 이동하기 때문에 speed가 빠르다면 공백도 커지게 된다.
transform.position += transform.forward * Time.fixedDeltaTime * data.MoveSpeed;
위에서 보듯 MoveSpeed = 1이고 FixedUpdate()일 때 흔적은 0.02 간격으로 새겨진다.
⚓해결
- MoveSpeed = 1로 고정상태고(기획상 모든 유저의 Creature의 속도가 동일하기 때문에)
- 흔적간격 0.02로 일정하기 때문에
- 흔적을 남길 때 어느정도 버퍼를 줘서 주변 픽셀도 점유하도록 한다.
public bool TraceOnLand(Vector3 world, byte creatureId)
{
Vector2 center = WorldToPixelPosition(world);
int centerX = (int)center.x;
int centerY = (int)center.y;
for (int i = centerX - 1; i < centerX + 1; i++)
{
for (int j = centerY - 1; j < centerY + 1; j++)
{
if (i < 0 || i >= TEXTURESIZE || j < 0 || j >= TEXTURESIZE) continue;
Managers.Game.tiles[i, j] = (byte)(creatureId + 10);
land.texture.SetPixel(i, j, Color.red);
}
}
land.texture.Apply();
return true;
}
- (centerX, centerY)를 기준으로 상하좌우에 1픽셀씩 더 점유한다.
⚓결과
- 맵 위에 픽셀을 칠하는 것은 점유된 영역을 가시화하기 위해 임시로 만든 부분
- 실제로 점유된 영역을 관리하는 것은 1024x1024크기의 tiles 2차 배열이다.
⚓ 폐기 이유
Creature가 움직이는 World는 소수점까지 고려하는 정밀도를 가지는데 픽셀단위로 흔적과 영역 데이터를 저장할 경우 실제 데이터와 약간씩 오차가 생겨서 현재 위치의 정보를 잘못 인식할 위험이 있다.
1. 코너를 돌 때 LineRenderer의 범위를 벗어난 픽셀에 흔적 데이터가 찍히는 경우가 생긴다.
2. 곡선으로 이루어진 영역의 경우 픽셀의 계단현상 때문에 실제 영역의 경계와 약간씩 다른 경우가 생긴다.
그리고 GameManager의 배열에 흔적과 영역 데이터를 관리하도록 하면 Creature가 사망하거나 새로운 영역을 갱신할 때 데이터가 Lock이 걸려있지 않기 때문에 잘못 덮어씌워질 수 있다. 그래서 공용 데이터로 관리하는 것보다 흔적과 영역 그 자체로서 역할을 수행하도록 한다.
1. 흔적은 LineRenderer의 Point를 사용해 Ray 감지를 통해 흔적이 밟혔을 경우 해당 객체를 파괴하도록 한다. 마치 꼬리잡기처럼 Creature는 자신의 꼬리가 잡혔을 때 파괴된다는 로직을 가진다.
2. 영역은 Creature가 만든 닫힌 영역에 따라 만든 Mesh를 가진 오브젝트에 콜라이더를 넣어 Area 레이어를 부여한다. 따라서 Creature는 현재 위치에서 Ray 감지를 통해 Area 여부를 확인할 수 있다.
3. 현재 차지한 영역의 크기 비율은 영역 Mesh의 삼각형 넒이를 계산하는 방식으로 해당 Mesh의 넓이를 구할 수 있다. 따라서 전체 맵의 면적에 몇 퍼센트를 차지하는지 구할 수 있다.
'Unity > Paper.io 2' 카테고리의 다른 글
[유니티-Paper.io2] 닫힌 영역에서 메시 생성 (0) | 2024.12.16 |
---|---|
[유니티-Paper.io2] 이동흔적 가시화와 데이터 관리 (1) | 2024.12.15 |