for (int i = 0; i < ssx.Count - 1; i++)
{
int startx = ssx[i], endx = ssx[i + 1];
for (int j = 0; j < ssy.Count - 1; j++)
{
int starty = ssy[j], endy = ssy[j + 1];
for (int k = 0; k < ssz.Count - 1; k++)
{
int startz = ssz[k], endz = ssz[k + 1];
if (OctreeEditor.global.GetChunkGrid(new Vector3Int(startx, starty, startz)) == null) continue;
for (int ii = startx; ii <= endx; ii += 4)
{
for (int jj = starty; jj <= endy; jj += 4)
{
for (int kk = startz; kk <= endz; kk += 4)
{
Vector3Int worldPos = new Vector3Int(ii, jj, kk);
if (GetCube(worldPos) != null)
{
Vector3Int arrInd = EditData.GetMinPos(worldPos - minPos, gridSize) / gridSize;
//8 possible nodes
for (int iii = -1; iii <= 0; iii++)
for (int kkk = -1; kkk <= 0; kkk++)
for (int jjj = -1; jjj <= 0; jjj++)
{
Vector3Int ind = arrInd + new Vector3Int(iii, kkk, jjj);
if (ind.x >= 0 && ind.y >= 0 && ind.z >= 0 && ind.x < arrSize.x && ind.y < arrSize.y && ind.z < arrSize.z)
{
editArr[ind.x * arrSize.y * arrSize.z + ind.y * arrSize.z + ind.z] = 0;
if (terrain[ind.x * arrSize.y * arrSize.z + ind.y * arrSize.z + ind.z] != -1)//terrain exists
div[ind.x * arrSize.y * arrSize.z + ind.y * arrSize.z + ind.z] = cubeDivCountTerrainExist;
else
{
div[ind.x * arrSize.y * arrSize.z + ind.y * arrSize.z + ind.z] = cubeDivCount;
}
}
}
}
}
}
}
}
}
}
ㅋㅋㅋ..
근데 이거 아니면 성능 안나와
이제 lod 수준에 무관하게 지형수정정보를 로드해줄 수 있어
전에도 가능은 했는데 성능문제가 많아서 수정이 많으면 로드를 취소하는 편법을 썼었어.
이제는 성능에 딱 수정이 존재하는 범위만큼의 부하만 추가돼
어떤 리프노드에 수정이 존재하면, 해당 수정과 노드 크기 차에 비례해서 추가로 노드를 분할해줘.
최적화를 위해, 청크 내에서 수정이 존재하는 리프노드들을 구해야 해.
그런데 또 각 리프노드 내에 수정이 존재하는지 알기 위해서는 청크범위 전체를 블록 사이즈 단위로 순회해야 해.
윗 사진의 lod 청크 크기가 128 (리프노드 크기는 4) 이니깐, 128 * 128 * 128회 순회를 했어야 하는거야.
이걸 줄이기 위해 32 * 32 * 32 범위에 수정이 있는지에 대한 정보를 미리 가지고 있고,
lod청크를 순회할 때 다시 32 * 32 * 32범위로 나누고 순회하는데, 이 범위에 수정이 있는지에 대한 정보는 한번에 구할 수 있게 해줘서 대부분 스킵할 수 있어.
이걸로 지형 알고리즘은 거의 완성된거 같아. 전부터 이 부분 최적화 해야겠다면서 미루고 있었거든.
층 시스템은 없애기로 결정했어.
그걸 대체할 시스템을 떠올렸는데, 다이나믹 던전이라고 이름 붙였어.
플레이어가 땅을 파다보면, 주위에 던전을 생성해줘. 높은 확률로 던전과 마주할 수 있도록.
멀어지면 이 던전을 다시 삭제해줘. 이 던전은 절차적으로 생성해야해.
쉽게 가자면 사전 생성해둔 던전룸들을 주위에 배치하고 이어주면 돼.
복셀 알고리즘을 이용하기 때문에 어렵지 않게 넓은 공간을 한번에 파내고 채워낼 수 있어.
또, 지하에 넓은 공간이 있으면 특수 골렘이 스폰되고, 얘네들을 잡으면 광물을 드롭해.
일단은 괜찮은 아이디어인것 같아.
아 그리고 물 메쉬도 바꿔줬어.
기존에는 지형과 마찬가지로 옥트리로 관리했는데 물은 변형이 일어나지 않으니 괜히 복잡하게 그럴 필요가 없더라고.
마인크래프트 청크 로드하듯이 로드해주는 방식으로 바꿨어.
사진이 없어서 전에 버그났던 사진으로 대체했어
이후에 손봐서 강 바이옴에서 멀어지면서 물이 완전히 사라지게 만들 생각이야. 전에도 그렇게 했는데 지형 알고리즘 바꾸면서 이렇게 됐네.
코드 어질어질 하다 ㅋㅋ 하지만 저렇게 쓸수 밖에 없을때도 있더라고 ㅋㅋ
아찔하다
핑계대노
어지럽네 ㅋㅋㅋㅋ 딱 독이든 성배네 어쩔수 없는 경우
PC 플랫폼쪽으로 게임 만드시는건가요?
네
역시 그렇군요.. 대단하십니다 ㅠㅠ
앗 혹시 어떤 내용의 게임을 만드실건지 대충 이야기 해주실 수 있나요? 엄청 궁금하네요..
간단히 말하자면 어떤 장치를 실행시켰더니 처음보는 장소로 떨어졌는데, 집으로 돌아가기 위해서는 장치를 충전시키면서 장치를 부수러 오는 적들을 방어해야 하는 게임이에요.