https://qiita.com/TestUser2021/questions/def62cf06f1da5d12a1a
#If VBA7 Then
openFile.nMaxFile = LenB(openFile.lpstrFile) - 1 openFile.lStructSize = LenB(openFile)
#Else
openFile.nMaxFile = Len(openFile.lpstrFile) - 1 openFile.lStructSize = Len(openFile)
#End If
https://stackoverflow.com/questions/4982680/getopenfilename-fails-in-64-bit-but-works-in-32bit
using UnityEngine;
using UnityEditor;
using System;
using System.IO;
public class SelectOARShader2 : UnityEditor.AssetPostprocessor
{
private static string GeneralShader; private static string TreeShader; private static string EarthShader; private static string SpecularShader; private static string GlowShader; private static string BrightShader; private static string TransShader; // Alpha Blending private static string TransCutShader; // Alpha Cutoff private static string TransCutSoftShader; // Alpha Blending + Cutoff private static string TransSpecShader; // Alpha Blending + Specular private static string TransCutSpecShader; // Alpha Cutoff + Specular
private static float colorRed = 0.0f; private static float colorGreen = 0.0f; private static float colorBlue = 0.0f; private static float transparent = 1.0f; // private static float cutoff = 0.0f; private static float shininess = 0.0f; private static float glow = 0.0f; private static float bright = 0.0f; private static float light = 0.0f; private static int alphaMode = 0; // 0: NONE, 1: BLENDING, 2: MASKING, 3: EMISSIVE private static bool hasAlpha = false; // private static float shiftU = 0.0f; // private static float shiftV = 0.0f; // private static float scaleU = 1.0f; // private static float scaleV = 1.0f; // private static float rotate = 0.0f; private static char kind = 'O'; // O: Object, T: Tree, G: Grass, E: Earth
private const string HDRP_Shader = "HDRP/Lit"; private const string URP_Shader = "Universal Render Pipeline/Simple Lit"; private const string BINP_Shader = "Legacy Shaders/Diffuse"; private const string NONE_Shader = "NONE";
private const string PhantomFolder = "Phantoms";
public enum ShaderMode { Opaque, Cutout, Fade, Transparent, }
void OnPreprocessModel() { string currentFolder = Path.GetDirectoryName(assetPath); ModelImporter modelImporter = assetImporter as ModelImporter;
modelImporter.materialImportMode = ModelImporterMaterialImportMode.ImportStandard; //modelImporter.materialLocation = ModelImporterMaterialLocation.External;
modelImporter.addCollider = true; if (currentFolder.EndsWith("/" + PhantomFolder) || currentFolder.EndsWith("\\" + PhantomFolder)) { modelImporter.addCollider = false; } }
static void InitialShader() { string _generalShader = HDRP_Shader; Shader shdr = Shader.Find(_generalShader); if (shdr == null) { _generalShader = URP_Shader; shdr = Shader.Find(_generalShader); } if (shdr == null) { _generalShader = BINP_Shader; shdr = Shader.Find(_generalShader); } if (shdr == null) { GeneralShader = NONE_Shader; } else { GeneralShader = _generalShader; }
// if (GeneralShader == HDRP_Shader) { TreeShader = "Unlit/Transparent"; EarthShader = "HDRP/Lit"; SpecularShader = "HDRP/Lit"; //GlowShader = "HDRP/Lit"; //BrightShader = "HDRP/Lit"; TransShader = "Unlit/Transparent"; // Alpha Blending //TransCutShader = "Unlit/Transparent"; // Alpha Cutoff //TransCutSoftShader= "Unlit/Transparent"; // Alpha Blending + Cutoff //TransSpecShader = "Unlit/Transparent"; // Alpha Blending + Specular //TransCutSpecShader= "Unlit/Transparent"; // Alpha Cutoff + Specular } else if (GeneralShader == URP_Shader) { TreeShader = "Unlit/Transparent"; EarthShader = "Universal Render Pipeline/Simple Lit"; SpecularShader = "Universal Render Pipeline/Simple Lit"; //GlowShader = "Universal Render Pipeline/Simple Lit"; //BrightShader = "Universal Render Pipeline/Simple Lit"; TransShader = "Unlit/Transparent"; // Alpha Blending //TransCutShader = "Unlit/Transparent"; // Alpha Cutoff //TransCutSoftShader= "Unlit/Transparent"; // Alpha Blending + Cutoff //TransSpecShader = "Unlit/Transparent"; // Alpha Blending + Specular //TransCutSpecShader= "Unlit/Transparent"; // Alpha Cutoff + Specular } else if (GeneralShader == BINP_Shader) { TreeShader = "Legacy Shaders/Transparent/Cutout/Soft Edge Unlit"; EarthShader = "Standard"; SpecularShader = "Standard"; GlowShader = "Standard"; BrightShader = "Legacy Shaders/Self-Illumin/Specular"; TransShader = "Legacy Shaders/Transparent/Diffuse"; // Alpha Blending TransCutShader = "Legacy Shaders/Transparent/Cutout/Diffuse"; // Alpha Cutoff TransCutSoftShader = "Legacy Shaders/Transparent/Cutout/Soft Edge Unlit"; // Alpha Blending + Cutoff TransSpecShader = "Legacy Shaders/Transparent/Specular"; // Alpha Blending + Specular TransCutSpecShader = "Legacy Shaders/Transparent/Cutout/Specular"; // Alpha Cutoff + Specular }
//Debug.Log("General Shadr = " + GeneralShader); return; }
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths, bool didDomainReload) { InitialShader(); if (GeneralShader == NONE_Shader) return; // foreach (string asset in importedAssets) { UnityEngine.Object[] objects = null; if (!typeof(SceneAsset).Equals(AssetDatabase.GetMainAssetTypeAtPath(asset))) { objects = AssetDatabase.LoadAllAssetsAtPath(asset); } // if (objects!=null) { foreach (UnityEngine.Object obj in objects) { Material material = obj as Material; if (material != null) { if (material.name.StartsWith("MATERIAL_")) { // if (GeneralShader == HDRP_Shader) { SetMaterialShader_HDRP(material); } else if (GeneralShader == URP_Shader) { SetMaterialShader_URP(material); } else { SetMaterialShader_BRP(material); } // EditorUtility.SetDirty(material); AssetDatabase.SaveAssetIfDirty(obj); } } } } } AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); }
static void SetMaterialShader_HDRP(Material material) { string materialName = material.name; getParamsFromMaterialName(materialName);
// Shader の選択 開始 material.shader = Shader.Find(GeneralShader); if (material.HasProperty("_Smoothness")) material.SetFloat("_Smoothness", 0.0f); // 反射を止める
if (kind == 'T' || kind == 'G') { // Tree or Grass material.shader = Shader.Find(TreeShader); } else if (kind == 'E') { // Terrain material.shader = Shader.Find(EarthShader); } // Alpha Channell else if (hasAlpha) { material.shader = Shader.Find(TransShader); if (cutoff>0.0f) { if (material.HasProperty("_AlphaCutoffEnable")) material.SetFloat("_AlphaCutoffEnable", 1.0f); if (material.HasProperty("_AlphaCutoff")) material.SetFloat("_AlphaCutoff", cutoff); } } // Shininess else if (shininess > 0.01f) { material.shader = Shader.Find(SpecularShader); } // Shader の選択終わり
// Color if (material.HasProperty("_BaseColor")) { material.SetColor("_BaseColor", new Color(colorRed, colorGreen, colorBlue, transparent)); } else { material.SetColor("_Color", new Color(colorRed, colorGreen, colorBlue, transparent)); }
// Shininess if (shininess > 0.01f) { if (material.HasProperty("_Smoothness")) material.SetFloat("_Smoothness", 0.5f); if (material.HasProperty("_Metallic")) material.SetFloat("_Metallic", shininess * 3.0f); }
/* if (material.HasProperty("_EmissiveColor")) { //material.EnableKeyword("_EmissiveIntensity"); Color col = material.GetColor("_Color"); float fac = col.maxColorComponent; if (fac > 0.01f) { if (glow > 0.99f) glow = 0.99f; col = col * (glow / fac); } material.SetColor("_EmissiveColor", col); material.SetFloat("_EmissiveIntensity", 1.0f); }*/
return; }
static void SetMaterialShader_URP(Material material) { string materialName = material.name; getParamsFromMaterialName(materialName);
// Shader の選択 開始 material.shader = Shader.Find(GeneralShader);
if (kind == 'T' || kind == 'G') { // Tree or Grass material.shader = Shader.Find(TreeShader); } else if (kind == 'E') { // Terrain material.shader = Shader.Find(EarthShader); } // Alpha Channell else if (hasAlpha) { material.shader = Shader.Find(TransShader); if (cutoff > 0.0f) { if (material.HasProperty("_AlphaCutoffEnable")) material.SetFloat("_AlphaCutoffEnable", 1.0f); if (material.HasProperty("_AlphaCutoff")) material.SetFloat("_AlphaCutoff", cutoff); } } // Shininess else if (shininess > 0.01f) { material.shader = Shader.Find(SpecularShader); } // Shader の選択終わり
// // Color if (material.HasProperty("_BaseColor")) { material.SetColor("_BaseColor", new Color(colorRed, colorGreen, colorBlue, transparent)); } else { material.SetColor("_Color", new Color(colorRed, colorGreen, colorBlue, transparent)); }
// Shininess if (shininess > 0.01f) { if (material.HasProperty("_Metallic")) material.SetFloat("_Metallic", shininess * 3.0f); } return; }
static void SetMaterialShader_BRP(Material material) { string materialName = material.name; getParamsFromMaterialName(materialName);
//material.shader = Shader.Find(GeneralShader); material.shader = Shader.Find("Standard"); material.SetOverrideTag("RenderType", "Tree or Grass"); material.SetFloat("_Mode", (float)ShaderMode.Cutout); if (material.HasProperty("_Cutoff")) material.SetFloat("_Cutoff", 0.01f); return; if (kind == 'T' || kind == 'G') { // Tree or Grass material.SetOverrideTag("RenderType", "Tree or Grass"); material.SetFloat("_Mode", (float)ShaderMode.Cutout); if (material.HasProperty("_Cutoff")) material.SetFloat("_Cutoff", 0.01f); return; }
if (kind == 'E') { // Terrain //material.shader = Shader.Find(EarthShader); material.SetOverrideTag("RenderType", "Terrain"); material.SetFloat("_Mode", (float)ShaderMode.Opaque); if (material.HasProperty("_Metallic")) material.SetFloat("_Metallic", 0.0f); if (material.HasProperty("_SpecularHighlights")) material.SetFloat("_SpecularHighlights", 0.0f); return; } // if (hasAlpha) { if (shininess > 0.01f) { if (cutoff > 0.01f) { // Alpha Cutoff //material.shader = Shader.Find(TransCutSpecShader); material.SetFloat("_Mode", (float)ShaderMode.Cutout); if (material.HasProperty("_Cutoff")) material.SetFloat("_Cutoff", cutoff); if (material.HasProperty("_SpecularHighlights")) material.SetFloat("_SpecularHighlights", shininess); } else { // Alpha Blending if (!hasAlpha) { material.SetFloat("_Mode", (float)ShaderMode.Cutout); //material.shader = Shader.Find(TransCutSpecShader); if (material.HasProperty("_Cutoff")) material.SetFloat("_Cutoff", 0.2f); } else { //material.shader = Shader.Find(TransSpecShader); } } if (material.HasProperty("_Shininess")) material.SetFloat("_Shininess", 1.0f - shininess); } // else { if (cutoff > 0.01f) { // Alpha Cutoff material.shader = Shader.Find(TransCutShader); if (material.HasProperty("_Cutoff")) material.SetFloat("_Cutoff", cutoff); } else { // Alpha Blending if (!hasAlpha) { material.shader = Shader.Find(TransCutSoftShader); if (material.HasProperty("_Cutoff")) material.SetFloat("_Cutoff", 0.9f); } else { material.shader = Shader.Find(TransShader); } } } } // if (transparent < 0.99f) { material.SetFloat("_Mode", (float)ShaderMode.Cutout); material.shader = Shader.Find(TransShader); if (material.HasProperty("_Cutoff")) material.SetFloat("_Cutoff", cutoff); } // else if (glow > 0.02f) { material.EnableKeyword("_EMISSION"); material.shader = Shader.Find(GlowShader); if (material.HasProperty("_EmissionColor")) { Color col = material.GetColor("_Color"); float fac = col.maxColorComponent; if (fac > 0.01f) { if (glow > 0.99f) glow = 0.99f; col = col * (glow / fac); } material.SetColor("_EmissionColor", col); } if (material.HasProperty("_Glossiness")) material.SetFloat("_Glossiness", shininess); } // else if (bright > 0.01f) { material.shader = Shader.Find(BrightShader); if (material.HasProperty("_Shininess")) material.SetFloat("_Shininess", 1.0f - shininess); } // else if (shininess > 0.01f) { material.shader = Shader.Find(SpecularShader); if (material.HasProperty("_Metallic")) material.SetFloat("_Metallic", shininess / 2.0f); if (material.HasProperty("_Glossiness")) material.SetFloat("_Glossiness", 0.5f + shininess / 2.0f); }
// Color if (material.HasProperty("_BaseColor")) { material.SetColor("_BaseColor", new Color(colorRed, colorGreen, colorBlue, transparent)); } else { material.SetColor("_Color", new Color(colorRed, colorGreen, colorBlue, transparent)); } return; }
private static void getParamsFromMaterialName(string name) { int atr_len = 32; // MTRL_ATTR_LEN /3*4 (36/3*4 = 32) // if (name.Length >= atr_len) { string sub = name.Substring(name.Length - atr_len, atr_len); string enc = sub.Replace('-', '/'); enc = enc.Replace('$', '/'); // for old version // if (enc.Length == atr_len) { try { byte[] dec = Convert.FromBase64String(enc); // MTRL_ATTR_LEN (32/4*3 = 24) colorRed = 1.0f - (float)dec[0] / 255.0f; colorGreen = 1.0f - (float)dec[1] / 255.0f; colorBlue = 1.0f - (float)dec[2] / 255.0f; transparent = 1.0f - (float)dec[3] / 255.0f; cutoff = (float)dec[4] / 255.0f; shininess = (float)dec[5] / 255.0f; glow = (float)dec[6] / 255.0f; bright = (float)dec[7] / 255.0f; light = (float)dec[8] / 255.0f; alphaMode = (int)dec[9]/10; // 0: NONE, 1: BLENDING, 2: MASKING, 3: EMISSIVE int has_alp = (int)dec[9]%10; // 0: No, 1: YES /* short[] tmp = new short[1]; Buffer.BlockCopy(dec, 13, tmp, 0, 2); shiftU = (float)tmp[0] / 2000.0f; Buffer.BlockCopy(dec, 15, tmp, 0, 2); shiftV = (float)tmp[0] / 2000.0f; Buffer.BlockCopy(dec, 17, tmp, 0, 2); scaleU = (float)tmp[0] / 100.0f; Buffer.BlockCopy(dec, 19, tmp, 0, 2); scaleV = (float)tmp[0] / 100.0f; Buffer.BlockCopy(dec, 21, tmp, 0, 2); rotate = (float)tmp[0] / 2000.0f; */ kind = (char)dec[23]; if (cutoff > 0.9f) cutoff = 0.9f; if (has_alp == 1) hasAlpha = true; else hasAlpha = false; } catch { UnityEngine.Debug.Log("SelectOARShader: Base64 Decode Error = " + enc); } } } }
}