Skip to content

Instantly share code, notes, and snippets.

@wotakuro
Last active January 21, 2022 07:39
Show Gist options
  • Save wotakuro/219ad9b2f5a23a3b709904ac0d5b1161 to your computer and use it in GitHub Desktop.
Save wotakuro/219ad9b2f5a23a3b709904ac0d5b1161 to your computer and use it in GitHub Desktop.
Shader.CreateGPUProgramをUnityEditorで常に呼び出されるようにしたい!!
// 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