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);
}
}
}
}
}