스압주의
목표
맵을 절차적으로 생성 후 Mesh.CombineMeshes 메소드를 이용해 최적화를 진행. 맵 객체는 Blender를 이용해 제작.
저거를 그리드에 여러 개 생성해서 벌집같이 만들거임. 선택된 저 오브젝트의 스케일이 400^3인데 블렌더에서 불러온것들은 꼭 x100씩 되어있더라.
발단
간단하게 만든 벌집 미로임. 최적화를 안해서 저 벽 하나하나, 벽과 벽 사이를 이어주는 기둥 하나하나가 다 각각의 메쉬임. 지금은 일부로 작게 만들었지만 저기서 더 커지면 심각하게 렉이 걸릴 것 같음. 다행히 맵을 처음 생성하고 나면 저기서 바뀌지는 않아서 그냥 합쳐주면 최적화 괜찮게 될 것 같음.
1차 문제 발생
띠요옹
내 원래 목적은 방 하나마다 먼저 CombineMeshes를 실행해 1차로 각 방을 합치고, 모든 방을 전부 합쳐 최종적으로 미로 하나만 남기려고 했음. 그런데 이상하게 아까까지만 해도 잘 붙어있던 방들이 메쉬를 합치기만 하면 저렇게 흩어짐. 다음은 내가 사용한 코드임.
{
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스택을 적립하며 곱해봄.
??? 다 어디감?
아
그렇다. WorldToLocal을 곱해버리니 가만히 있던 y축까지 날뛰기 시작했다.
블로그 글이나 영상의 댓글에서는 다 잘된다고 하던데, 나는 뭐가 문제일까
내가 쓴 코드는 아까 위에 써놓은 코드에 부모 오브젝트 받아다가 곱해준게 전부임. 혹시 나같은 현상 겪었던 사람 있음?
아무리 봐도 "블렌더에서 불러온것들은 꼭 x100씩 되어있더라" 가 문제인거 같은데
그런가? 근데 출력 옵션에서 사이즈를 4배로 설정했는데 스케일에 400이 찍힘 기본 배율로 해도 큰 틀은 1스케일인데 자식 메쉬들 보면 다 100스케일이고 혹시 fbx로 출력해서 x100 되는건가?
엄밀히 말하면 블렌더의 fbx 익스포트는 고장났음 나는 다른걸 써서 잘 모르는데 인터넷에 블렌더 -> 유니티 제대로 export 하는거 한번 해보실?
글고 모바일겜 만드는건진 모르겠는데 요즘 성능은 드로우콜이 엄청 작을 필요는 없어서 (컴퓨터는 한 2000, 모바일도 200 정도) 오히려 메시를 전부 하나로 만들면 컬링이 안됨... 그래서 일정 주기로만 합치는거 추천함
ㅇㅎ 오히려 다 합치는게 안좋은거구만
망할 블렌더 익스포트..