Пример #1
0
    private void SaveLightScenarioData(LightingScenarioData newScenario)
    {
        if (newScenario == null)
        {
            Debug.LogException(new Exception("Incorrect use of the method"));
        }

        int lightScenarioIndex = GetLightScenarioDataIndex(newScenario.name);

        if (lightScenarioIndex == -1)
        {
            lightingScenariosData.Add(newScenario);
        }
        else
        {
            lightingScenariosData[lightScenarioIndex] = newScenario;
        }
    }
Пример #2
0
    public void LoadLightingScenarioScenes(LightingScenarioData scenarioData)
    {
        if (UnityEditor.Lightmapping.giWorkflowMode != UnityEditor.Lightmapping.GIWorkflowMode.OnDemand)
        {
            Debug.LogError("Lightmap switcher requires Auto Generate lighting mode disabled.");
            return;
        }

        Debug.Log("Loading scenario " + scenarioData.name);

        if (scenarioData.geometrySceneName == "")
        {
            Debug.LogError("Geometry scene name cannot be null. Stopping generation.");
            return;
        }
        if (scenarioData.lightingSceneName == "")
        {
            Debug.LogError("Lighting scene name cannot be null. Stopping generation.");
            return;
        }
        string lightingSceneGUID = AssetDatabase.FindAssets(scenarioData.lightingSceneName)[0];
        string lightingScenePath = AssetDatabase.GUIDToAssetPath(lightingSceneGUID);

        if (!lightingScenePath.EndsWith(".unity"))
        {
            lightingScenePath = lightingScenePath + ".unity";
        }

        string geometrySceneGUID = AssetDatabase.FindAssets(scenarioData.geometrySceneName)[0];
        string geometryScenePath = AssetDatabase.GUIDToAssetPath(geometrySceneGUID);

        if (!geometryScenePath.EndsWith(".unity"))
        {
            geometryScenePath = geometryScenePath + ".unity";
        }

        EditorSceneManager.OpenScene(geometryScenePath);
        Lightmapping.lightingDataAsset = null;
        EditorSceneManager.OpenScene(lightingScenePath, OpenSceneMode.Additive);
        Scene lightingScene = SceneManager.GetSceneByName(scenarioData.lightingSceneName);

        EditorSceneManager.SetActiveScene(lightingScene);
    }
Пример #3
0
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        EditorGUILayout.PropertyField(geometrySceneName);
        EditorGUILayout.PropertyField(lightingSceneName);
        EditorGUILayout.PropertyField(storeRendererInfos);
        EditorGUILayout.BeginVertical("box");

        EditorGUILayout.LabelField("Stored Data", EditorStyles.boldLabel);
        //Begin disabled group as this is a data summary display
        EditorGUI.BeginDisabledGroup(true);
        EditorGUILayout.PropertyField(lightmapsMode);
        EditorGUILayout.TextField("Lightmaps count", lightmaps.arraySize.ToString());
        EditorGUILayout.TextField("Renderer Infos count", rendererInfos.arraySize.ToString());
        EditorGUILayout.ObjectField(lightProbes);
        EditorGUILayout.PropertyField(hasRealtimeLights);

        EditorGUI.EndDisabledGroup();
        EditorGUILayout.EndVertical();

        LightingScenarioData scenarioData = (LightingScenarioData)target;

        if (GUILayout.Button("Generate lighting scenario data"))
        {
            LoadLightingScenarioScenes(scenarioData);
            //Check if the lighting scene needs requires dynamic lighting ( if not, never try to load the lighting scene ).
            scenarioData.hasRealtimeLights = SearchLightsNeededRealtime();
            Debug.Log("Lightmap switcher - Start baking");
            //Remove reference to LightingDataAsset so that Unity doesn't delete the previous bake
            Lightmapping.lightingDataAsset = null;
            EditorCoroutineUtility.StartCoroutine(BuildLightingAsync(scenarioData), this);
        }
        if (GUILayout.Button("Load Lighting scenario"))
        {
            LoadLightingScenarioScenes(scenarioData);
            GameObject.FindObjectOfType <LevelLightmapData>().LoadLightingScenarioData(scenarioData);
        }

        serializedObject.ApplyModifiedProperties();
    }
Пример #4
0
    public void LoadLightingScenario(LightingScenarioData data)
    {
        //Assumes that the active scene is the lighting scene. This might not be true for all games.
        string previousLightingSceneName = SceneManager.GetActiveScene().name;

        if (data.lightingSceneName != previousLightingSceneName)
        {
            LightmapSettings.lightmapsMode = data.lightmapsMode;

            if (allowLoadingLightingScenes)
            {
                m_SwitchSceneCoroutine = StartCoroutine(SwitchSceneCoroutine(data.lightingSceneName, previousLightingSceneName));
            }

            if (data.storeRendererInfos)
            {
                ApplyDataRendererInfo(data.rendererInfos);
            }

            LightmapSettings.lightmaps = LoadLightmaps(data);

            LoadLightProbes(data);
        }
    }
    public void StoreLightmapInfos(int index)
    {
        if (GLog.IsLogInfoEnabled)
        {
            GLog.LogInfo("Storing data for lighting scenario " + index);
        }
        if (UnityEditor.Lightmapping.giWorkflowMode != UnityEditor.Lightmapping.GIWorkflowMode.OnDemand)
        {
            if (GLog.IsLogErrorEnabled)
            {
                GLog.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");
            }
            return;
        }

        var newLightingScenarioData   = new LightingScenarioData();
        var newRendererInfos          = new List <RendererInfo>();
        var newLightmapsTextures      = new List <Texture2D>();
        var newLightmapsTexturesDir   = new List <Texture2D>();
        var newLightmapsMode          = new LightmapsMode();
        var newSphericalHarmonicsList = new List <SphericalHarmonics>();

        newLightmapsMode = LightmapSettings.lightmapsMode;

        GenerateLightmapInfo(gameObject, newRendererInfos, newLightmapsTextures, newLightmapsTexturesDir, newLightmapsMode);

        newLightingScenarioData.lightmapsMode = newLightmapsMode;

        newLightingScenarioData.lightmaps = newLightmapsTextures.ToArray();

        if (newLightmapsMode != LightmapsMode.NonDirectional)
        {
            newLightingScenarioData.lightmapsDir = newLightmapsTexturesDir.ToArray();
        }

        newLightingScenarioData.rendererInfos = newRendererInfos.ToArray();

        var scene_LightProbes = new SphericalHarmonicsL2[LightmapSettings.lightProbes.bakedProbes.Length];

        scene_LightProbes = LightmapSettings.lightProbes.bakedProbes;

        for (int i = 0; i < scene_LightProbes.Length; i++)
        {
            var SHCoeff = new SphericalHarmonics();

            // j is coefficient
            for (int j = 0; j < 3; j++)
            {
                //k is channel ( r g b )
                for (int k = 0; k < 9; k++)
                {
                    SHCoeff.coefficients[j * 9 + k] = scene_LightProbes[i][j, k];
                }
            }

            newSphericalHarmonicsList.Add(SHCoeff);
        }

        newLightingScenarioData.lightProbes = newSphericalHarmonicsList.ToArray();

        lightingScenariosData = newLightingScenarioData;

        if (lightingScenesNames == null || lightingScenesNames.Count < lightingScenariosCount)
        {
            lightingScenesNames = new List <string>();
            while (lightingScenesNames.Count < lightingScenariosCount)
            {
                lightingScenesNames.Add(null);
            }
        }
    }
    public void StoreLightmapInfos(int index)
    {
        var newLightingScenarioData   = new LightingScenarioData();
        var newRendererInfos          = new List <RendererInfo>();
        var newLightmapsTextures      = new List <Texture2D>();
        var newLightmapsTexturesDir   = new List <Texture2D>();
        var newLightmapsMode          = new LightmapsMode();
        var newSphericalHarmonicsList = new List <SphericalHarmonics>();
        var newLightmapsShadowMasks   = new List <Texture2D>();

        newLightmapsMode = LightmapSettings.lightmapsMode;

        GenerateLightmapInfo(gameObject, newRendererInfos, newLightmapsTextures, newLightmapsTexturesDir, newLightmapsShadowMasks, newLightmapsMode);

        newLightingScenarioData.lightmapsMode = newLightmapsMode;

        newLightingScenarioData.lightmaps = newLightmapsTextures.ToArray();

        if (newLightmapsMode != LightmapsMode.NonDirectional)
        {
            newLightingScenarioData.lightmapsDir = newLightmapsTexturesDir.ToArray();
        }

        //Mixed or realtime support
        newLightingScenarioData.hasRealtimeLights = latestBuildHasReltimeLights;

        newLightingScenarioData.shadowMasks = newLightmapsShadowMasks.ToArray();

        newLightingScenarioData.rendererInfos = newRendererInfos.ToArray();

        var scene_LightProbes = new SphericalHarmonicsL2[LightmapSettings.lightProbes.bakedProbes.Length];

        scene_LightProbes = LightmapSettings.lightProbes.bakedProbes;

        for (int i = 0; i < scene_LightProbes.Length; i++)
        {
            var SHCoeff = new SphericalHarmonics();

            // j is coefficient
            for (int j = 0; j < 3; j++)
            {
                //k is channel ( r g b )
                for (int k = 0; k < 9; k++)
                {
                    SHCoeff.coefficients[j * 9 + k] = scene_LightProbes[i][j, k];
                }
            }

            newSphericalHarmonicsList.Add(SHCoeff);
        }

        newLightingScenarioData.lightProbes = newSphericalHarmonicsList.ToArray();

        if (lightingScenariosData.Count < index + 1)
        {
            lightingScenariosData.Insert(index, newLightingScenarioData);
        }
        else
        {
            lightingScenariosData[index] = newLightingScenarioData;
        }

        lightingScenariosCount = lightingScenariosData.Count;

        if (lightingScenesNames == null || lightingScenesNames.Length < lightingScenariosCount)
        {
            lightingScenesNames = new string[lightingScenariosCount];
        }
    }
Пример #7
0
    static void GenerateLightingData(LightingScenarioData data)
    {
        var newRendererInfos   = new List <LevelLightmapData.RendererInfo>();
        var newLightmapsLight  = new List <Texture2D>();
        var newLightmapsDir    = new List <Texture2D>();
        var newLightmapsShadow = new List <Texture2D>();

        data.lightmapsMode = LightmapSettings.lightmapsMode;

        //TODO : Fin better solution for terrain. This is not compatible with several terrains.
        Terrain terrain = FindObjectOfType <Terrain>();

        if (terrain != null && terrain.lightmapIndex != -1 && terrain.lightmapIndex != 65534)
        {
            LevelLightmapData.RendererInfo terrainRendererInfo = new LevelLightmapData.RendererInfo();
            terrainRendererInfo.lightmapScaleOffset = terrain.lightmapScaleOffset;

            Texture2D lightmaplight = LightmapSettings.lightmaps[terrain.lightmapIndex].lightmapColor;
            terrainRendererInfo.lightmapIndex = newLightmapsLight.IndexOf(lightmaplight);
            if (terrainRendererInfo.lightmapIndex == -1)
            {
                terrainRendererInfo.lightmapIndex = newLightmapsLight.Count;
                newLightmapsLight.Add(lightmaplight);
            }

            if (data.lightmapsMode != LightmapsMode.NonDirectional)
            {
                Texture2D lightmapdir = LightmapSettings.lightmaps[terrain.lightmapIndex].lightmapDir;
                terrainRendererInfo.lightmapIndex = newLightmapsDir.IndexOf(lightmapdir);
                if (terrainRendererInfo.lightmapIndex == -1)
                {
                    terrainRendererInfo.lightmapIndex = newLightmapsDir.Count;
                    newLightmapsDir.Add(lightmapdir);
                }
            }
            if (LightmapSettings.lightmaps[terrain.lightmapIndex].shadowMask != null)
            {
                Texture2D lightmapShadow = LightmapSettings.lightmaps[terrain.lightmapIndex].shadowMask;
                terrainRendererInfo.lightmapIndex = newLightmapsShadow.IndexOf(lightmapShadow);
                if (terrainRendererInfo.lightmapIndex == -1)
                {
                    terrainRendererInfo.lightmapIndex = newLightmapsShadow.Count;
                    newLightmapsShadow.Add(lightmapShadow);
                }
            }
            if (data.storeRendererInfos)
            {
                newRendererInfos.Add(terrainRendererInfo);
                if (Application.isEditor)
                {
                    Debug.Log("Terrain lightmap stored in" + terrainRendererInfo.lightmapIndex.ToString());
                }
            }
        }

        var renderers = FindObjectsOfType(typeof(Renderer));

        foreach (Renderer renderer in renderers)
        {
            if (renderer.lightmapIndex != -1 && renderer.lightmapIndex != 65534)
            {
                LevelLightmapData.RendererInfo info = new LevelLightmapData.RendererInfo();
                info.transformHash       = LevelLightmapData.GetStableHash(renderer.gameObject.transform);
                info.meshHash            = renderer.gameObject.GetComponent <MeshFilter>().sharedMesh.vertexCount;
                info.name                = renderer.gameObject.name;
                info.lightmapScaleOffset = renderer.lightmapScaleOffset;

                Texture2D lightmaplight = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapColor;
                info.lightmapIndex = newLightmapsLight.IndexOf(lightmaplight);
                if (info.lightmapIndex == -1)
                {
                    info.lightmapIndex = newLightmapsLight.Count;
                    newLightmapsLight.Add(lightmaplight);
                }

                if (data.lightmapsMode != LightmapsMode.NonDirectional)
                {
                    Texture2D lightmapdir = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapDir;
                    info.lightmapIndex = newLightmapsDir.IndexOf(lightmapdir);
                    if (info.lightmapIndex == -1)
                    {
                        info.lightmapIndex = newLightmapsDir.Count;
                        newLightmapsDir.Add(lightmapdir);
                    }
                }
                if (LightmapSettings.lightmaps[renderer.lightmapIndex].shadowMask != null)
                {
                    Texture2D lightmapShadow = LightmapSettings.lightmaps[renderer.lightmapIndex].shadowMask;
                    info.lightmapIndex = newLightmapsShadow.IndexOf(lightmapShadow);
                    if (info.lightmapIndex == -1)
                    {
                        info.lightmapIndex = newLightmapsShadow.Count;
                        newLightmapsShadow.Add(lightmapShadow);
                    }
                }
                if (data.storeRendererInfos)
                {
                    newRendererInfos.Add(info);
                    if (Application.isEditor)
                    {
                        Debug.Log("stored info for " + renderers.Length + " meshrenderers");
                    }
                }
            }
        }
        data.lightmaps     = newLightmapsLight.ToArray();
        data.lightmapsDir  = newLightmapsDir.ToArray();
        data.shadowMasks   = newLightmapsShadow.ToArray();
        data.rendererInfos = newRendererInfos.ToArray();
    }
Пример #8
0
    public void StoreLightmapInfos(int index)
    {
        Debug.Log("Storing data for lighting scenario " + index);
        if (UnityEditor.Lightmapping.giWorkflowMode != UnityEditor.Lightmapping.GIWorkflowMode.OnDemand)
        {
            Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");
            return;
        }

        var newLightingScenarioData   = new LightingScenarioData();
        var newRendererInfos          = new List <RendererInfo>();
        var newLightmapsTextures      = new List <Texture2D>();
        var newLightmapsTexturesDir   = new List <Texture2D>();
        var newLightmapsMode          = new LightmapsMode();
        var newSphericalHarmonicsList = new List <SphericalHarmonics>();
        var newLightmapsShadowMasks   = new List <Texture2D>();

        newLightmapsMode = LightmapSettings.lightmapsMode;

        GenerateLightmapInfo(gameObject, newRendererInfos, newLightmapsTextures, newLightmapsTexturesDir, newLightmapsShadowMasks, newLightmapsMode);

        newLightingScenarioData.lightmapsMode = newLightmapsMode;

        newLightingScenarioData.lightmaps = newLightmapsTextures.ToArray();

        if (newLightmapsMode != LightmapsMode.NonDirectional)
        {
            newLightingScenarioData.lightmapsDir = newLightmapsTexturesDir.ToArray();
        }

        //Mixed or realtime support
        newLightingScenarioData.hasRealtimeLights = latestBuildHasReltimeLights;

        newLightingScenarioData.shadowMasks = newLightmapsShadowMasks.ToArray();

        newLightingScenarioData.rendererInfos = newRendererInfos.ToArray();

        var scene_LightProbes = new SphericalHarmonicsL2[LightmapSettings.lightProbes.bakedProbes.Length];

        scene_LightProbes = LightmapSettings.lightProbes.bakedProbes;

        for (int i = 0; i < scene_LightProbes.Length; i++)
        {
            var SHCoeff = new SphericalHarmonics();

            // j is coefficient
            for (int j = 0; j < 3; j++)
            {
                //k is channel ( r g b )
                for (int k = 0; k < 9; k++)
                {
                    SHCoeff.coefficients[j * 9 + k] = scene_LightProbes[i][j, k];
                }
            }

            newSphericalHarmonicsList.Add(SHCoeff);
        }

        newLightingScenarioData.lightProbes = newSphericalHarmonicsList.ToArray();

        if (lightingScenariosData.Count < index + 1)
        {
            lightingScenariosData.Insert(index, newLightingScenarioData);
        }
        else
        {
            lightingScenariosData[index] = newLightingScenarioData;
        }

        lightingScenariosCount = lightingScenariosData.Count;

        if (lightingScenesNames == null || lightingScenesNames.Length < lightingScenariosCount)
        {
            lightingScenesNames = new string[lightingScenariosCount];
        }
        if (latestBuildHasReltimeLights && lightingScenesNames[index] != null)
        {
            lightingScenesNames[index] = lightingScenariosScenes[index].name;
        }
    }
Пример #9
0
    public void StoreLightmapInfos(int index)
    {
        Debug.Log("Storing data for lighting scenario " + index);
        if (UnityEditor.Lightmapping.giWorkflowMode != UnityEditor.Lightmapping.GIWorkflowMode.OnDemand)
        {
            Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");
            return;
        }

        var newLightingScenarioData   = new LightingScenarioData();
        var newRendererInfos          = new List <RendererInfo>();
        var newLightmapsTextures      = new List <Texture2D>();
        var newShadowmasksTextures    = new List <Texture2D>();
        var newLightmapsTexturesDir   = new List <Texture2D>();
        var newLightmapsMode          = new LightmapsMode();
        var newSphericalHarmonicsList = new List <SphericalHarmonics>();

        newLightmapsMode = LightmapSettings.lightmapsMode;

        GenerateLightmapInfo(gameObject, newRendererInfos, newLightmapsTextures, newLightmapsTexturesDir, newShadowmasksTextures, newLightmapsMode);

        newLightingScenarioData.lightmapsMode = newLightmapsMode;

        newLightingScenarioData.lightmaps   = newLightmapsTextures.ToArray();
        newLightingScenarioData.shadowMasks = newShadowmasksTextures.ToArray();

        if (newLightmapsMode != LightmapsMode.NonDirectional)
        {
            newLightingScenarioData.lightmapsDir = newLightmapsTexturesDir.ToArray();
        }

        newLightingScenarioData.rendererInfos = newRendererInfos.ToArray();

        //var scene_LightProbes = new SphericalHarmonicsL2[LightmapSettings.lightProbes.bakedProbes.Length];
        //scene_LightProbes = LightmapSettings.lightProbes.bakedProbes;

        //      for (int i = 0; i < scene_LightProbes.Length; i++)
        //      {
        //          var SHCoeff = new SphericalHarmonics();

        //          // j is coefficient
        //          for (int j = 0; j < 3; j++)
        //          {
        //              //k is channel ( r g b )
        //              for (int k = 0; k < 9; k++)
        //              {
        //                  SHCoeff.coefficients[j*9+k] = scene_LightProbes[i][j, k];
        //              }
        //          }

        //          newSphericalHarmonicsList.Add(SHCoeff);
        //      }

        //newLightingScenarioData.lightProbes = newSphericalHarmonicsList.ToArray ();

        if (lightingScenariosData.Count < index + 1)
        {
            lightingScenariosData.Insert(index, newLightingScenarioData);
        }
        else
        {
            lightingScenariosData[index] = newLightingScenarioData;
        }

        lightingScenariosCount = lightingScenariosData.Count;
    }
Пример #10
0
    public void SaveLightMaps()
    {
        LightingScenarioData newLightingScenario = new LightingScenarioData();
        var newRendererInfos           = new List <RendererInfo>();
        var newLightmapsTextures       = new List <Texture2D>();
        var newLightmapsTexturesDir    = new List <Texture2D>();
        var newLightmapsTexturesShadow = new List <Texture2D>();
        var newLightmapsMode           = new LightmapsMode();
        var newSphericalHarmonicsList  = new List <SphericalHarmonics>();

        newLightmapsMode = LightmapSettings.lightmapsMode;

        var renderers = FindObjectsOfType(typeof(MeshRenderer));

        Debug.Log("stored info for " + renderers.Length + " meshrenderers");
        foreach (MeshRenderer renderer in renderers)
        {
            if (renderer.lightmapIndex != -1)
            {
                RendererInfo info = new RendererInfo();
                info.renderer            = renderer;
                info.lightmapOffsetScale = renderer.lightmapScaleOffset;

                Texture2D lightmaplight = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapColor;
                info.lightmapIndex = newLightmapsTextures.IndexOf(lightmaplight);
                if (info.lightmapIndex == -1)
                {
                    info.lightmapIndex = newLightmapsTextures.Count;
                    newLightmapsTextures.Add(lightmaplight);
                }

                if (newLightmapsMode != LightmapsMode.NonDirectional)
                {
                    //first directional lighting
                    Texture2D lightmapdir = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapDir;
                    info.lightmapIndex = newLightmapsTexturesDir.IndexOf(lightmapdir);
                    if (info.lightmapIndex == -1)
                    {
                        info.lightmapIndex = newLightmapsTexturesDir.Count;
                        newLightmapsTexturesDir.Add(lightmapdir);
                    }
                    LightmapData lmd = LightmapSettings.lightmaps[0];
                    //now the shadowmask
                    Texture2D lightmapshadow = LightmapSettings.lightmaps[renderer.lightmapIndex].shadowMask;
                    if (lightmapshadow != null)
                    {
                        info.lightmapIndex = newLightmapsTexturesShadow.IndexOf(lightmapshadow);
                        if (info.lightmapIndex == -1)
                        {
                            info.lightmapIndex = newLightmapsTexturesShadow.Count;
                            newLightmapsTexturesShadow.Add(lightmapshadow);
                        }
                    }
                }
                newRendererInfos.Add(info);
            }
        }


        newLightingScenario.lightmapsMode = newLightmapsMode;
        newLightingScenario.lightmaps     = newLightmapsTextures.ToArray();

        if (newLightmapsMode != LightmapsMode.NonDirectional)
        {
            newLightingScenario.lightmapsDir    = newLightmapsTexturesDir.ToArray();
            newLightingScenario.lightmapsShadow = newLightmapsTexturesShadow.ToArray();
        }

        newLightingScenario.rendererInfos = newRendererInfos.ToArray();

        var scene_LightProbes = new SphericalHarmonicsL2[LightmapSettings.lightProbes.bakedProbes.Length];

        scene_LightProbes = LightmapSettings.lightProbes.bakedProbes;

        for (int i = 0; i < scene_LightProbes.Length; i++)
        {
            var SHCoeff = new SphericalHarmonics();

            // j is coefficient
            for (int j = 0; j < 3; j++)
            {
                //k is channel ( r g b )
                for (int k = 0; k < 9; k++)
                {
                    SHCoeff.coefficients[j * 9 + k] = scene_LightProbes[i][j, k];
                }
            }

            newSphericalHarmonicsList.Add(SHCoeff);
        }

        newLightingScenario.lightProbes = newSphericalHarmonicsList.ToArray();

        // write the files and map config data.
        CreateResourcesDirectory(m_currentLightScenario);

        string resourcesDir = GetResourcesDirectory(m_currentLightScenario);

        CopyTextureToResources(resourcesDir, newLightingScenario.lightmaps);
        CopyTextureToResources(resourcesDir, newLightingScenario.lightmapsDir);
        CopyTextureToResources(resourcesDir, newLightingScenario.lightmapsShadow);

        newLightingScenario.name = m_currentLightScenario;
        SaveLightScenarioData(newLightingScenario);

        UnityEditor.EditorUtility.SetDirty(this.gameObject);
    }