- Home /
Quick Outline does not work with multiple materials
I am using the quick outline material on the unity asset store but it doesn't work with skinned mesh renderers that have multiple materials (only one material will be picked to be outlined)
I'm not totally sure how to fix it and would absolutely love if anyone could offer any guidance, thanks!
Answer by z0code0z · Jun 03, 2020 at 12:58 AM
I FOUND THE SOLUTION!
After hours of going through some information and other outline solutions, simply adding the following code in the Awake function of the Outline.cs (at the very top) will fix it, I am not totally sure how well some of the features work but the outline works perfectly from my tests.
foreach (var skinnedMeshRenderer in GetComponentsInChildren<SkinnedMeshRenderer>())
{
if (skinnedMeshRenderer.sharedMesh.subMeshCount > 1)
{
skinnedMeshRenderer.sharedMesh.subMeshCount = skinnedMeshRenderer.sharedMesh.subMeshCount + 1;
skinnedMeshRenderer.sharedMesh.SetTriangles(skinnedMeshRenderer.sharedMesh.triangles, skinnedMeshRenderer.sharedMesh.subMeshCount - 1);
}
}
foreach (var meshFilter in GetComponentsInChildren<MeshFilter>())
{
if (meshFilter.sharedMesh.subMeshCount > 1)
{
meshFilter.sharedMesh.subMeshCount = meshFilter.sharedMesh.subMeshCount + 1;
meshFilter.sharedMesh.SetTriangles(meshFilter.sharedMesh.triangles, meshFilter.sharedMesh.subMeshCount - 1);
}
}
Disclaimer, the second portion (involving meshfilter) was not tested but it should work the same as with the skinnedMeshRenderer
This code causes Unity to crash in the build version. Any idea how to fix that?
it crashed also for me on build,I have no idea how to fix it.
Comment out the meshFilter[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount = meshFilter[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount + 1;
line, and it should work.
I would use a for loop instead:
Skinned$$anonymous$$eshRenderer[] skinned$$anonymous$$eshRenderer = GetComponentsInChildren<Skinned$$anonymous$$eshRenderer>();
for (int i = 0; i < skinned$$anonymous$$eshRenderer.Length; i++)
{
if (skinned$$anonymous$$eshRenderer[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount > 1)
{
skinned$$anonymous$$eshRenderer[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount = skinned$$anonymous$$eshRenderer[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount + 1;
skinned$$anonymous$$eshRenderer[i].shared$$anonymous$$esh.SetTriangles(skinned$$anonymous$$eshRenderer[i].shared$$anonymous$$esh.triangles, skinned$$anonymous$$eshRenderer[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount - 1);
}
}
$$anonymous$$eshFilter[] meshFilter = GetComponentsInChildren<$$anonymous$$eshFilter>();
for (int i = 0; i < meshFilter.Length; i++)
{
if (meshFilter[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount > 1)
{
meshFilter[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount = meshFilter[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount + 1;
meshFilter[i].shared$$anonymous$$esh.SetTriangles(meshFilter[i].shared$$anonymous$$esh.triangles, meshFilter[i].shared$$anonymous$$esh.sub$$anonymous$$eshCount - 1);
}
}
Here is the repaired code incase someone needed it in the future
SkinnedMeshRenderer[] skinnedMeshRenderer = GetComponentsInChildren<SkinnedMeshRenderer>();
for (int i = 0; i < skinnedMeshRenderer.Length; i++)
{
if (skinnedMeshRenderer[i].sharedMesh.subMeshCount > 1)
{
skinnedMeshRenderer[i].sharedMesh.subMeshCount = skinnedMeshRenderer[i].sharedMesh.subMeshCount + 1;
skinnedMeshRenderer[i].sharedMesh.SetTriangles(skinnedMeshRenderer[i].sharedMesh.triangles, skinnedMeshRenderer[i].sharedMesh.subMeshCount - 1);
}
}
MeshFilter[] meshFilter = GetComponentsInChildren<MeshFilter>();
for (int i = 0; i < meshFilter.Length; i++)
{
if (meshFilter[i].sharedMesh.subMeshCount > 1)
{
meshFilter[i].sharedMesh.subMeshCount = meshFilter[i].sharedMesh.subMeshCount + 1;
meshFilter[i].sharedMesh.SetTriangles(meshFilter[i].sharedMesh.triangles, meshFilter[i].sharedMesh.subMeshCount - 1);
}
}
I implemented this code and now every third or so time I hit play in unity, EnterPlaymode() hangs for 20 ish seconds and then Unity crashes. Precomputing outlines doesn't fix the issue. Any idea why this happens?
Your answer
