Last active
January 21, 2022 07:39
-
-
Save wotakuro/219ad9b2f5a23a3b709904ac0d5b1161 to your computer and use it in GitHub Desktop.
Shader.CreateGPUProgramをUnityEditorで常に呼び出されるようにしたい!!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// UnityEditor上ではShaderオブジェクトが残ったままになります | |
// 一度 Shader.CreateGPUProgramが走ってしまうと、その後に再生してもShader.CreateGPUProgramは残りません。 | |
// なので、Editor上で余計なCreateGPUProgramを発見 | |
// | |
// 使い方、このソースコードをプロジェクト内に入れてください。 | |
// そして「Tools/UTJ/AlwaysCraateGPUProgram/Enable」をチェックしてください | |
#if UNITY_EDITOR | |
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
using System.IO; | |
using UnityEditor; | |
namespace UTJ | |
{ | |
public class AlwaysCreateGPUProgramAtEditor | |
{ | |
#region EditorMenu | |
private const string MenuName = "Tools/UTJ/AlwaysCraateGPUProgram/Enable"; | |
private const string ConfigFile = "Library/com.utj.alwaysCreateGpu/config.txt"; | |
private static bool EnableFlag = false; | |
[System.Serializable] | |
struct ConfigData | |
{ | |
public bool flag; | |
} | |
[InitializeOnLoadMethod] | |
public static void Init() | |
{ | |
if (!File.Exists(ConfigFile)) | |
{ | |
EnableFlag = false; | |
Menu.SetChecked(MenuName, EnableFlag); | |
return; | |
} | |
var config = ReadConfigData(); | |
EnableFlag = config.flag; | |
Menu.SetChecked(MenuName, EnableFlag); | |
EditorApplication.playModeStateChanged += EditorApplication_playModeStateChanged; | |
} | |
private static void EditorApplication_playModeStateChanged(PlayModeStateChange obj) | |
{ | |
if (obj == PlayModeStateChange.ExitingEditMode) | |
{ | |
Execute(); | |
} | |
} | |
[MenuItem(MenuName, priority = 1)] | |
public static void ChangeMode() | |
{ | |
var flag = UnityEditor.Menu.GetChecked(MenuName); | |
flag = !flag; | |
UnityEditor.Menu.SetChecked(MenuName, flag); | |
EnableFlag = flag; | |
SaveConfigData(); | |
} | |
private static ConfigData ReadConfigData() | |
{ | |
string str = File.ReadAllText(ConfigFile); | |
var data = JsonUtility.FromJson<ConfigData>(str); | |
return data; | |
} | |
private static void SaveConfigData() | |
{ | |
ConfigData data = new ConfigData() { flag = EnableFlag }; | |
var str = JsonUtility.ToJson(data); | |
string dir = Path.GetDirectoryName(ConfigFile); | |
if (!Directory.Exists(dir)) | |
{ | |
Directory.CreateDirectory(dir); | |
} | |
File.WriteAllText(ConfigFile, str); | |
} | |
#endregion EditorMenu | |
public static void Execute() | |
{ | |
if (!EnableFlag) { return; } | |
if (!EditorSettings.asyncShaderCompilation) | |
{ | |
EditorUtility.DisplayDialog("Editor設定変更", "EditorSettingsのAsynchronous Shader Compilationを有効にします", "OK"); | |
EditorSettings.asyncShaderCompilation = true; | |
} | |
RemoveShaders(); | |
//ReloadScenes(); | |
} | |
[MenuItem("Tools/UTJ/AlwaysCraateGPUProgram/ReloadShaders")] | |
public static void RemoveShaders() { | |
var backupCompilation = ShaderUtil.allowAsyncCompilation; | |
ShaderUtil.allowAsyncCompilation = true; | |
System.IO.Directory.Delete("Library/ShaderCache", true); | |
var method = typeof(ShaderUtil).GetMethod("ReloadAllShaders", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Static); | |
method.Invoke(null,null); | |
} | |
private static void ReloadScenes() { | |
// pink 対策( いらないかも) | |
var sceneCount = UnityEditor.SceneManagement.EditorSceneManager.sceneCount; | |
var activeScene = UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene(); | |
var activeScenePath = activeScene.path; | |
var scenes = new UnityEngine.SceneManagement.Scene[sceneCount]; | |
var scenePaths = new string[sceneCount]; | |
for (int i = 0; i < sceneCount; ++i) | |
{ | |
scenes[i] = UnityEditor.SceneManagement.EditorSceneManager.GetSceneAt(i); | |
scenePaths[i] = scenes[i].path; | |
} | |
var newScene = UnityEditor.SceneManagement.EditorSceneManager.NewScene(UnityEditor.SceneManagement.NewSceneSetup.EmptyScene); | |
for (int i = 0; i < sceneCount; ++i) | |
{ | |
UnityEditor.SceneManagement.EditorSceneManager.CloseScene(scenes[i], true); | |
} | |
for (int i = 0; i < sceneCount; ++i) | |
{ | |
if (activeScenePath != scenePaths[i]) | |
{ | |
UnityEditor.SceneManagement.EditorSceneManager.OpenScene(scenePaths[i], UnityEditor.SceneManagement.OpenSceneMode.Additive); | |
} | |
} | |
var newActiveScene = UnityEditor.SceneManagement.EditorSceneManager.OpenScene(activeScenePath, UnityEditor.SceneManagement.OpenSceneMode.Additive); | |
UnityEditor.SceneManagement.EditorSceneManager.SetActiveScene(newActiveScene); | |
UnityEditor.SceneManagement.EditorSceneManager.CloseScene(newScene, true); | |
} | |
} | |
} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment