283 lines
11 KiB
C#

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using UnityEngine.Networking;
using System;
using System.IO;
using System.Collections;
using System.Reflection;
namespace lilToon
{
public static class lilStartup
{
[InitializeOnLoadMethod]
public static void lilStartupMethod()
{
//------------------------------------------------------------------------------------------------------------------------------
// Variables
lilToonInspector.ApplyEditorSettingTemp();
lilLanguageManager.InitializeLanguage();
AssetDatabase.importPackageStarted -= PackageVersionChecker;
AssetDatabase.importPackageStarted += PackageVersionChecker;
//------------------------------------------------------------------------------------------------------------------------------
// Create files
if(!File.Exists(lilDirectoryManager.startupTempPath))
{
File.Create(lilDirectoryManager.startupTempPath);
#if !SYSTEM_DRAWING
string editorPath = lilDirectoryManager.GetEditorPath();
// RSP
if(!File.Exists(lilDirectoryManager.rspPath))
{
StreamWriter sw = new StreamWriter(lilDirectoryManager.rspPath,true);
sw.Write("-r:System.Drawing.dll" + Environment.NewLine + "-define:SYSTEM_DRAWING");
sw.Close();
AssetDatabase.Refresh();
AssetDatabase.ImportAsset(editorPath);
}
StreamReader sr = new StreamReader(lilDirectoryManager.rspPath);
string s = sr.ReadToEnd();
sr.Close();
if(!s.Contains("r:System.Drawing.dll"))
{
StreamWriter sw = new StreamWriter(lilDirectoryManager.rspPath,true);
sw.Write(Environment.NewLine + "-r:System.Drawing.dll");
sw.Close();
AssetDatabase.Refresh();
AssetDatabase.ImportAsset(editorPath);
}
if(!s.Contains("define:SYSTEM_DRAWING"))
{
StreamWriter sw = new StreamWriter(lilDirectoryManager.rspPath,true);
sw.Write(Environment.NewLine + "-define:SYSTEM_DRAWING");
sw.Close();
AssetDatabase.Refresh();
AssetDatabase.ImportAsset(editorPath);
}
#endif
}
//------------------------------------------------------------------------------------------------------------------------------
// Shader setting
string currentRPPath = lilDirectoryManager.GetCurrentRPPath();
if(File.Exists(currentRPPath))
{
StreamReader srRP = new StreamReader(currentRPPath);
string shaderRP = srRP.ReadLine();
string shaderAPI = srRP.ReadLine();
srRP.Close();
bool shouldRewrite = false;
string projectRP = lilRenderPipelineReader.GetRP().ToString();
string projectAPI = SystemInfo.graphicsDeviceType.ToString();
StreamWriter swRP = new StreamWriter(currentRPPath,false);
swRP.WriteLine(projectRP);
swRP.WriteLine(projectAPI);
if(shaderRP != projectRP)
{
Debug.Log("[lilToon] Switch " + shaderRP + " to " + projectRP);
shouldRewrite = true;
}
if(shaderAPI != projectAPI)
{
Debug.Log("[lilToon] Switch " + shaderAPI + " to " + projectAPI);
shouldRewrite = true;
}
swRP.Close();
if(shouldRewrite)
{
lilToonSetting shaderSetting = null;
lilToonSetting.InitializeShaderSetting(ref shaderSetting);
if(shaderSetting.isDebugOptimize)
{
lilToonSetting.ApplyShaderSettingOptimized();
}
else
{
if(lilShaderAPI.IsTextureLimitedAPI())
{
lilToonSetting.TurnOffAllShaderSetting(ref shaderSetting);
lilToonSetting.CheckTextures(ref shaderSetting);
}
lilToonSetting.TurnOnAllShaderSetting(ref shaderSetting);
lilToonSetting.ApplyShaderSetting(shaderSetting);
}
}
}
//------------------------------------------------------------------------------------------------------------------------------
// Version check
if(!File.Exists(lilDirectoryManager.versionInfoTempPath))
{
CoroutineHandler.StartStaticCoroutine(GetLatestVersionInfo());
}
//------------------------------------------------------------------------------------------------------------------------------
// Migration
if(lilToonInspector.edSet.currentVersionValue < lilConstants.currentVersionValue)
{
MigrateMaterials();
lilToonInspector.edSet.currentVersionValue = lilConstants.currentVersionValue;
lilToonInspector.SaveEditorSettingTemp();
}
//------------------------------------------------------------------------------------------------------------------------------
// Turn on all settings when auto
if(File.Exists(lilDirectoryManager.postBuildTempPath))
{
EditorApplication.delayCall -= lilToonSetting.SetShaderSettingAfterBuild;
EditorApplication.delayCall += lilToonSetting.SetShaderSettingAfterBuild;
}
}
private static IEnumerator GetLatestVersionInfo()
{
using(UnityWebRequest webRequest = UnityWebRequest.Get(lilConstants.versionInfoURL))
{
yield return webRequest.SendWebRequest();
#if UNITY_2020_2_OR_NEWER
if(webRequest.result != UnityWebRequest.Result.ConnectionError)
#else
if(!webRequest.isNetworkError)
#endif
{
StreamWriter sw = new StreamWriter(lilDirectoryManager.versionInfoTempPath,false);
sw.Write(webRequest.downloadHandler.text);
sw.Close();
}
}
}
private static void MigrateMaterials()
{
foreach(string guid in AssetDatabase.FindAssets("t:material"))
{
Material material = AssetDatabase.LoadAssetAtPath<Material>(lilDirectoryManager.GUIDToPath(guid));
MigrateMaterial(material);
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
private static void MigrateMaterial(Material material)
{
if(!lilMaterialUtils.CheckShaderIslilToon(material)) return;
int version = 0;
if(material.HasProperty("_lilToonVersion")) version = (int)material.GetFloat("_lilToonVersion");
if(version >= lilConstants.currentVersionValue) return;
Debug.Log("[lilToon]Run migration: " + material.name);
material.SetFloat("_lilToonVersion", lilConstants.currentVersionValue);
// 1.2.7 -> 1.2.8
if(version < 21)
{
if(material.shader.name.Contains("_lil/lilToonMulti"))
{
int renderQueue = lilMaterialUtils.GetTrueRenderQueue(material);
material.shader = material.HasProperty("_UseOutline") && material.GetFloat("_UseOutline") != 0.0f ? Shader.Find("Hidden/lilToonMultiOutline") : Shader.Find("_lil/lilToonMulti");
material.renderQueue = renderQueue;
}
}
}
private static void PackageVersionChecker(string packageName)
{
int indexlil = packageName.IndexOf("lilToon_");
if(indexlil < 0) return;
string packageVerString = packageName.Substring(indexlil + 8);
int[] semPackage = ReadSemVer(packageVerString);
int[] semCurrent = ReadSemVer(lilConstants.currentVersionName);
if(semPackage == null || semCurrent == null) return;
if(
semPackage[0] < semCurrent[0] ||
semPackage[0] == semCurrent[0] && semPackage[1] < semCurrent[1] ||
semPackage[0] == semCurrent[0] && semPackage[1] == semCurrent[1] && semPackage[2] < semCurrent[2]
)
{
if(EditorUtility.DisplayDialog("lilToon", lilLanguageManager.GetLoc("sDialogImportOldVer"), lilLanguageManager.GetLoc("sYes"), lilLanguageManager.GetLoc("sNo"))) return;
CoroutineHandler.StartStaticCoroutine(ClosePackageImportWindow());
}
}
private static IEnumerator ClosePackageImportWindow()
{
var type = typeof(Editor).Assembly.GetType("UnityEditor.PackageImport");
var method = typeof(EditorWindow).GetMethod("HasOpenInstances", BindingFlags.Static | BindingFlags.Public);
if(method != null)
{
var genmethod = method.MakeGenericMethod(type);
while(!(bool)genmethod.Invoke(null,null))
{
yield return null;
}
EditorWindow.GetWindow(type).Close();
}
}
private static int[] ReadSemVer(string sem)
{
string[] parts = sem.Split('.');
if(parts.Length < 3) return null;
int major, minor, patch;
try
{
major = int.Parse(parts[0]);
minor = int.Parse(parts[1]);
patch = int.Parse(parts[2]);
}
catch
{
return null;
}
return new[]{major,minor,patch};
}
}
//------------------------------------------------------------------------------------------------------------------------------
// based on CoroutineHandler.cs
// https://github.com/Unity-Technologies/EndlessRunnerSampleGame/blob/master/Assets/Scripts/CoroutineHandler.cs
public class CoroutineHandler : MonoBehaviour
{
protected static CoroutineHandler m_Instance;
public static CoroutineHandler Instance
{
get
{
if(m_Instance == null)
{
GameObject o = new GameObject("CoroutineHandler")
{
hideFlags = HideFlags.HideAndDontSave
};
m_Instance = o.AddComponent<CoroutineHandler>();
}
return m_Instance;
}
}
public void OnDisable()
{
if(m_Instance) Destroy(m_Instance.gameObject);
}
public static Coroutine StartStaticCoroutine(IEnumerator coroutine)
{
return Instance.StartCoroutine(coroutine);
}
}
}
#endif