public override void OnInspectorGUI()
        {
            GetTerrainHeightNormalMap = new SerializedObject(target);
            GetTerrainHeightNormalMap script = (GetTerrainHeightNormalMap)target;

            script.GetTerData();
            savePathTerrainHeightNormalMap = GetTerrainHeightNormalMap.FindProperty("savePathTerrainHeightNormalMap");

            if (GUILayout.Button("Get Height Normal Map"))
            {
                CreateTerrainHeightNormal();
            }
            GetTerrainHeightNormalMap.ApplyModifiedProperties();
        }
        void CreateTerrainHeightNormal()
        {
            GetTerrainHeightNormalMap script = (GetTerrainHeightNormalMap)target;
            TerrainData targetTerrainData    = script.targetTerrainData;
            Texture2D   tempTex = new Texture2D(targetTerrainData.heightmapResolution, targetTerrainData.heightmapResolution, TextureFormat.RGBA32, false, true);

            Color32[] cols = new Color32[tempTex.width * tempTex.height];
            for (int x = 0; x < tempTex.width; x++)
            {
                for (int y = 0; y < tempTex.height; y++)
                {
                    // Bring x and y into the 0-1 Range used by GetInterpolatedHeight
                    float sample_xpos = 1.0f * x / (tempTex.width - 1);
                    float sample_ypos = 1.0f * y / (tempTex.height - 1);

                    // Get and encode height
                    float height = targetTerrainData.GetInterpolatedHeight(sample_xpos, sample_ypos) / targetTerrainData.size.y;
                    // Encoding/decoding [0..1) floats into 8 bit/channel RG. Note that 1.0 will not be encoded properly.
                    int height0 = Mathf.FloorToInt(height * 255.0f);
                    int height1 = Mathf.FloorToInt((height * 255.0f - height0) * 255.0f);
                    // Get normal
                    Vector3 normal   = targetTerrainData.GetInterpolatedNormal(sample_xpos, sample_ypos);
                    float   normal_x = (normal.x * 0.5f + 0.5f) * 255.0f;
                    float   normal_z = (normal.z * 0.5f + 0.5f) * 255.0f;
                    cols[x + y * tempTex.width] = new Color32((byte)height0, (byte)height1, (byte)normal_x, (byte)normal_z);
                }
            }
            tempTex.SetPixels32(cols);
            tempTex.Apply(false);

            string directory;
            string file = "Terrain Height Normal Map";

            if (savePathTerrainHeightNormalMap.stringValue == "")
            {
                directory = Application.dataPath;
            }
            else
            {
                directory = Path.GetDirectoryName(savePathTerrainHeightNormalMap.stringValue);
                file      = Path.GetFileNameWithoutExtension(savePathTerrainHeightNormalMap.stringValue);
            }
            string filePath = EditorUtility.SaveFilePanel("Save Terrain Height Normal Map", directory, file, "png");

            if (!string.IsNullOrEmpty(filePath))
            {
                filePath = FileUtil.GetProjectRelativePath(filePath);
                savePathTerrainHeightNormalMap.stringValue = filePath;

                byte[] bytes = tempTex.EncodeToPNG();
                System.IO.File.WriteAllBytes(filePath, bytes);
                AssetDatabase.Refresh();
                TextureImporter ti = AssetImporter.GetAtPath(filePath) as TextureImporter;

                ti.textureCompression = TextureImporterCompression.Uncompressed;
                ti.sRGBTexture        = false;

                ti.wrapMode      = TextureWrapMode.Clamp;
                ti.mipmapEnabled = false;
                ti.npotScale     = TextureImporterNPOTScale.None;
                AssetDatabase.ImportAsset(filePath, ImportAssetOptions.ForceUpdate);
                AssetDatabase.Refresh();
            }
            DestroyImmediate(tempTex);
        }