1302 lines
40 KiB
C#
1302 lines
40 KiB
C#
|
|
// Cristian Pop - https://boxophobic.com/
|
||
|
|
|
||
|
|
using System.Globalization;
|
||
|
|
using System.IO;
|
||
|
|
using System.Linq;
|
||
|
|
#if UNITY_EDITOR
|
||
|
|
using UnityEditor;
|
||
|
|
#endif
|
||
|
|
using UnityEngine;
|
||
|
|
using UnityEngine.Rendering;
|
||
|
|
|
||
|
|
namespace Boxophobic.Utility
|
||
|
|
{
|
||
|
|
public static class BoxoUtils
|
||
|
|
{
|
||
|
|
public static ProjectData GetProjectData()
|
||
|
|
{
|
||
|
|
const string minimumVersionFor2021_3 = "2021.3.35";
|
||
|
|
const string minimumVersionFor2022_3 = "2022.3.18";
|
||
|
|
const string minimumVersionFor6000_0 = "6000.0.23";
|
||
|
|
const string minimumVersionFor6000_1 = "6000.1.0";
|
||
|
|
const string minimumVersionFor6000_2 = "6000.2.0";
|
||
|
|
const string minimumVersionFor6000_3 = "6000.3.0";
|
||
|
|
const string minimumVersionFor6000_4 = "6000.4.0";
|
||
|
|
|
||
|
|
var projectData = new ProjectData();
|
||
|
|
|
||
|
|
string pipeline = "Standard";
|
||
|
|
|
||
|
|
if (GraphicsSettings.defaultRenderPipeline != null)
|
||
|
|
{
|
||
|
|
if (GraphicsSettings.defaultRenderPipeline.GetType().ToString().Contains("Universal"))
|
||
|
|
{
|
||
|
|
pipeline = "Universal";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (GraphicsSettings.defaultRenderPipeline.GetType().ToString().Contains("HD"))
|
||
|
|
{
|
||
|
|
pipeline = "High Definition";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (QualitySettings.renderPipeline != null)
|
||
|
|
{
|
||
|
|
if (QualitySettings.renderPipeline.GetType().ToString().Contains("Universal"))
|
||
|
|
{
|
||
|
|
pipeline = "Universal";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (QualitySettings.renderPipeline.GetType().ToString().Contains("HD"))
|
||
|
|
{
|
||
|
|
pipeline = "High Definition";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
projectData.pipeline = pipeline;
|
||
|
|
|
||
|
|
var version = Application.unityVersion;
|
||
|
|
|
||
|
|
if (version.Contains("a") || version.Contains("b"))
|
||
|
|
{
|
||
|
|
projectData.isAlphaOrBetaRelease = true;
|
||
|
|
}
|
||
|
|
|
||
|
|
version = version.Replace("f", "x").Replace("a", "x").Replace("b", "x");
|
||
|
|
|
||
|
|
if (pipeline != "Standard")
|
||
|
|
{
|
||
|
|
var versionSplit = version.Split(".");
|
||
|
|
|
||
|
|
var version0 = int.Parse(versionSplit[0], CultureInfo.InvariantCulture);
|
||
|
|
var version1 = int.Parse(versionSplit[1], CultureInfo.InvariantCulture);
|
||
|
|
var version2Split = versionSplit[2].Split("x");
|
||
|
|
var version2 = int.Parse(version2Split[0], CultureInfo.InvariantCulture);
|
||
|
|
|
||
|
|
//if (version0 == 2021)
|
||
|
|
//{
|
||
|
|
// var minimumSplit = minimumVersionFor2021_3.Split(".");
|
||
|
|
// var minimum2 = int.Parse(minimumSplit[2], CultureInfo.InvariantCulture);
|
||
|
|
|
||
|
|
// if (version1 != 3)
|
||
|
|
// {
|
||
|
|
// projectData.isSupported = false;
|
||
|
|
// }
|
||
|
|
// else
|
||
|
|
// {
|
||
|
|
// if (version2 < minimum2)
|
||
|
|
// {
|
||
|
|
// projectData.isSupported = false;
|
||
|
|
// }
|
||
|
|
// }
|
||
|
|
|
||
|
|
// projectData.package = "2021.3+";
|
||
|
|
//}
|
||
|
|
|
||
|
|
if (version0 == 2022)
|
||
|
|
{
|
||
|
|
var minimumSplit = minimumVersionFor2022_3.Split(".");
|
||
|
|
var minimum2 = int.Parse(minimumSplit[2], CultureInfo.InvariantCulture);
|
||
|
|
|
||
|
|
if (version1 != 3)
|
||
|
|
{
|
||
|
|
projectData.isSupported = false;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if (version2 < minimum2)
|
||
|
|
{
|
||
|
|
projectData.isSupported = false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
projectData.package = "2022.3+";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version0 == 6000)
|
||
|
|
{
|
||
|
|
if (version1 == 0)
|
||
|
|
{
|
||
|
|
var minimumSplit = minimumVersionFor6000_0.Split(".");
|
||
|
|
var minimum2 = int.Parse(minimumSplit[2], CultureInfo.InvariantCulture);
|
||
|
|
|
||
|
|
if (version2 < minimum2)
|
||
|
|
{
|
||
|
|
projectData.isSupported = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
projectData.package = "6000.0+";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version1 == 1)
|
||
|
|
{
|
||
|
|
var minimumSplit = minimumVersionFor6000_1.Split(".");
|
||
|
|
var minimum2 = int.Parse(minimumSplit[2], CultureInfo.InvariantCulture);
|
||
|
|
|
||
|
|
if (version2 < minimum2)
|
||
|
|
{
|
||
|
|
projectData.isSupported = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
projectData.isTechRelease = true;
|
||
|
|
|
||
|
|
projectData.package = "6000.1+";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version1 == 2)
|
||
|
|
{
|
||
|
|
var minimumSplit = minimumVersionFor6000_2.Split(".");
|
||
|
|
var minimum2 = int.Parse(minimumSplit[2], CultureInfo.InvariantCulture);
|
||
|
|
|
||
|
|
if (version2 < minimum2)
|
||
|
|
{
|
||
|
|
projectData.isSupported = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
projectData.isTechRelease = true;
|
||
|
|
|
||
|
|
projectData.package = "6000.2+";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version1 == 3)
|
||
|
|
{
|
||
|
|
var minimumSplit = minimumVersionFor6000_2.Split(".");
|
||
|
|
var minimum2 = int.Parse(minimumSplit[2], CultureInfo.InvariantCulture);
|
||
|
|
|
||
|
|
if (version2 < minimum2)
|
||
|
|
{
|
||
|
|
projectData.isSupported = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
projectData.package = "6000.3+";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version1 == 4)
|
||
|
|
{
|
||
|
|
var minimumSplit = minimumVersionFor6000_2.Split(".");
|
||
|
|
var minimum2 = int.Parse(minimumSplit[2], CultureInfo.InvariantCulture);
|
||
|
|
|
||
|
|
if (version2 < minimum2)
|
||
|
|
{
|
||
|
|
projectData.isSupported = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
projectData.isTechRelease = true;
|
||
|
|
|
||
|
|
projectData.package = "6000.4+";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
var minimum = minimumVersionFor2021_3;
|
||
|
|
|
||
|
|
if (version0 == 2022)
|
||
|
|
{
|
||
|
|
minimum = minimumVersionFor2022_3;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version0 == 6000)
|
||
|
|
{
|
||
|
|
minimum = minimumVersionFor6000_0;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version0 == 6001)
|
||
|
|
{
|
||
|
|
minimum = minimumVersionFor6000_1;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version0 == 6002)
|
||
|
|
{
|
||
|
|
minimum = minimumVersionFor6000_2;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version0 == 6003)
|
||
|
|
{
|
||
|
|
minimum = minimumVersionFor6000_3;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (version0 == 6004)
|
||
|
|
{
|
||
|
|
minimum = minimumVersionFor6000_4;
|
||
|
|
}
|
||
|
|
|
||
|
|
projectData.minimum = minimum;
|
||
|
|
}
|
||
|
|
|
||
|
|
return projectData;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static string GetProjectPipeline()
|
||
|
|
{
|
||
|
|
string pipeline = "Standard";
|
||
|
|
|
||
|
|
if (GraphicsSettings.defaultRenderPipeline != null)
|
||
|
|
{
|
||
|
|
if (GraphicsSettings.defaultRenderPipeline.GetType().ToString().Contains("Universal"))
|
||
|
|
{
|
||
|
|
pipeline = "Universal";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (GraphicsSettings.defaultRenderPipeline.GetType().ToString().Contains("HD"))
|
||
|
|
{
|
||
|
|
pipeline = "High Definition";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (QualitySettings.renderPipeline != null)
|
||
|
|
{
|
||
|
|
if (QualitySettings.renderPipeline.GetType().ToString().Contains("Universal"))
|
||
|
|
{
|
||
|
|
pipeline = "Universal";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (QualitySettings.renderPipeline.GetType().ToString().Contains("HD"))
|
||
|
|
{
|
||
|
|
pipeline = "High Definition";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return pipeline;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Material Utils
|
||
|
|
public static void SetMaterialBool(Material material, string valueProp, string internalProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(valueProp))
|
||
|
|
{
|
||
|
|
var value = material.GetFloat(valueProp);
|
||
|
|
|
||
|
|
if (value > 0)
|
||
|
|
{
|
||
|
|
material.SetInt(internalProp, 1);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.SetInt(internalProp, 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialInt(Material material, string valueProp, string internalProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(valueProp))
|
||
|
|
{
|
||
|
|
material.SetInt(internalProp, material.GetInt(valueProp));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialFloat(Material material, string valueProp, string internalProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(valueProp))
|
||
|
|
{
|
||
|
|
material.SetFloat(internalProp, material.GetFloat(valueProp));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialVector(Material material, string valueProp, string internalProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(valueProp))
|
||
|
|
{
|
||
|
|
material.SetVector(internalProp, material.GetVector(valueProp));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialTexture(Material material, string valueProp, string internalProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(valueProp))
|
||
|
|
{
|
||
|
|
material.SetTexture(internalProp, material.GetTexture(valueProp));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialCoords(Material material, string modeProp, string valueProp, string internalProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(modeProp) && material.HasProperty(valueProp))
|
||
|
|
{
|
||
|
|
var mode = material.GetInt(modeProp);
|
||
|
|
var value = material.GetVector(valueProp);
|
||
|
|
|
||
|
|
if (mode == 0)
|
||
|
|
{
|
||
|
|
material.SetVector(internalProp, value);
|
||
|
|
}
|
||
|
|
else if (mode == 1)
|
||
|
|
{
|
||
|
|
material.SetVector(internalProp, new Vector4(1 / value.x, 1 / value.y, value.z, value.w));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialBounds(Material material, string modeProp, string valueProp, string internalProp)
|
||
|
|
{
|
||
|
|
var offset = 0.0f;
|
||
|
|
|
||
|
|
if (material.HasProperty(modeProp) && material.HasProperty(valueProp))
|
||
|
|
{
|
||
|
|
var mode = material.GetInt(modeProp);
|
||
|
|
|
||
|
|
if (mode == 1)
|
||
|
|
{
|
||
|
|
offset = 0.5f;
|
||
|
|
}
|
||
|
|
|
||
|
|
var value = material.GetVector(valueProp);
|
||
|
|
var scale = new Vector2(1 / value.z, 1 / value.w);
|
||
|
|
var pos = new Vector2(value.x * scale.x - offset, value.y * scale.y - offset) * -1;
|
||
|
|
|
||
|
|
material.SetVector(internalProp, new Vector4(scale.x, scale.y, pos.x, pos.y));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialOptions(Material material, string modeProp, string valueProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(modeProp))
|
||
|
|
{
|
||
|
|
var mode = material.GetInt(modeProp);
|
||
|
|
|
||
|
|
if (mode == 0)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(1, 0, 0, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 1)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(0, 1, 0, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 2)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(0, 0, 1, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 3)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(0, 0, 0, 1));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialOptions(Material material, string modeProp, string valuePropA, string valuePropB)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(modeProp))
|
||
|
|
{
|
||
|
|
var mode = material.GetInt(modeProp);
|
||
|
|
|
||
|
|
if (mode == 0)
|
||
|
|
{
|
||
|
|
material.SetVector(valuePropA, new Vector4(1, 0, 0, 0));
|
||
|
|
material.SetVector(valuePropB, Vector4.zero);
|
||
|
|
}
|
||
|
|
else if (mode == 1)
|
||
|
|
{
|
||
|
|
material.SetVector(valuePropA, new Vector4(0, 1, 0, 0));
|
||
|
|
material.SetVector(valuePropB, Vector4.zero);
|
||
|
|
}
|
||
|
|
else if (mode == 2)
|
||
|
|
{
|
||
|
|
material.SetVector(valuePropA, new Vector4(0, 0, 1, 0));
|
||
|
|
material.SetVector(valuePropB, Vector4.zero);
|
||
|
|
}
|
||
|
|
else if (mode == 3)
|
||
|
|
{
|
||
|
|
material.SetVector(valuePropA, new Vector4(0, 0, 0, 1));
|
||
|
|
material.SetVector(valuePropB, Vector4.zero);
|
||
|
|
}
|
||
|
|
else if (mode == 4)
|
||
|
|
{
|
||
|
|
material.SetVector(valuePropA, Vector4.zero);
|
||
|
|
material.SetVector(valuePropB, new Vector4(1, 0, 0, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 5)
|
||
|
|
{
|
||
|
|
material.SetVector(valuePropA, Vector4.zero);
|
||
|
|
material.SetVector(valuePropB, new Vector4(0, 1, 0, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 6)
|
||
|
|
{
|
||
|
|
material.SetVector(valuePropA, Vector4.zero);
|
||
|
|
material.SetVector(valuePropB, new Vector4(0, 0, 1, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 7)
|
||
|
|
{
|
||
|
|
material.SetVector(valuePropA, Vector4.zero);
|
||
|
|
material.SetVector(valuePropB, new Vector4(0, 0, 0, 1));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialBackface(Material material, string modeProp, string valueProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(modeProp))
|
||
|
|
{
|
||
|
|
// None 0 / Flip 1 / Mirror 2
|
||
|
|
var mode = material.GetInt(modeProp);
|
||
|
|
|
||
|
|
if (mode == 0)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(1, 1, 1, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 1)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(-1, -1, -1, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 2)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(1, 1, -1, 0));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialBackfaceLegacy(Material material, string modeProp, string valueProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(modeProp))
|
||
|
|
{
|
||
|
|
// Flip 0 / Mirror 1 / None 2
|
||
|
|
var mode = material.GetInt(modeProp);
|
||
|
|
|
||
|
|
if (mode == 0)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(-1, -1, -1, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 1)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(1, 1, -1, 0));
|
||
|
|
}
|
||
|
|
else if (mode == 2)
|
||
|
|
{
|
||
|
|
material.SetVector(valueProp, new Vector4(1, 1, 1, 0));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialReciprocal(Material material, string valueProp)
|
||
|
|
{
|
||
|
|
if (material.HasProperty(valueProp))
|
||
|
|
{
|
||
|
|
var value = material.GetVector(valueProp);
|
||
|
|
|
||
|
|
material.SetVector(valueProp, new Vector4(value.x, value.y, 1 / (value.y - value.x), value.w));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeyword(Material material, string keyword, bool enable)
|
||
|
|
{
|
||
|
|
if (enable)
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keyword);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keyword);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeyword(Material material, string property, string keyword)
|
||
|
|
{
|
||
|
|
if (material.HasFloat(property))
|
||
|
|
{
|
||
|
|
var mode = material.GetFloat(property);
|
||
|
|
|
||
|
|
if (mode == 0)
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keyword);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keyword);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeyword(Material material, string property, string[] keywords)
|
||
|
|
{
|
||
|
|
if (material.HasFloat(property))
|
||
|
|
{
|
||
|
|
var mode = material.GetFloat(property);
|
||
|
|
|
||
|
|
for (int i = 0; i < keywords.Length; i++)
|
||
|
|
{
|
||
|
|
if (i == mode)
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keywords[i]);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keywords[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeyword(Material material, string parent, string property, string keyword)
|
||
|
|
{
|
||
|
|
if (material.HasFloat(parent) && material.HasFloat(property))
|
||
|
|
{
|
||
|
|
var parentMode = material.GetFloat(parent);
|
||
|
|
|
||
|
|
if (parentMode > 0)
|
||
|
|
{
|
||
|
|
var propertyMode = material.GetFloat(property);
|
||
|
|
|
||
|
|
if (propertyMode == 0)
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keyword);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keyword);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keyword);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeyword(Material material, string parent, string property, string[] keywords)
|
||
|
|
{
|
||
|
|
if (material.HasFloat(parent) && material.HasFloat(property))
|
||
|
|
{
|
||
|
|
var parentMode = material.GetFloat(parent);
|
||
|
|
|
||
|
|
if (parentMode > 0)
|
||
|
|
{
|
||
|
|
var propertyMode = material.GetFloat(property);
|
||
|
|
|
||
|
|
for (int i = 0; i < keywords.Length; i++)
|
||
|
|
{
|
||
|
|
if (i == propertyMode)
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keywords[i]);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keywords[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
for (int i = 0; i < keywords.Length; i++)
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keywords[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeyword(Material material, bool allParentsOn, string[] parents, string property, string keyword)
|
||
|
|
{
|
||
|
|
bool parentsMode = false;
|
||
|
|
float propertyMode = 0;
|
||
|
|
|
||
|
|
if (allParentsOn)
|
||
|
|
{
|
||
|
|
int enableCount = 0;
|
||
|
|
|
||
|
|
for (int i = 0; i < parents.Length; i++)
|
||
|
|
{
|
||
|
|
var parent = parents[i];
|
||
|
|
|
||
|
|
if (material.HasProperty(parent))
|
||
|
|
{
|
||
|
|
if (material.GetFloat(parent) > 0)
|
||
|
|
{
|
||
|
|
enableCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (parents.Length == enableCount)
|
||
|
|
{
|
||
|
|
parentsMode = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
float enableFloat = 0;
|
||
|
|
|
||
|
|
for (int i = 0; i < parents.Length; i++)
|
||
|
|
{
|
||
|
|
var parent = parents[i];
|
||
|
|
|
||
|
|
if (material.HasProperty(parent))
|
||
|
|
{
|
||
|
|
enableFloat += material.GetFloat(parent);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (enableFloat > 0)
|
||
|
|
{
|
||
|
|
parentsMode = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (material.HasProperty(property))
|
||
|
|
{
|
||
|
|
propertyMode = material.GetFloat(property);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (parentsMode && propertyMode > 0)
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keyword);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keyword);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeyword(Material material, bool allParentsOn, string[] parents, string property, string[] keywords)
|
||
|
|
{
|
||
|
|
bool parentsMode = false;
|
||
|
|
|
||
|
|
if (allParentsOn)
|
||
|
|
{
|
||
|
|
int enableCount = 0;
|
||
|
|
|
||
|
|
for (int i = 0; i < parents.Length; i++)
|
||
|
|
{
|
||
|
|
var parent = parents[i];
|
||
|
|
|
||
|
|
if (material.HasProperty(parent))
|
||
|
|
{
|
||
|
|
if (material.GetFloat(parent) > 0)
|
||
|
|
{
|
||
|
|
enableCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (parents.Length == enableCount)
|
||
|
|
{
|
||
|
|
parentsMode = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
float enableFloat = 0;
|
||
|
|
|
||
|
|
for (int i = 0; i < parents.Length; i++)
|
||
|
|
{
|
||
|
|
var parent = parents[i];
|
||
|
|
|
||
|
|
if (material.HasProperty(parent))
|
||
|
|
{
|
||
|
|
enableFloat += material.GetFloat(parent);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (enableFloat > 0)
|
||
|
|
{
|
||
|
|
parentsMode = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (material.HasFloat(property))
|
||
|
|
{
|
||
|
|
if (parentsMode)
|
||
|
|
{
|
||
|
|
var propertyMode = material.GetInt(property);
|
||
|
|
|
||
|
|
for (int i = 0; i < keywords.Length; i++)
|
||
|
|
{
|
||
|
|
if (i == propertyMode)
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keywords[i]);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keywords[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
for (int i = 0; i < keywords.Length; i++)
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keywords[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeyword(Material material, bool allParentsOn, string[] properties, string keyword)
|
||
|
|
{
|
||
|
|
bool parentMode = false;
|
||
|
|
|
||
|
|
if (allParentsOn)
|
||
|
|
{
|
||
|
|
int enableCount = 0;
|
||
|
|
|
||
|
|
for (int i = 0; i < properties.Length; i++)
|
||
|
|
{
|
||
|
|
var property = properties[i];
|
||
|
|
|
||
|
|
if (material.HasProperty(property))
|
||
|
|
{
|
||
|
|
if (material.GetFloat(property) > 0)
|
||
|
|
{
|
||
|
|
enableCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (properties.Length == enableCount)
|
||
|
|
{
|
||
|
|
parentMode = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
float enableFloat = 0;
|
||
|
|
|
||
|
|
for (int i = 0; i < properties.Length; i++)
|
||
|
|
{
|
||
|
|
var property = properties[i];
|
||
|
|
|
||
|
|
if (material.HasProperty(property))
|
||
|
|
{
|
||
|
|
enableFloat += material.GetFloat(property);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (enableFloat > 0)
|
||
|
|
{
|
||
|
|
parentMode = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (parentMode)
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keyword);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keyword);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeywordInverted(Material material, string property, string keyword)
|
||
|
|
{
|
||
|
|
if (material.HasFloat(property))
|
||
|
|
{
|
||
|
|
var mode = material.GetFloat(property);
|
||
|
|
|
||
|
|
if (mode == 0)
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keyword);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keyword);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMaterialKeywordByTexture(Material material, string property, string keyword)
|
||
|
|
{
|
||
|
|
if (IsMaterialTextureUsed(material, property))
|
||
|
|
{
|
||
|
|
material.EnableKeyword(keyword);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
material.DisableKeyword(keyword);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static float GetMaterialFloat(Material material, string property, float defaultValue)
|
||
|
|
{
|
||
|
|
float value = defaultValue;
|
||
|
|
|
||
|
|
if (material.HasFloat(property))
|
||
|
|
{
|
||
|
|
value = material.GetFloat(property);
|
||
|
|
}
|
||
|
|
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static float GetMaterialFloat(Material material, string property)
|
||
|
|
{
|
||
|
|
return GetMaterialFloat(material, property, 0);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static int GetMaterialInt(Material material, string property, int defaultValue)
|
||
|
|
{
|
||
|
|
int value = defaultValue;
|
||
|
|
|
||
|
|
if (material.HasFloat(property))
|
||
|
|
{
|
||
|
|
value = material.GetInt(property);
|
||
|
|
}
|
||
|
|
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static int GetMaterialInt(Material material, string property)
|
||
|
|
{
|
||
|
|
return GetMaterialInt(material, property, 0);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static Texture GetMaterialTexture(Material material, string property)
|
||
|
|
{
|
||
|
|
Texture value = null;
|
||
|
|
|
||
|
|
if (material.HasTexture(property))
|
||
|
|
{
|
||
|
|
value = material.GetTexture(property);
|
||
|
|
}
|
||
|
|
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool IsMaterialTextureUsed(Material material, string property)
|
||
|
|
{
|
||
|
|
bool value = false;
|
||
|
|
|
||
|
|
if (material.HasTexture(property))
|
||
|
|
{
|
||
|
|
if (material.GetTexture(property) != null)
|
||
|
|
{
|
||
|
|
value = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Math Utils
|
||
|
|
public static float MathRemap(float value, float minOld, float maxOld, float minNew, float maxNew)
|
||
|
|
{
|
||
|
|
return minNew + (value - minOld) * (maxNew - minNew) / (maxOld - minOld);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static float MathRemap(float value, float minOld, float maxOld)
|
||
|
|
{
|
||
|
|
return (value - minOld) / (maxOld - minOld);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static float MathVector2ToFloat(float x, float y)
|
||
|
|
{
|
||
|
|
Vector2 output;
|
||
|
|
|
||
|
|
output.x = Mathf.Floor(x * (2048 - 1));
|
||
|
|
output.y = Mathf.Floor(y * (2048 - 1));
|
||
|
|
|
||
|
|
return (output.x * 2048) + output.y;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static Vector2 MathFloatFromVector2(float input)
|
||
|
|
{
|
||
|
|
Vector2 output;
|
||
|
|
|
||
|
|
output.y = input % 2048f;
|
||
|
|
output.x = Mathf.Floor(input / 2048f);
|
||
|
|
|
||
|
|
return output / (2048f - 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
#if UNITY_EDITOR
|
||
|
|
|
||
|
|
public static float GetMaterialSerializedFloat(Material material, string internalName, float defaultValue)
|
||
|
|
{
|
||
|
|
float value = defaultValue;
|
||
|
|
|
||
|
|
if (EditorUtility.IsPersistent(material))
|
||
|
|
{
|
||
|
|
var so = new SerializedObject(material);
|
||
|
|
var itr = so.GetIterator();
|
||
|
|
|
||
|
|
while (itr.Next(true))
|
||
|
|
{
|
||
|
|
if (itr.displayName == internalName)
|
||
|
|
{
|
||
|
|
if (itr.hasChildren)
|
||
|
|
{
|
||
|
|
var itrC = itr.Copy();
|
||
|
|
itrC.Next(true); //Walk into child ("First")
|
||
|
|
itrC.Next(false); //Walk into sibling ("Second")
|
||
|
|
|
||
|
|
value = itrC.floatValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static Vector4 GetMaterialSerializedVector(Material material, string internalName, Vector4 defaultValue)
|
||
|
|
{
|
||
|
|
Vector4 value = defaultValue;
|
||
|
|
|
||
|
|
if (EditorUtility.IsPersistent(material))
|
||
|
|
{
|
||
|
|
var so = new SerializedObject(material);
|
||
|
|
var itr = so.GetIterator();
|
||
|
|
|
||
|
|
while (itr.Next(true))
|
||
|
|
{
|
||
|
|
if (itr.displayName == internalName)
|
||
|
|
{
|
||
|
|
if (itr.hasChildren)
|
||
|
|
{
|
||
|
|
var itrC = itr.Copy();
|
||
|
|
itrC.Next(true); //Walk into child ("First")
|
||
|
|
itrC.Next(false); //Walk into sibling ("Second")
|
||
|
|
|
||
|
|
value = itrC.colorValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static Vector4 GetMaterialSerializedVector(Material material, string internalNameMin, string internalNameMax, Vector4 defaultValue)
|
||
|
|
{
|
||
|
|
Vector4 value = defaultValue;
|
||
|
|
|
||
|
|
value.x = GetMaterialSerializedFloat(material, internalNameMin, 0);
|
||
|
|
value.y = GetMaterialSerializedFloat(material, internalNameMax, 1);
|
||
|
|
|
||
|
|
if (value.x > value.y)
|
||
|
|
{
|
||
|
|
value.w = 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static Texture2D GetMaterialSerializedTexture(Material material, string internalName, Texture2D defaultValue)
|
||
|
|
{
|
||
|
|
Texture2D value = defaultValue;
|
||
|
|
|
||
|
|
if (EditorUtility.IsPersistent(material))
|
||
|
|
{
|
||
|
|
var so = new SerializedObject(material);
|
||
|
|
var itr = so.GetIterator();
|
||
|
|
|
||
|
|
while (itr.Next(true))
|
||
|
|
{
|
||
|
|
if (itr.displayName == internalName)
|
||
|
|
{
|
||
|
|
if (itr.hasChildren)
|
||
|
|
{
|
||
|
|
var itrC = itr.Copy();
|
||
|
|
itrC.Next(true); //Walk into child ("First")
|
||
|
|
itrC.Next(false); //Walk into sibling ("Second")
|
||
|
|
|
||
|
|
if (itrC.hasChildren)
|
||
|
|
{
|
||
|
|
var itrT = itrC.Copy();
|
||
|
|
itrT.Next(true); //Walk into child ("First")
|
||
|
|
value = (Texture2D)itrT.objectReferenceValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool IsShaderGUIPropertyHidden(MaterialProperty property)
|
||
|
|
{
|
||
|
|
#if UNITY_6000_2_OR_NEWER
|
||
|
|
if (property.propertyFlags == UnityEngine.Rendering.ShaderPropertyFlags.HideInInspector)
|
||
|
|
#else
|
||
|
|
if (property.flags == MaterialProperty.PropFlags.HideInInspector)
|
||
|
|
#endif
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool IsShaderGUIPropertyTexture(MaterialProperty property)
|
||
|
|
{
|
||
|
|
#if UNITY_6000_2_OR_NEWER
|
||
|
|
if (property.propertyType == UnityEngine.Rendering.ShaderPropertyType.Texture)
|
||
|
|
#else
|
||
|
|
if (property.type == MaterialProperty.PropType.Texture)
|
||
|
|
#endif
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool IsShaderGUIPropertyFloat(MaterialProperty property)
|
||
|
|
{
|
||
|
|
#if UNITY_6000_2_OR_NEWER
|
||
|
|
if (property.propertyType == UnityEngine.Rendering.ShaderPropertyType.Float || property.propertyType == UnityEngine.Rendering.ShaderPropertyType.Int || property.propertyType == UnityEngine.Rendering.ShaderPropertyType.Range)
|
||
|
|
#else
|
||
|
|
if (property.type == MaterialProperty.PropType.Float || property.type == MaterialProperty.PropType.Int || property.type == MaterialProperty.PropType.Range)
|
||
|
|
#endif
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool IsShaderGUIPropertyVector(MaterialProperty property)
|
||
|
|
{
|
||
|
|
#if UNITY_6000_2_OR_NEWER
|
||
|
|
if (property.propertyType == UnityEngine.Rendering.ShaderPropertyType.Vector || property.propertyType == UnityEngine.Rendering.ShaderPropertyType.Color)
|
||
|
|
#else
|
||
|
|
if (property.type == MaterialProperty.PropType.Vector || property.type == MaterialProperty.PropType.Color)
|
||
|
|
#endif
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static int GetShaderPropertyCount(Shader shader)
|
||
|
|
{
|
||
|
|
#if UNITY_6000_2_OR_NEWER
|
||
|
|
return shader.GetPropertyCount();
|
||
|
|
#else
|
||
|
|
return ShaderUtil.GetPropertyCount(shader);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
public static string GetShaderPropertyName(Shader shader, int index)
|
||
|
|
{
|
||
|
|
#if UNITY_6000_2_OR_NEWER
|
||
|
|
return shader.GetPropertyName(index);
|
||
|
|
#else
|
||
|
|
return ShaderUtil.GetPropertyName(shader, index);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ShaderPropertyType GetShaderPropertyType(Shader shader, int index)
|
||
|
|
{
|
||
|
|
#if UNITY_6000_2_OR_NEWER
|
||
|
|
return shader.GetPropertyType(index);
|
||
|
|
#else
|
||
|
|
return (ShaderPropertyType)ShaderUtil.GetPropertyType(shader, index);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public static string GetAssetFolder(string searchFile, string defaultPath)
|
||
|
|
{
|
||
|
|
|
||
|
|
var folder = FindAsset(searchFile);
|
||
|
|
folder = folder.Replace("/" + searchFile, "");
|
||
|
|
|
||
|
|
if (folder == "")
|
||
|
|
{
|
||
|
|
folder = defaultPath;
|
||
|
|
}
|
||
|
|
|
||
|
|
return folder;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static string GetUserFolder()
|
||
|
|
{
|
||
|
|
if (!Directory.Exists(BoxoGlobals.userFolder))
|
||
|
|
{
|
||
|
|
string[] guids = AssetDatabase.FindAssets("t:DefaultAsset " + "BOXOPHOBIC+");
|
||
|
|
|
||
|
|
foreach (string guid in guids)
|
||
|
|
{
|
||
|
|
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||
|
|
|
||
|
|
if (AssetDatabase.IsValidFolder(path) && Path.GetFileName(path) == "BOXOPHOBIC+")
|
||
|
|
{
|
||
|
|
BoxoGlobals.userFolder = path;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return BoxoGlobals.userFolder;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static string[] FindAssets(string filter, bool sort)
|
||
|
|
{
|
||
|
|
var assetPaths = AssetDatabase.FindAssets("glob:\"" + filter + "\"");
|
||
|
|
|
||
|
|
if (sort)
|
||
|
|
{
|
||
|
|
assetPaths = assetPaths.OrderBy(f => new FileInfo(f).Name).ToArray();
|
||
|
|
}
|
||
|
|
|
||
|
|
for (int i = 0; i < assetPaths.Length; i++)
|
||
|
|
{
|
||
|
|
assetPaths[i] = AssetDatabase.GUIDToAssetPath(assetPaths[i]);
|
||
|
|
}
|
||
|
|
|
||
|
|
return assetPaths;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static string FindAsset(string filter)
|
||
|
|
{
|
||
|
|
var assetPath = "";
|
||
|
|
|
||
|
|
var assetGUIDs = AssetDatabase.FindAssets("glob:\"" + filter + "\"");
|
||
|
|
|
||
|
|
if (assetGUIDs != null && assetGUIDs.Length > 0)
|
||
|
|
{
|
||
|
|
assetPath = AssetDatabase.GUIDToAssetPath(assetGUIDs[0]);
|
||
|
|
}
|
||
|
|
|
||
|
|
return assetPath;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetDefineSymbol(string symbol)
|
||
|
|
{
|
||
|
|
#if UNITY_2023_1_OR_NEWER
|
||
|
|
BuildTarget buildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||
|
|
BuildTargetGroup targetGroup = BuildPipeline.GetBuildTargetGroup(buildTarget);
|
||
|
|
var namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(targetGroup);
|
||
|
|
var defineSymbols = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget);
|
||
|
|
#else
|
||
|
|
var defineSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
if (!defineSymbols.Contains(symbol))
|
||
|
|
{
|
||
|
|
defineSymbols += ";" + symbol + ";";
|
||
|
|
|
||
|
|
#if UNITY_2023_1_OR_NEWER
|
||
|
|
PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, defineSymbols);
|
||
|
|
#else
|
||
|
|
PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, defineSymbols);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetDefineSymbol(string symbol, string version)
|
||
|
|
{
|
||
|
|
#if UNITY_2023_1_OR_NEWER
|
||
|
|
BuildTarget buildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||
|
|
BuildTargetGroup targetGroup = BuildPipeline.GetBuildTargetGroup(buildTarget);
|
||
|
|
var namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(targetGroup);
|
||
|
|
var defineSymbols = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget);
|
||
|
|
#else
|
||
|
|
var defineSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
var defineSymbolsSplit = defineSymbols.Split(";");
|
||
|
|
|
||
|
|
var newDefineSymbols = "";
|
||
|
|
|
||
|
|
var versionFormat = symbol + "_V";
|
||
|
|
var versionSymbol = symbol + "_V" + version;
|
||
|
|
|
||
|
|
for (int i = 0; i < defineSymbolsSplit.Length; i++)
|
||
|
|
{
|
||
|
|
var define = defineSymbolsSplit[i];
|
||
|
|
|
||
|
|
if (define.Contains(versionFormat))
|
||
|
|
{
|
||
|
|
defineSymbolsSplit[i] = versionSymbol;
|
||
|
|
}
|
||
|
|
|
||
|
|
newDefineSymbols = newDefineSymbols + defineSymbolsSplit[i] + ";";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!newDefineSymbols.Contains(symbol))
|
||
|
|
{
|
||
|
|
newDefineSymbols = newDefineSymbols + symbol + ";";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!newDefineSymbols.Contains(versionFormat))
|
||
|
|
{
|
||
|
|
newDefineSymbols = newDefineSymbols + versionSymbol + ";";
|
||
|
|
}
|
||
|
|
|
||
|
|
#if UNITY_2023_1_OR_NEWER
|
||
|
|
PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, newDefineSymbols);
|
||
|
|
#else
|
||
|
|
PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, newDefineSymbols);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool HasDefineSymbol(string symbol)
|
||
|
|
{
|
||
|
|
bool hasSymbol = false;
|
||
|
|
|
||
|
|
#if UNITY_2023_1_OR_NEWER
|
||
|
|
BuildTarget buildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||
|
|
BuildTargetGroup targetGroup = BuildPipeline.GetBuildTargetGroup(buildTarget);
|
||
|
|
var namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(targetGroup);
|
||
|
|
var defineSymbols = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget);
|
||
|
|
#else
|
||
|
|
var defineSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
if (defineSymbols.Contains(symbol))
|
||
|
|
{
|
||
|
|
hasSymbol = true;
|
||
|
|
}
|
||
|
|
|
||
|
|
return hasSymbol;
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
//Misc Utils
|
||
|
|
public static void DestryObject(UnityEngine.Object objectToDestory)
|
||
|
|
{
|
||
|
|
#if UNITY_EDITOR
|
||
|
|
if (Application.isPlaying)
|
||
|
|
{
|
||
|
|
UnityEngine.Object.Destroy(objectToDestory);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
UnityEngine.Object.DestroyImmediate(objectToDestory);
|
||
|
|
}
|
||
|
|
#else
|
||
|
|
UnityEngine.Object.Destroy(objectToDestory);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void DisableServerExecution()
|
||
|
|
{
|
||
|
|
#if UNITY_SERVER
|
||
|
|
return;
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
public class BoxoGlobals
|
||
|
|
{
|
||
|
|
public static string userFolder = "Assets/BOXOPHOBIC+";
|
||
|
|
}
|
||
|
|
|
||
|
|
[System.Serializable]
|
||
|
|
public class ProjectData
|
||
|
|
{
|
||
|
|
public string pipeline = "";
|
||
|
|
public string minimum = "";
|
||
|
|
public string package = "";
|
||
|
|
public bool isSupported = true;
|
||
|
|
public bool isTechRelease = false;
|
||
|
|
public bool isAlphaOrBetaRelease = false;
|
||
|
|
|
||
|
|
public ProjectData()
|
||
|
|
{
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|