CombineMeshes.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace LylekGames {
  5. [RequireComponent(typeof(MeshFilter))]
  6. [RequireComponent(typeof(MeshRenderer))]
  7. public class CombineMeshes : MonoBehaviour {
  8. private Matrix4x4 myMatrix;
  9. [HideInInspector]
  10. public MeshFilter myMeshFilter;
  11. private MeshRenderer myMeshRenderer;
  12. [HideInInspector]
  13. [SerializeField]
  14. private MeshFilter[] meshFilters;
  15. private MeshRenderer[] meshRenderers;
  16. public void Start()
  17. {
  18. myMeshFilter = GetComponent<MeshFilter>();
  19. myMeshRenderer = GetComponent<MeshRenderer>();
  20. }
  21. public void EnableMeshNewCollider() {
  22. if (myMeshFilter)
  23. {
  24. if (myMeshFilter.sharedMesh != null)
  25. {
  26. Debug.LogError("This object already contains mesh data. (This may occur when adding the Combine script to an existing mesh. Please take a quick look at the Readme to find out how to use the combine script as intended).");
  27. Debug.Log("Combine script removed.");
  28. DestroyImmediate(this);
  29. return;
  30. }
  31. }
  32. if (transform.childCount > 0)
  33. {
  34. myMatrix = transform.worldToLocalMatrix;
  35. CombineInstance[] combine;
  36. meshFilters = GetComponentsInChildren<MeshFilter>();
  37. combine = new CombineInstance[meshFilters.Length];
  38. for (int i = 0; i < meshFilters.Length; i++)
  39. {
  40. if (meshFilters[i].sharedMesh != null)
  41. {
  42. combine[i].mesh = meshFilters[i].sharedMesh;
  43. combine[i].transform = myMatrix * meshFilters[i].transform.localToWorldMatrix;
  44. meshFilters[i].gameObject.SetActive(false);
  45. }
  46. }
  47. myMeshFilter.mesh = new Mesh();
  48. myMeshFilter.sharedMesh.CombineMeshes(combine);
  49. myMeshRenderer.material = meshFilters[1].GetComponent<Renderer>().sharedMaterial;
  50. gameObject.AddComponent<MeshCollider>();
  51. gameObject.isStatic = true;
  52. }
  53. else
  54. Debug.Log("There are no child meshes to combine.");
  55. }
  56. public void DisableMesh() {
  57. if (meshFilters != null && meshFilters.Length > 0)
  58. {
  59. for (int i = 0; i < meshFilters.Length; i++)
  60. {
  61. meshFilters[i].gameObject.SetActive(true);
  62. }
  63. if (meshRenderers != null)
  64. if (meshRenderers.Length > 0)
  65. foreach (MeshRenderer meshRenderer in meshRenderers)
  66. meshRenderer.enabled = true;
  67. myMeshFilter.mesh = null;
  68. myMeshRenderer.material = null;
  69. if (GetComponent<Collider>())
  70. DestroyImmediate(gameObject.GetComponent<Collider>());
  71. }
  72. else
  73. {
  74. Debug.LogError("There is no mesh data to disable. (This may occur when adding the Combine script to an existing mesh. Please take a quick look at the Readme to find out how to use the combine script as intended.)");
  75. Debug.Log("Combine script removed.");
  76. DestroyImmediate(this);
  77. return;
  78. }
  79. }
  80. }
  81. }