스압주의

목표

맵을 절차적으로 생성 후 Mesh.CombineMeshes 메소드를 이용해 최적화를 진행. 맵 객체는 Blender를 이용해 제작.

a15714ab041eb360be3335625683746f00534428d6a4ee89d73462f89813cd6e948c0114922859d95f27cecb3ab3

저거를 그리드에 여러 개 생성해서 벌집같이 만들거임. 선택된 저 오브젝트의 스케일이 400^3인데 블렌더에서 불러온것들은 꼭 x100씩 되어있더라.

발단

a15714ab041eb360be3335625683746f00534428d6a4ee89d73463f09811cd6e95b85a72bd2bb3cde9b75a8b13

간단하게 만든 벌집 미로임. 최적화를 안해서 저 벽 하나하나, 벽과 벽 사이를 이어주는 기둥 하나하나가 다 각각의 메쉬임. 지금은 일부로 작게 만들었지만 저기서 더 커지면 심각하게 렉이 걸릴 것 같음. 다행히 맵을 처음 생성하고 나면 저기서 바뀌지는 않아서 그냥 합쳐주면 최적화 괜찮게 될 것 같음.

1차 문제 발생

a15714ab041eb360be3335625683746f00534428d6a4ee89d73463f59f15cd6e2d74eff2a36ce2c82b9602a781

띠요옹

내 원래 목적은 방 하나마다 먼저 CombineMeshes를 실행해 1차로 각 방을 합치고, 모든 방을 전부 합쳐 최종적으로 미로 하나만 남기려고 했음. 그런데 이상하게 아까까지만 해도 잘 붙어있던 방들이 메쉬를 합치기만 하면 저렇게 흩어짐. 다음은 내가 사용한 코드임.

public void CombineMesh()
{
var add = new List<MeshFilter>();
add.AddRange(Walls.Where(w => w.activeSelf).Select(e => e.GetComponent<MeshFilter>()));
add.AddRange(Pillars.Select(e => e.GetComponent<MeshFilter>()));
Debug.Log(add.Count);
var combine = new CombineInstance[add.Count];

for (var i = 0; i < add.Count; i++)
{
var filter = add[i];
combine[i].mesh = filter.sharedMesh;
combine[i].transform = filter.transform.localToWorldMatrix;
filter.gameObject.SetActive(false);
}

var mesh = new Mesh();
mesh.CombineMeshes(combine);
meshFilter.sharedMesh = mesh;
gameObject.SetActive(true);
}

Walls랑 Pillars는 프리팹에서 벽들과 기둥들을 담고 있는 리스트임.

combine 선언할 때 new List<>로 선언하고 Add하는 식으로 짜봤는데 그대로더라...

2차 문제 발생

1차에서 바로 여기에 질문글 썼으면 아마 핑프새기라고 욕먹었을수도 있음. 찾아보니까 combine[i].transform = 뭐시기 부분에서, localToWorld에 부모 트랜스폼의 WorldToLocal을 곱해줘야 한다더라. 그렇게 오늘도 구글신 찬양 1스택을 적립하며 곱해봄.

a15714ab041eb360be3335625683746f00534428d6a4ee89d73460f39815cd6efdf9898475f770e93ae38813c2

??? 다 어디감?

a15714ab041eb360be3335625683746f00534428d6a4ee89d73460f29f17cd6e78737163a0d722e4ac2f3c20306d

그렇다. WorldToLocal을 곱해버리니 가만히 있던 y축까지 날뛰기 시작했다.

블로그 글이나 영상의 댓글에서는 다 잘된다고 하던데, 나는 뭐가 문제일까

내가 쓴 코드는 아까 위에 써놓은 코드에 부모 오브젝트 받아다가 곱해준게 전부임. 혹시 나같은 현상 겪었던 사람 있음?