"내가 아까 말했잖아. 한계는 스스로 만드는 거라고." – Raymonde Pouzieux

2014/05/07

MeshCollider의 sharedMesh가 갱신이 안 될 때

오랜만에 글 쓰네요. 바빠서 자주 와서 보질 못 했습니다 ;ㅁ;

MeshCollider의 sharedMesh(mesh 아님. 이건 deprecated)를 갱신(새 mesh로 교체가 아니라 mesh 데이터만 수정) 할 일이 있어서 수정하는데 잘 보면 이게 전혀 갱신이 안 되는 걸 볼 수 있습니다. collider가 갱신되면 그때 같이 갱신되지요.

이유는 모르겠으나(검색해봐도 다들 정확한 이유는 모르는 것 같네요. 최적화 때문인 것 같다고 추측만) mesh 데이터를 수정하면 바로 갱신이 되지 않습니다. 그냥 가만히 있죠. 이걸 2였나 3버전부터 본 것 같은데 갱신 함수가 추가되거나 갱신 방법이 생기는 것도 아니고 아직도 이러고 있네요.

잊고 있다가 테스트하는데 뭐가 안 돼서 보니 이 문제네요. 해결(?) 방법이라고 해야 되나 여하튼 이걸 갱신하게 하려면

meshCollider.enabled = !meshCollider.enabled;
meshCollider.enabled = !meshCollider.enabled;

이렇게 의미 없이 collider를 껐다가 켜거나; (일부러 더 의미 없어 보이게 이렇게 씀)

meshCollider.sharedMesh = null; 
meshCollider.sharedMesh = mesh;

sharedMesh에 null값을 넣고 다시 되돌려놓으면 갱신이 됩니다. 네, 뭔가 이거나 저거나 의미 없어 보이긴 하는데 됩니다; (대체 왜?!)

보통은 충돌용 mesh 자체를 수정할 일이 없어서 갱신 자체를 염두를 안 해둔 것 같기도 하네요.

문제도 좀 이상하지만, 해결 방법도 이상하고 이걸 하려고 하는 저도 이상하고 아 다 이상해. 이게 뭐야 몰라 무서워.

댓글이 2개 우앙 | cat > 타닥타닥 | tag > ,

  1. 일기장 보는거같아서 재밌어요
    MeshCollider같은경우 aabb tree를 사용하기때문에 메쉬가 변경되면 다시 tree를 빌드해주어야해서 그렇습니다.
    Physics.BakeMesh(mesh.GetInstanceID(), false);와같이 인스턴스 아이디를 넘겨주어서 빌드해도 됩니다.
    이러면 따로 콜라이더를 기억 할 필요가 없어요.

  2. 2019.3 버전에 생긴 함수군요! 새로운 걸 하나 또 알았네요. 감사합니다!

댓글 남기기

* 표시된 곳은 반드시 입력해주세요