어제 진짜 TileManager가 끝난줄 알았다.
그래서 오늘 오전에 내가 앞으로 해야할일 정리와 당장 해야할일, 그리고 당장 1주일동안의 계획을 자세하게 분류하고 있었는데... 끝이 아니었다. 근데 앞으로 진짜 끝은 프로젝트가 끝나기 전까진 없을듯 하다. 왜냐? 계속 수정되니까.
일단 구현하는것에 문제가 있었던건 아니고 기획의도와는 다른 부분이 있어 수정사항이 생겼다.
자원은 타일맵 1칸당 1개씩, 다른 타일에 걸치지 않게 중앙에 생성되게 해주었는데 파밍 오브젝트가 한 맵에 한정된 개수가 나오는건 맞으나 기획 의도엔 한개의 타일 당 자원이 1~3개 배치가 되어야하는데 우린 전체 맵에서 갯수를 정해두고 그 개수만큼 랜덤으로 배치하는 형식으로 했으니 수정사항이 생긴것이었다.
그래서 어떤식으로 수정을 해야할까 회의를 하는데 초기엔 2개의 방법을 생각했었다.
1. 6각형에서 3등분을 하여 그 중앙에 배치가 되도록 하는것 (슬롯형식)
2. 6각형 안에서 랜덤으로 겹치지 않게 배치가 되도록 하는것
이렇게 고민하는 중 조원분중 한분이 기획자분께 "자원이 자연스럽게 배치되는게 엄청나게 중요한 일인가요?"라는 질문을 하게되었고, 자연스러운게 좋긴 하나 1번의 방법대로 진행해도 괜찮을것같다고 하셨다. 그리하여 1번의 방법대로 진행... 하려고 하였으나 중간 과정에서 변화가 있었다.
일단 기존과 달리 모든 타일에 자원이 1개는 꼭 들어가야 하니 코드를 잠금타일 배치하는것처럼 임시로 수정하여 1개씩 다 배치해보았다, 그런데..

일단 우리가 사용하려고 하는 프리펩이 크기가 커서 엄청 줄여주었는데 프리팹은 확실히 여기서 더 커져야하는데다가 빼곡해서 지저분할것같은 느낌이 들었다.
그리하여 타일 1칸의 크기는 2배로 늘려주는것으로 변경하였고 저 모습을 본 기획자분께서 1~3개 배치가 아닌 0~2개정도가 충분할듯 하다고 하여 한개의 타일당 자원이 0~2개씩 배치될 수 있게 수정방향을 잡았다.
근데 자원이 최대 2개까지 생성되게 하였으니 3분할을 할 필요가 없게 되었고 같이 작업하시던 분께서 내주신 의견은 타일 중앙에서 외곽선보다 작게 된 원 범위에서 생기게 하는 형식으로 진행하면 자연스럽고 괜찮지 않을까? 라는 의견을 주셨다.

대충 그림으로 그려보자면 이런식이다. 회색 원 안에서 생성이 되게 하되 자원끼리도 원을 붙여주어 서로 겹치지 않게 하려고 하였다.

프리펩의 경우 임시로 어제까지는 사각형과 캡슐모형으로 쓰다가 임시로 몇개 가져온건데 나중에 기획자분께서 골라주시면 크기 다듬고 그걸로 변경할 예정이다.
public void SetResourceTileMap()
{
for (int x = 0; x < gridCount; x++)
{
for (int y = 0; y < gridCount; y++)
{
int resourceCount = Random.Range(0, 3); // 0~2사이의 타일이 랜덤으로 생성
for (int i = 0; i < resourceCount; i++)
{
int resourceType = Random.Range(0, resourceTileObj.Count);
Vector3Int gridCell = new Vector3Int(x, y, 0);
Vector3 worldPos = grid.CellToWorld(gridCell); // 방의 중심좌표
Vector3 addjustedPos = new Vector3(worldPos.x, 0, worldPos.z);
Vector3 spawnPos = GetRandomPositionInCell(addjustedPos, 7); // 원의 크기
Instantiate(resourceTileObj[resourceType], spawnPos, Quaternion.identity, transform); // 프리팹을 adjustedPos월드위치에 생성
}
}
}
}
잠금타일과 비슷하긴 한데 같이 x, y축을 돌면서 각 셀에 접근하고 셀에 자원을 몇개 생성할지 결정해준 다음 resourceCount만큼 자원을 생성해준다. 다만 셀 안에서 랜덤한 위치를 계산하여 자원을 랜덤으로 배치해주는 형식으로 진행하였다.
private Vector3 GetRandomPositionInCell(Vector3 center, float maxOffset)
{
// 원형 범위 안 랜덤 위치 구하기
Vector2 offset2D = Random.insideUnitCircle * maxOffset;
// 평면에 오프셋을 적용해서 최종위치 계산
return new Vector3(center.x + offset2D.x, 0, center.z + offset2D.y);
}
그리고 원의 범위 안에서 랜덤한 위치를 계산해줄 GetRandomPositionInCell() 메서드도 작성해주었다.
근데 이 원의 범위를 잘 모르겠어서 어제 제외시킬 잠금타일 위치를 보여주기 위해 만든 기즈모에 원도 같이 나오게 해주었고, 최종적으로 정상적으로 작동하길래 여기서 마무리.
다만 원래 원 안에 자원이 들어가고 자원에서도 원을 만들어 겹치지 않게 하려고 하였는데 자원에 원을 넣지 않아도 붙기는 붙되 겹치지는 않길래 따로 자원에 원은 넣어주지 않았다.

잠금타일이 낮고 건물이 길어서 좀 빠져나온 애들은^^...... 나중에 수정해주기로 하고 여기까지 마무리, 수정사항이 나온다면 끝은 아니겠지만 원래는 MapManager 작성하려다가 수정하게 되었는데 나름 과정에서 웃긴 상황들도 많아 재미있게 작업했다.
주말에는 원래 코드 작성하려고 하였으나 부족한 공부를 하는것으로 결정했고.. 한주 버틴 나자신 고생했다.
'Unity > Project' 카테고리의 다른 글
| [Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 17일차, (0) | 2025.04.30 |
|---|---|
| [Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 16일차, (0) | 2025.04.28 |
| [Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 14일차, 타일 배치 (0) | 2025.04.24 |
| [Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 13일차, 첫 병합 (0) | 2025.04.23 |
| [Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 11일차, 맵 그리고 맵 (0) | 2025.04.21 |