/// <summary>
 /// Applied before OnCleanUp runs.
 /// </summary>
 internal static void Prefix(FallingWater __instance)
 {
     // Destroy the mesh renderer game object
     FallingWaterMeshRenderer.DestroyInstance();
     // Destroy the mesh
     UnityEngine.Object.Destroy(__instance.mesh);
     __instance.mesh = null;
 }
        /// <summary>
        /// Destroys the prioritizable mesh renderer.
        /// </summary>
        public static void DestroyInstance()
        {
            var inst = Instance;

            if (inst != null)
            {
                Util.KDestroyGameObject(inst.gameObject);
            }
            Instance = null;
        }
        /// <summary>
        /// Creates a mesh renderer object for falling water.
        /// </summary>
        /// <param name="instance">The falling water object to render.</param>
        internal static void CreateInstance(FallingWater instance)
        {
            var game = Game.Instance;

            if (game == null)
            {
                throw new ArgumentNullException(nameof(Game.Instance));
            }
            DestroyInstance();
            var go = instance.mesh.CreateMeshRenderer("Falling Water", LayerMask.NameToLayer(
                                                          "Water"));
            var t = go.transform;

            t.SetParent(game.transform);
            t.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
            // Set up the mesh with the right material
            if (go.TryGetComponent(out MeshRenderer renderer))
            {
                renderer.material = instance.material;
                renderer.SetPropertyBlock(instance.propertyBlock);
            }
            Instance = go.AddOrGet <FallingWaterMeshRenderer>();
        }
 /// <summary>
 /// Applied after OnSpawn runs.
 /// </summary>
 internal static void Postfix(FallingWater __instance)
 {
     FallingWaterMeshRenderer.CreateInstance(__instance);
 }